Как я писал свой первый скрипт на делфи для УО.

флуд, оффтопик и т.д.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Как я писал свой первый скрипт на делфи для УО.

Post by drabadan »

Все началось с того, что вышел новый стелс, спасибо девелоперам за это! Появился новый функционал с таргетами о котором давно мечталось и хотелось, но какая радость без беды... Перестал работать ГУИ, а его так хочется.

Вообщем подумалось - решилось попытать счастья во внешних скриптах для стелса. Посоветовавшись с Vizit0rom, пришел к выводу, что лучше пытать счастья в Delphi. Скачал среду разработки - Embarcadero RAD Studio XE4 и принялся заниматься любимым делом - ходить по полям граблей!
Иногда жутко бегать по ним, но чаще ходить. Шишек тьма, но - "Все, что нас не убивает - делает нас крепче.". В целом, массу приятных эмоций и впечатлений.

Далее - пошаговая инструкция, что я делал, за вычетом, конечно, ошибок.

Шаг 1:
Выбираем себе среду разработки. Я скачал - Ссылка на рутрекер.
Устанавливаем по инструкции.

Шаг 2:
Установилась среда - пишем первый "Hello World"...
Для приготовления данного дела нам понадобятся следующие файлы:
- stealth_script.pas - он есть в папке стелса.
- Script.dll - он есть в папке стелса.

Шаг 3:
Открываем XE4 и создаем новый проект. File -> New -> VCL Forms Application. Если кому надо тут поподробней и они "записувают" - пишите в коменты, объясним и разъясним! Тут же сразу как "создалось" советую вам его сразу же сохранить.

Дальше начинается магия!

Image
Откроется окошко в котором нужно выбрать файл stealth_script.pas и в разделе Uses нашего Unit1 дописать строку stealth_script;

Для того, чтобы открыть редактор исходного кода нужно нажать на кнопочку:
Image

Выглядеть после нашего редактирования это должно, примерно, так:

Code: Select all

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, stealth_script;

...
Шаг 4:
Пишем хеллоу ворлд...
Платформа у нас подготовлена, теперь непосредственно экшн.
Хеллоу ворлд мы будем писать по следующей схеме - на "форме" будет "кнопка" нажатием на которую будет выполняться команда - ClientPrint('Hello world!');

Итак, форма у нас создана вместе с проектом.

Из шага 3 мы выяснили как переключаться между редактором исходного кода и визуальным представление формы. Сейчас нам необходимо вернутся опять к визуальному представлению, нажимаем на ту кнопку с закругленными стрелочками.
У нас перед глазами должен быть монитор а в нем визуальное представление нашей формы.

С правой стороны, примерно посередине - у нас должен быть Tool palette а в нем поле Search - в этом поле пишем TButton автопоиском нам подберет варианты отвечающие нашему запросу. Нам нужен компонент TButton из закладки Standard. Возьмем этот компонент "на пальчик" и перетащим на нашу форму и разместим его там, где вам больше нравится.

У меня вышло так:
Большая картинка...
Image
Eсли у вас получилось, примерно так же - я могу вас поздравить, вы на правильном пути!

Шаг 5:
Пишем нашу первую процедуру и записываем ее в обработчик кнопки!
Код процедуры:

Code: Select all

procedure HelloWorld;
begin
  Script.Client.Print('Hello World'); 
end;
Теперь, чтобы записать обработчик кнопки - я предлагаю сделать это веселым и удобным путем. Вернемся на визуальный редактор формы и просто даблкликнем по нашей кнопке. Нас перебросит в редактор исходного кода, где автоматически создастся процедура - обработчик события. В нее впишем нашу процедуру и вуаля... Скрипт готов!
У меня получился вот такой код:

Code: Select all

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, stealth_script, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Наша процедура.
procedure HelloWorld;
begin
  Script.Client.Print('Hello World');
end;

//Обработчик, автоматически созданный платформой.
procedure TForm1.Button1Click(Sender: TObject);
begin
  HelloWorld;
end;

end.
Далее следует выполнить простые действия:
С правой стороны окна платформы будет Project Manager в котором черным по белому будет написано: Project1.exe, жмем правой кнопкой, жмем Compile, после того как оно напишет Done, жмем опять правой кнопкой и жмем Build. В принципе все, у нас есть готовый екзешник, но есть одна маленькая загвоздка. Если кто внимательный - то помнит, для чего то нам был нужен Script.dll. Берем данный файл и копируем в директорию с екзешником. Директорию поищите сами, "я не экстрасенс"(С).

