Для копипастеров и исходоебов я оставлю свой комментарий, который должен будет вас вразумить от использования этого.
Начнем с банального, с классов.
AntiPablic = class(TThread)
private
Rez: Integer;
const
PrivateAccount = 1;
PublicAccount = 2;
protected
procedure Res;
procedure Execute; override;
end;
WebThread = class(TThread)
private
Rez: Integer;
const
ServerAccount = 1;
protected
procedure Res;
procedure Execute; override;
end;
Вспоминаем родителя TThread и не забываем про конструкторы и деструкторы класса. Если вы не создаете его, то используется по умолчанию метод:
constructor TThread.Create;
begin
Create(False);
end;
Из доступных:
constructor Create; overload;
constructor Create(CreateSuspended: Boolean); overload;
{$IF Defined(MSWINDOWS)}
constructor Create(CreateSuspended: Boolean; ReservedStackSize: NativeUInt); overload;
{$ENDIF MSWINDOWS}
Далее просто космос:
> тут описывать не стал, оставил комментарий в коде))) так теперь в "var Form1" добавляем
i: Integer;
HTTP: TChilkatX;
Dir, Times: String;
PrivateFile, PublicFile: TextFile;
AccountsList, WebList: TStringList;
Ну во первых, как я понимаю - HTTP: TChilkatX; будет использоваться из потока. Если это так, то у нас намечаются большие проблемы с использованием одного экземпляра класса.
PrivateFile, PublicFile: TextFile; - можно было завести далее процедуру и даже целый класс для работы с файлами, ну ладно. Это не является ошибкой, но это уже дико выглядит.
AssignFile(PrivateFile, Dir + '\Приват комбинации [ ' + DateToStr(Now) + ' ].txt');
Rewrite(PrivateFile); // открываем
CloseFile(PrivateFile); // закрываем
// создаем сам тхт файл с названием "Паблик комбинации" записываем по "Dir" тоесть в сюда "Результаты\Результаты"
AssignFile(publicFile, Dir + '\Паблик комбинации [ ' + DateToStr(Now) + ' ].txt');
Rewrite(publicFile); // открываем
CloseFile(publicFile); // закрываем
Об этом я и говорил. Расскажите ему, что разницы в разном нейминге нет.
APTheard := AntiPablic.Create(true); // запуск потока
APTheard.FreeOnTerminate := true; // уничтожитаем после выполнения
APTheard.Priority := tpHigher; // приоритет потока
APTheard.Resume; // запускаем поток в ручную
Это нужно было отдать конструктуру.
Далее я вижу AlphaControl. Не одобряю и не осуждаю. Но в будущем лучше использовать стандартные компоненты без свистоперделок. В Delphi итак есть крутые скины.
Пример:
Как сделать:
Не обязательно кидать sOpenDialog1 на форму и так грубо обращаться к нему. Можно создать опять же экземпляр класса и после использования его уничтожить. Незачем ему висеть на форме и сразу же показываю, почему нужно обновлять IDE до 10.3 минимум.
procedure TForm1.Button1Click(Sender: TObject);
var OpenDialog: TOpenDialog;
base: TStringList;
begin
base:=TStringList.Create;
OpenDialog:=TOpenDialog.Create(nil);
OpenDialog.Filter:='*|*.txt';
if OpenDialog.Execute then
base.LoadFromFile(OpenDialog.FileName);
Form1.Memo1.Lines.Add(base.Count.ToString);
FreeAndNil(OpenDialog);
FreeAndNil(base);
end;
Обратите внимание на удобное ToString, как в нормальных высших языках. Обращение к визуальным компонентам приучитесь писать от класса породившего объект, в будущем пригодится этот навык.
> с этим мы с правились))), теперь перед "{$R *.dfm}" запишем
Нет никакой разницы, где писать. Это декларативная запись, чтобы вы не писали вручную откуда брать юнит для компиляции и соблюдать их нейминг. Лучше писать после данной декларативной части, так как это удобнее читать.
Далее процедура представлена не привязанная ни к чему. Раз ты делаешь глобально, то и записывай имя процедуры глобально, т.е.:
var
i: Integer;
HTTP: TChilkatX;
Dir, Times: String;
PrivateFile, PublicFile: TextFile;
AccountsList, WebList: TStringList;
procedure SaveToFile(Str: string; Validate: Integer);
И никак не иначе.
Ну и не могу я ничего не сказать про procedure SaveToFile(Str: string; Validate: Integer);
У тебя изначально ошибка была при проектировании декларативной части. Можно было написать короче:
procedure SaveToFile(const data: string; out Dir: string);
var F: TextFile;
begin
AssignFile(F, Dir);
Append(PrivateFile);
Writeln(PrivateFile, Str);
CloseFile(PrivateFile);
end;
Я задаюсь вопросом: а нахуя нам класс потока, если ты работаешь в один поток? Можно было тогда оформить все в 1 класс и запустить отдельно с таким же успехом, но мы идем дальше.
Бляяяяяя...Он залил какой-то файл и потом проверяет его выкачивая с сервера.. И будет досить хост AccountsList.Count раз...
Для этого используются СУБД и пишется серверная часть для взаимодействия клиента с базой данных. Мне интересно, через какое время хостинг пошлет нахер такого клиента, потому что отдавать 100-200-500 мегабайт - это дорогая операция.
Synchronize(Res); - зачем? У тебя все равно один поток, мог бы и тут наговнокодить. Но это правильное использование, хоть и неожиданно было увидеть подобное.
Form1.PrivatePanel.Caption := IntToStr(StrToInt(Form1.PrivatePanel.Caption) + 1);
Form1.BasePanel.Caption := IntToStr(StrToInt(Form1.BasePanel.Caption) - 1);
Вести класс статистики - нет, это для слабаков.
Выше я писал про SaveToFile(AccountsList.Strings
, 1);
В твоем случае лучше было сделать так: SaveToFile(out Str: string; const Validate: Integer);
Как минимум не создавал бы еще экземпляр строки.
> теперь вывод сколько строк в нашей бд(txt) файле
Громко сказано БД.
WebThread - я вообще не понимаю нехера он нужен. Узнать сколько там строк? Это дичь.
Прошу не использовать это говно и учиться не по исходникам. Ну или ваш пусть говнокод и исходоебие.
Каждый выбирает для себя свое,
ваш AnGel.