![]() |
|
#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. |
#7
|
||||
|
||||
![]() Для начала желательно провести оптимизацию, сократить код, напр. зачем несколько раз явно проверять вид разделителя (':' or ';'), в переменной del он уже представлен, значит достаточно сделать так
всего разок Код:
Login:=copy(Accounts.Strings[Acc], 1, pos(del, Accounts.Strings[Acc])-1); Password:=copy(Accounts.Strings[Acc], pos(del, Accounts.Strings[Acc])+1, MaxInt); ... if... sMemo2.Lines.Add(Login+del+Password); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#8
|
|||
|
|||
![]() C разделителем разобрался - спасибо. А вот с Memo до конца не понял как правильно сделать, я написал вот так, но мне кажется что это ничего не поменяло:
Код:
var Form2: TForm2; Accounts, good, bad: 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 good:=TStringList.Create; bad:=TStringList.Create; for Acc := 0 to Accounts.Count-1 do begin Login:=copy(Accounts[Acc], 1, pos(del, Accounts[Acc])-1); Password:=copy(Accounts[Acc], pos(del, 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 bad.Add(Login+del+Password); sMemo2.Lines.Assign(bad); sLabel6.Caption:=inttostr(sMemo2.Lines.Count); end else begin good.Add(Login+del+Password); sMemo1.Lines.Assign(good); sLabel7.Caption:=inttostr(sMemo1.Lines.Count); end; end else begin bad.Add(Login+del+Password); sMemo2.Lines.Assign(bad); sLabel6.Caption:=inttostr(sMemo2.Lines.Count); end; end; end; end. Последний раз редактировалось AlexBerg001, 16.04.2015 в 19:46. |
#9
|
||||
|
||||
![]() Я так понимаю, показ в мемо\лейбле результата разбора строки - это своеобразный индикатор хода работы, сортировка на валидный-не валидный акк? Список тогда здесь не подходит, нужно добавить в "тормозном" месте Application.ProcessMessage, чтоб не зависало всё сразу и надолго
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#10
|
|||
|
|||
![]() Ну да, вы всё правильно поняли, так а как узнать где тормозное место то?
|
#11
|
||||
|
||||
![]() Как обычно, отладкой
![]() Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#12
|
|||
|
|||
![]() В общем добавил строку Application.ProcessMessages; непосредственно перед каждым get-запросом: 20 строк прошло, дальше зависает и в debug пишет Thread Exit и выпадает окно socket 10060. Всё время с момента нажатия кнопки Старт окно программы подвисает и нельзя его ни двигать, ни скроллбар крутить
Последний раз редактировалось AlexBerg001, 16.04.2015 в 20:04. |
#13
|
||||
|
||||
![]() Покажите пжлст кусман подгружаемого текстового файла, его структуру - попробую вам "не интернетную" матчасть пересобрать
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#14
|
|||
|
|||
![]() В смысле файл Accounts, который я загружаю правильно я вас понял?
Последний раз редактировалось AlexBerg001, 16.04.2015 в 22:14. |
#15
|
||||
|
||||
![]() <DELETED>...что было нужно, я увидел и потопал в сборочный цех
З.Ы. Сплошные двоеточия, а точка с запятой что разделяет, непонятки Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 16.04.2015 в 22:15. |