Далее, берем чай печеньки, запускаем скрипт и наслаждаемся как при нажатии на кнопку в клиенте будет появляться наше Hello World!

У меня, пока - все.
Если кому будет интересно продолжение - оставляйте пожелания в коментариях.
Last edited by drabadan on 13.10.2013 19:31, edited 1 time in total.
User avatar
Vizit0r
Developer
Developer
Posts: 3945
Joined: 24.03.2005 17:05
Contact:

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Vizit0r »

от себя добавлю, что мной настоятельно рекомендуется Delphi версии XE2 и выше (XE3, 4, 5). Все версии, что ниже - надо будет некоторые моменты переделывать в types_const_import.pas. Впрочем, при наличии желания это не проблема, вон, Gauhar скрипты рисует на Delphi версии 5.0 - и нормально.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

пишем себе конфиг в ини, помощью делфи!

Post by drabadan »

Предлагаю написать наш второй скрипт на Delphi - уже чуток сложнее чем Hello World. Но, не очень...
Долго думал как "войти" в пост, решил - к чертям входы. Мы тут не для этого...

Итак в этом посте не будет картинок - лишь фрагменты кода.

Скрипт будет работать по следующей схеме:
- Будем добавлять айди руны с кнопки на форме;
- Будем реколится с другой кнопки по этой руне;
- Выводить базовую информацию в наше "окно приложения".

Этого запаса должно хватать для написания скриптов, которыми я пытаюсь "барыжить". Так, что если вдруг у кого возникнет желание самому себе написать - милости просим!

Итак, мы уже научились создавать новый проект, компилить и прочую лабуду.
Напомню, что нужно подключить файл, прописать в uses stealth_script и так далее.

Начнем!
Добавим на форму кнопку, справа у нас в нашей среде разработки есть Object Inspector так вот если кликнуть разок по кнопке - у нас в этом инспекторе появятся свойства нашего объекта, в данном случае кнопки. Найдем свойство "Caption" и поменяем Button1 на скажем - Add rune. Замечу сразу - поменяется только надпись на кнопке, имя ее останется прежним. Коду программы абсолютно все-равно как называется кнопка - ему важно её "Имя". Свойство "Name" - найдем его и поменяем на "add_Rune".

Оговорюсь, я не знаю и не владею стандартом оформления кода для Delphi, я знаю - такой существует, но я его не знаю, надеюсь я не очень нарушаю эти правила и не пишу тут страшную ересь. Мы же кодим для игры, по-этому не судите строго.
Буду стараться развиваться - учится и обязательно все поправлю! Я не претендую на гордые звания учителей или знатоков - я это все пишу, как может быть базу, для человека который глянет и решит - "Хватит нубам страдать! Напишу ка я полноценный хороший гайд для подобных вещей!"

Но, что это я в самом деле... Итак, поменяли мы все, что нам надо. И теперь будем писать код, для того - чтобы эта кнопка вызывала таргет в клиенте, а айди объекта с нашего таргета записывался в ини файл.
Для этого нам потребуется написать пару простых процедур. Еще раз подчеркну - это мое, личное, видение того - как я вижу подобный функционал. Прошу людей с опытом, конструктивно откритиковать!

Первая процедура которая нам будет нужна - это позвать таргет после нажатия кнопки и получить информацию в память.
Код данной процедуры:

Code: Select all

//получаем инфу с таргета;
function GetItemInfo : TTargetInfo;
  begin
    Script.Client.RequestObjectTarget; 
    Script.Client.WaitForTargetResponse(30000);
    if Script.Client.TargetResponsePresent then Result := Script.Client.TargetResponse;
  end;

procedure TForm1.add_RuneClick(Sender: TObject);
begin
  GetItemInfo;
end;

Я думаю, этот пост смотрело большинство, из тех кто хотел бы понимать, что тут я пишу. По этому описывать API не буду.

Пойдем дальше - ну получили мы инфу в память, а что ж толку - надо же ее куда-то записать... Для этого будем использовать ини файл. Подробнее о них можете у гугола поспрашивать, распинаться о таких вещах тут нету смысла. Скажу, что из них можно напрямую читать Integer, нам оно и надо!
Давайте напишем айди в инифайл:

Code: Select all

//Добавим в uses строчку inifiles;
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, stealth_script, inifiles;
...

Code: Select all

