![]() |
|
|
|
|
#1
|
|||
|
|||
|
Здравствуйте, в общем вопрос такой, как сделать чтобы программа загружала список из текстового файла с разделителем и брала данные оттуда. Помогите, что-то никак не могу сам понять. В этом варианте она берет данные из окон sEdit. Вот код если что:
Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, sSkinManager, StdCtrls, sButton, ComCtrls, acProgressBar, sMemo,
sLabel, sEdit, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
IdCookieManager, IdIntercept, IdCompressionIntercept, sDialogs;
type
TForm2 = class(TForm)
sEdit1: TsEdit;
sEdit2: TsEdit;
sLabel1: TsLabel;
sLabel2: TsLabel;
sMemo1: TsMemo;
sButton1: TsButton;
IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
sEdit3: TsEdit;
sLabel3: TsLabel;
sLabel4: TsLabel;
sLabel5: TsLabel;
sMemo2: TsMemo;
sButton2: TsButton;
sOpenDialog1: TsOpenDialog;
procedure sButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
Accounts: TStringList;
implementation
{$R *.dfm}
procedure TForm2.sButton1Click(Sender: TObject);
var
HTML: string;
begin
HTML:=IdHTTP1.Get('http://******&Login='+sEdit1.Text+'&Password='+sEdit2.Text);
if pos ('class="button__valign"', HTML)<>0 then
begin
HTML:=IdHTTP1.Get('https://******/search/gosearch?q%5Fquery='+sEdit3.Text+'&q%5Ffolder=all');
if pos ('class="gosearch-message"', HTML)<>0 then
begin
sMemo2.Lines.Add(sEdit1.Text+':'+sEdit2.Text);
end
else
begin
sMemo1.Lines.Add(sEdit1.Text+':'+sEdit2.Text);
end;
end
else
begin
sMemo2.Lines.Add(sEdit1.Text+':'+sEdit2.Text);
end;
end;
end.Последний раз редактировалось Admin, 15.04.2015 в 19:15. |
|
#2
|
|||
|
|||
|
Ну вроде как база загружается, количество строк в Label пишет, но когда пытаюсь вывести текст хотя бы в Memo, при компиляции выдаёт ошибку Project Project1.exe raised exception class EStringListError with message 'List index out of bounds'
Код:
procedure TForm2.sButton2Click(Sender: TObject);
var
Acc: integer;
begin
if sOpenDialog1.Execute then
begin
Accounts.LoadFromFile(sOpenDialog1.FileName);
sLabel9.Caption:=inttostr(Accounts.Count);
Login:=copy(Accounts[Acc],1,pos(';', Accounts[Acc])-1);
sMemo2.Lines.Add(Login);
end;
end;Последний раз редактировалось AlexBerg001, 15.04.2015 в 20:22. |
|
#3
|
||||
|
||||
|
Похоже, "мусорная" переменная Acc, нет её инициализации
Код:
Acc:= 0; Последний раз редактировалось Alegun, 16.04.2015 в 12:10. Причина: Как обычно - ляп |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AlexBerg001 (16.04.2015)
| ||
|
#4
|
|||
|
|||
|
В общем да, программа начала работать с первой строкой списка, но как сделать, чтобы она переходила на следующую? Сейчас вид получился вот такой:
Код:
procedure TForm2.sButton1Click(Sender: TObject);
var
HTML: string;
Acc: integer;
begin
if del=';' then
begin
Acc:=0;
Login:=copy(Accounts[Acc], 1, pos(';', Accounts[Acc])-1);
Password:=copy(Accounts[Acc], pos(';', Accounts[Acc])+1, MaxInt);
HTML:=IdHTTP1.Get('http://xxxxxx&Login='+Login+'&Password='+Password);
if pos ('class="button__valign"', HTML)<>0 then
begin
HTML:=IdHTTP1.Get('https://xxxxxx/gosearch?q%5Fquery='+sEdit3.Text+'&q%5Ffolder=all');
if pos ('class="gosearch-message"', HTML)<>0 then
begin
sMemo2.Lines.Add(Login+';'+Password);
sLabel6.Caption:=inttostr(sMemo2.Lines.Count);
end
else
begin
sMemo1.Lines.Add(Login+';'+Password);
sLabel7.Caption:=inttostr(sMemo1.Lines.Count);
end;
end
else
begin
sMemo2.Lines.Add(Login+';'+Password);
sLabel6.Caption:=inttostr(sMemo2.Lines.Count);
end;
end; |
|
#5
|
||||
|
||||
|
Так и думал, что будет типичное продолжение вопроса
Используйте цикл, добавив первой строкойКод:
for Acc := 0 to Accounts.Count-1 do ... З.Ы. Только Acc:=0; уберите из основного блока Последний раз редактировалось Alegun, 16.04.2015 в 12:13. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AlexBerg001 (16.04.2015)
| ||
|
#6
|
|||
|
|||
|
Спасибо за подсказки, да всё стало работать)))
Блин, поторопился с выводами, обрабатывает буквально несколько строк и виснет((( Всё-таки надо наверное как-нибудь поток создавать и в него это всё помещать. Я создал поток, переместил type и procedure на первую форму, добавил constructor и в procedure переместил тот код, который выполнялся по нажатию кнопки Старт, подобавлял перед выражениями TForm2. Но проект всё-равно не хочет компилироваться, пишет что ему неизвестен IdHTTP и ещё гора ошибок. Как сделать правильно-то? В общем без потока код выглядит вот так: Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, sSkinManager, StdCtrls, sButton, ComCtrls, acProgressBar, sMemo,
sLabel, sEdit, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
IdCookieManager, IdIntercept, IdCompressionIntercept, sDialogs, sGauge;
type
TForm2 = class(TForm)
sMemo1: TsMemo;
sButton1: TsButton;
IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
sEdit3: TsEdit;
sLabel3: TsLabel;
sLabel4: TsLabel;
sLabel5: TsLabel;
sMemo2: TsMemo;
sButton2: TsButton;
sOpenDialog1: TsOpenDialog;
sLabel6: TsLabel;
sLabel7: TsLabel;
sLabel8: TsLabel;
sLabel9: TsLabel;
sSkinManager1: TsSkinManager;
procedure sButton1Click(Sender: TObject);
procedure sButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
Accounts: TStringList;
Login, Password, del: string;
implementation
{$R *.dfm}
procedure TForm2.sButton2Click(Sender: TObject);
begin
Accounts:=TStringList.Create;
if sOpenDialog1.Execute then
begin
Accounts.LoadFromFile(sOpenDialog1.FileName);
sLabel9.Caption:=inttostr(Accounts.Count);
end;
if pos(';', Accounts.Strings[0])<>0 then
begin
del:=';';
end else
begin
del:=':';
end;
end;
procedure TForm2.sButton1Click(Sender: TObject);
var
HTML: string;
Acc: integer;
begin
if del=';' then
for Acc := 0 to Accounts.Count-1 do
begin
Login:=copy(Accounts[Acc], 1, pos(';', Accounts[Acc])-1);
Password:=copy(Accounts[Acc], pos(';', Accounts[Acc])+1, MaxInt);
HTML:=IdHTTP1.Get('http://xxxxxx&Login='+Login+'&Password='+Password);
if pos ('class="button__valign"', HTML)<>0 then
begin
HTML:=IdHTTP1.Get('https://xxxxxx/gosearch?q%5Fquery='+sEdit3.Text+'&q%5Ffolder=all');
if pos ('class="gosearch-message"', HTML)<>0 then
begin
sMemo2.Lines.Add(Login+';'+Password);
sLabel6.Caption:=inttostr(sMemo2.Lines.Count);
end
else
begin
sMemo1.Lines.Add(Login+';'+Password);
sLabel7.Caption:=inttostr(sMemo1.Lines.Count);
end;
end
else
begin
sMemo2.Lines.Add(Login+';'+Password);
sLabel6.Caption:=inttostr(sMemo2.Lines.Count);
end;
end;
if del=':' then
for Acc := 0 to Accounts.Count-1 do
begin
Login:=copy(Accounts.Strings[Acc], 1, pos(':', Accounts.Strings[Acc])-1);
Password:=copy(Accounts.Strings[Acc], pos(':', Accounts.Strings[Acc])+1, MaxInt);
HTML:=IdHTTP1.Get('http://xxxxxx&Login='+Login+'&Password='+Password);
if pos ('class="button__valign"', HTML)<>0 then
begin
HTML:=IdHTTP1.Get('https://xxxxxx/gosearch?q%5Fquery='+sEdit3.Text+'&q%5Ffolder=all');
if pos ('class="gosearch-message"', HTML)<>0 then
begin
sMemo2.Lines.Add(Login+':'+Password);
sLabel6.Caption:=inttostr(sMemo2.Lines.Count);
end
else
begin
sMemo1.Lines.Add(Login+':'+Password);
sLabel7.Caption:=inttostr(sMemo1.Lines.Count);
end;
end
else
begin
sMemo2.Lines.Add(Login+':'+Password);
sLabel6.Caption:=inttostr(sMemo2.Lines.Count);
end;
end;
end;
end.Последний раз редактировалось AlexBerg001, 16.04.2015 в 16:15. |