//запишем айди в ини файл!
procedure SetIdToIni;
  //объявляем необходимые нам переменные;
  var
    iniFile : TIniFile;
    targetInfo : TTargetInfo; //сюда будем записывать результат работы функции GetItemInfo;
  begin

    // создаем файл с таким же названием как и наш екзешник, в той же директории.
    iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));

    //записываем в переменную содержимое объекта с таргета вызовом нашей функции.
    targetInfo := GetItemInfo;

      try
        //записываем Integer в наш файл в область Rune, сецию ID.
        //мы уже получили в параметр targetInfo содержимое таргета
        iniFile.WriteInteger('Rune', 'ID', targetInfo.ID);

      finally
        iniFile.Free;
      end;
  end;

procedure TForm1.add_RuneClick(Sender: TObject);
begin
  SetIdToIni;
end;

Теперь, если у вас все прошло гладко - перейдите в директорию где лежит ваш екзешник и посмотрите в содержимое файла ини. Примечание: если у вас эта директория уже была открыта - ее придется обновить для того, чтобы вы увидели, что файл создался.

В файле ini должно быть примерно следующее:

Code: Select all

[Rune]
ID=1079991263 
В строке ID - значение будет вашего айдишника... Не печальтесь если у вас не получается тот же айдишник :wink: .

Можно сказать пол дела сделано - мы записали айдишник, теперь надо с него рекольнутся! Для рекола нам потребуется еще одна кнопка, обзовем ее Recall и имя соответствующее - Recall. Так у меня, у себя можете, хоть половые органы писать, которые обычно на сараях пишут.

Теперь, нам нужнa процедура рекола, но не простая - а такая которая будет реколится с айдишника который записан в файл...
Для этого нам потребуется следующая процедура:

Code: Select all

//Реколимся по руне записанной в ini;
procedure RecallFromMyIni;
  var
    iniFile : TIniFile;
    tmpId : Word; //сюда запишем прочтенное значение или ноль;
  begin
    iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
    try
      //пытаемся прочесть значение, третий параметр этой функции называется
      //Default и будет записан если значение не будет найдено;
      tmpId := iniFile.ReadInteger('Rune', 'ID', 0);
    finally
      iniFile.Free;
    end;

      //Непосредственно сама попытка рекола;
      if tmpId > 0 then
        begin
          Script.CastSpell('Recall');
          Script.Target.WaitForTarget(30000);
          if Script.Target.TargetPresent then Script.Target.TargetToObject(tmpId);
        end;
  end;

procedure TForm1.RecallClick(Sender: TObject);
begin
  RecallFromMyIni;
end;
Если вы все сделали как я - рекольнетесь! Если лучше - пишите сюда свой вариант!
Идем дальше, совсем чуть-чуть осталось...

Рассмотрим, как бы нам вывести какое-нибудь значение на нашу форму, скажем - для оперативности реакции, а то вдруг регов мало осталось или просто хотим знать - как там дела, в зазеркалье!

Итак, добавим на нашу форму объект TLabel. Обзовите его как хотите. Я не буду менять ему название\имя - он у меня будет один. Запомню в моск, что это именно тот ТЛейбл.

Что бы нам такое записать в этот ТЛейбл... Придумал, по скольку мы пользуем рекол - давайте туда и запишем кол-во наших регов на рекол!
А давайте, вообще пойдем по беспределу и объявим для наших регов массив в разделе глобальных переменных. Что бы можно было обращаться во всех процедурах и функциях скрипта, ну и в довершение - массив будет из специального типа данных которые мы создадим тоже в глобальной области!
Поехали:

Code: Select all

//создадим новый объект, в нем будет имя рега и тип.
type
  TReagentInfo = Record
     Name : String;
     TypeOfReagent : Cardinal;
  end;

var
  Form1: TForm1;
  //Создадим массив из элементов ранее объявленного объекта;
  Regs : array[0..2] of TReagentInfo = ((Name : 'Blood Moss';TypeOfReagent : BM), //0
                                    (Name : 'Mandrake Roots';TypeOfReagent : MR), //1
                                    (Name : 'Black Pearls';TypeOfReagent : BP)); //2

Code: Select all

//будем добавлять текст в поле Caption нашего объекта Label1;
procedure SetLabelCaption;
  var
    i : Integer;
    st : TStringList; //сюда сохраним все, что собираемся записать.
  begin
    st := TStringList.Create;
    try
      //добавим в StringList строк формата: 'Название рега = его количество.';
      //для реализации используем всем понятные элементы и функции;
      for i := 0 to Length(Regs)-1 do

        //разобью эту строку на блоки для упрощения понимая неопытными людьми
        //начало достаем из массива имя рега и пишем знак "="
        st.Add(Regs[i].Name + ' = ' +
        //преобразуем цифру в строку, в самой функции вызываем свойство - количство уо объекта
        IntToStr(TUOObject.GetQuantity
        //Используем FindType, тип берем из массива Regs, контейнер Backpack. Ну и "ТЧК".
        (Script.FindEngine.FindType(Regs[i].TypeOfReagent, Script.MyChar.Backpack)))+ '.');

      //Добавляем еще одно строку не из массива регов;
      st.Add('My gold = ' + IntToStr(Script.MyChar.Gold));

      //И в завершение - свойству Caption нашего Лейбла назначаем Текст из StringList;
      Form1.Label1.Caption := st.Text;
    finally
      st.Free;
    end;
  end;

//процедура которая выполнится при создании формы;
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLabelCaption; //имя нашей процедуры статистики.
end;
Ну вот, конец...
Старался коментировать как мог!

Приложу полный код получившейся у меня программы.

Code: Select all

unit Lesson2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, stealth_script, inifiles;

type
  TForm1 = class(TForm)
    add_Rune: TButton;
    Recall: TButton;
    Label1: TLabel;
    procedure add_RuneClick(Sender: TObject);
    procedure RecallClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TReagentInfo = Record
     Name : String;
     TypeOfReagent : Cardinal;
  end;

var
  Form1: TForm1;
  Regs : array[0..2] of TReagentInfo = ((Name : 'Blood Moss';TypeOfReagent : BM), //0
                                    (Name : 'Mandrake Roots';TypeOfReagent : MR), //1
                                    (Name : 'Black Pearls';TypeOfReagent : BP)); //2

implementation

{$R *.dfm}

{//получаем инфу с таргета вариант 1;
function GetItemInfo : TTargetInfo;
  begin
    Script.Client.RequestObjectTarget;
    Script.Client.WaitForTargetResponse(30000);
    if Script.Client.TargetResponsePresent then Result := Script.Client.TargetResponse;
  end;}

  //получаем инфу с таргета вариант 2;
function GetItemInfo : TTargetInfo;
  begin
    with Script, Form1 do
      begin
        Client.RequestObjectTarget;
        Client.WaitForTargetResponse(30000);
        if Client.TargetResponsePresent then Result := Client.TargetResponse;
      end;
  end;

//запишем айди в ини файл!
procedure SetIdToIni;
  //объявляем необходимые нам переменные;
  var
    iniFile : TIniFile;
    targetInfo : TTargetInfo; //сюда будем записывать результат работы функции GetItemInfo;
  begin

    // создаем файл с таким же названием как и наш екзешник, в той же директории.
    iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));

    //записываем в память содержимое объекта с таргета вызовом нашей функции.
    targetInfo := GetItemInfo;

      try
        //записываем Integer в наш файл в область Rune, сецию ID.
        //мы уже получили в параметр targetInfo содержимое таргета
        iniFile.WriteInteger('Rune', 'ID', targetInfo.ID);

      finally
        iniFile.Free;
      end;
  end;

//Реколимся по руне записанной в ini;
procedure RecallFromIni;
  var
    iniFile : TIniFile;
    tmpId : Integer; //сюда запишем прочтенное значение или ноль;
  begin
    iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
    try
      //пытаемся прочесть значение, третий параметр этой функции назвается
      //Default и будет записан если значение не будет найдено;
      tmpId := iniFile.ReadInteger('Rune', 'ID', 0);
    finally
      iniFile.Free;
    end;
      //Непосредственно сама попытка рекола;
    if tmpId > 0 then
       begin
         Script.CastSpell('Recall');
         Script.Target.WaitForTarget(30000);
         if Script.Target.TargetPresent then Script.Target.TargetToObject(tmpId);
       end;
  end;

//будем добавлять текст в поле Caption нашего объекта Label1;
procedure SetLabelCaption;
  var
    i : Integer;
    st : TStringList; //сюда сохраним все, что собираемся записать.
  begin
    st := TStringList.Create;
    try
      //добавим в StringList строк формата: 'Название рега = его количество.';
      //для реализации используем всем понятные элементы и функции;
      for i := 0 to Length(Regs)-1 do

        //разобью эту строку на блоки для упрощения понимая неопытными людьми
        //начало достаем из массива имя рега и пишем знак "="
        st.Add(Regs[i].Name + ' = ' +
        //преобразуем цифру в строку, в самой функции вызываем свойство - количство уо объекта
        IntToStr(TUOObject.GetQuantity
        //Используем FindType, тип берем из массива Regs, контейнер Backpack. Ну и "ТЧК".
        (Script.FindEngine.FindType(Regs[i].TypeOfReagent, Script.MyChar.Backpack)))+ '.');

      //Добавляем еще одно строку не из массива регов;
      st.Add('My gold = ' + IntToStr(Script.MyChar.Gold));

      //И в завершение - свойству Caption нашего Лейбла назначаем Текст из StringList;
      Form1.Label1.Caption := st.Text;
    finally
      st.Free;
    end;
  end;

procedure TForm1.add_RuneClick(Sender: TObject);
begin
  SetIdToIni;
end;

//процедура которая выполнится при создании формы;
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLabelCaption; //имя нашей процедуры статистики.
end;

procedure TForm1.RecallClick(Sender: TObject);
begin
  RecallFromIni;
end;

end.

З.Ы. Мной умышленно не были упомянуты With и создания объектов в переменных для укорачивания записи. Я старался, донести суть откуда, что берется.
Agent
Posts: 7
Joined: 07.01.2014 22:19

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Agent »

Выложите пожалуйста ещё раз файл types_const_import.pas.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Как я писал свой первый скрипт на делфи для УО.

Post by drabadan »

Agent wrote:Выложите пожалуйста ещё раз файл types_const_import.pas.

[ссылка удалена, файл stealth_script.pas идет вместе со стелсом. (с) Vizitor]
User avatar
Vizit0r
Developer
Developer
Posts: 3945
Joined: 24.03.2005 17:05
Contact:

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Vizit0r »

незнаю, совпадает ли файл от драбадана с этим, но на всяк вот последняя версия:


[ссылка удалена, файл stealth_script.pas идет вместе со стелсом. (с) Vizitor]
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Agent
Posts: 7
Joined: 07.01.2014 22:19

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Agent »

Прикольно...
Только не могу понять, почему некоторые функции работают в отдельном потоке, а некоторые нет.
CheckLag так и не смог прикрутить к потоку, а PlayWav работает на ура.
User avatar
Vizit0r
Developer
Developer
Posts: 3945
Joined: 24.03.2005 17:05
Contact:

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Vizit0r »

проблемный скрипт в студию.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Agent
Posts: 7
Joined: 07.01.2014 22:19

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Agent »

Code: Select all

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, stealth_script, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyThread = class(TThread)
  private

  protected
   procedure Execute; override;
  end;


var
  Form1: TForm1;
  MyThread: TMyThread;


implementation

{$R *.dfm}

procedure TMyThread.Execute;
begin
  Script.CheckLag(2000);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;
  MyThread.FreeOnTerminate:=true;
end;

end.
Иногда срабатывает и после этого тишина.
User avatar
Vizit0r
Developer
Developer
Posts: 3945
Joined: 24.03.2005 17:05
Contact:

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Vizit0r »

понятно.
а теперь убери свой поток, и переделай его же на встроенный в обертку
procedure StartScriptInThread(Method : TScriptExecMethod);
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Agent
Posts: 7
Joined: 07.01.2014 22:19

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Agent »

А можно небольшой примерчик.
Я ещё не особо в Делфи продвинулся.
User avatar
Vizit0r
Developer
Developer
Posts: 3945
Joined: 24.03.2005 17:05
Contact:

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Vizit0r »

Code: Select all

implementation

{$R *.dfm}

procedure ThreadExecute;
begin
  Script.CheckLag(2000);
  Script.AddToSystemJournal('test');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StartScriptInThread(ThreadExecute);
end;

end.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Agent
Posts: 7
Joined: 07.01.2014 22:19

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Agent »

Срабатывает только один раз.
Потом только количество потоков в диспетчере задач увеличивается, а код не выполняется.
User avatar
Vizit0r
Developer
Developer
Posts: 3945
Joined: 24.03.2005 17:05
Contact:

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Vizit0r »

потом гляну, времени нет совсем.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Nedzumi
Posts: 5
Joined: 14.08.2019 14:54

Re: Как я писал свой первый скрипт на делфи для УО.

Post by Nedzumi »

я очень извиняюсь, а можно повторно выложить файл types_const_import.pas
Post Reply