Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Необычная задачка


Автор: mooks11d 23.8.2008, 06:23
обрый день всем участникам форума! 
Возникла очень необычная задачка. 

Вообщем, есть Memo, в него вписывают строки, после нажатия на кнопку нужно из этого Memo удалить те строки, 
которые уже есть в файле base.txt в папке с программой. 

Я вроде бы справился, но блин, очень долго рабатает программа, и подвисает. А надо быстро! 
Может кто-нибудь предоложит свой вариант? или поможет исправить ошибки? 

вот код: 
delphi:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
S1,S2: TStringList;
i1, i2, i3:integer;
begin
 
  S1 := TStringList.Create;
  S1.Text := Memo1.Text;
 
  S2 := TStringList.Create;
  S2.LoadFromFile(ExtractFilePath(Application.ExeName) + '\base.txt');
 
i3:=-1;
S1.Insert(0,' temp ');
S1.Insert(S1.Count,' temp ');
 
for i1:=0 to S1.Count-1 do begin
If S1.Count-1>=i3 Then i3:=i3+1;
If i3>S1.Count Then i3:=S1.Count;
   for i2:=0 to S2.Count-1 do begin
      Application.ProcessMessages;
       if S1.Strings[i3] = S2.Strings[i2] Then begin
         S1.Delete(i3);
         If i3>0 Then i3 := i3 - 1;
       end;
   end;
end;
 
S1.Delete(0);
S1.Delete(S1.Count-1);
 
Memo1.Text := S1.Text;
 
end;

 



спасибо всем кто откликнулся
может быть надо это делать не в делфи? или как-то по другому?
видил похожии программы на c++ там за секунды делаеться
еще доп. инфа. к примеру в memo пишем 7тыс строк а в файл 400 тыс, и вот очень долго программа работает ((

Автор: aktuba 23.8.2008, 09:21
Цитата(mooks11d @  23.8.2008,  07:23 Найти цитируемый пост)
может быть надо это делать не в делфи? или как-то по другому?
видил похожии программы на c++ там за секунды делаеться

А может надо с головой дружить? Язык тут не при чем.

Ошибка в решении - зачем ты делаешь 2 цикла? Делай один цикла - для внешнего файла. Наличие строки в мемо можно проверить так:
Код

if Memo.Lines.IndexOf('Текст') > 0 then


Второе - зачем ты копируешь мемо в стринглист и обратно?

Третье (на будущее) - перед подобным пробегом запрети перерисовку мемо, т.к. после удаления любой строки мемо будет полностью перерисовываться.

Четвертое (только что заметил) - для чего в коде i3???

дальше сам думай ;)

Автор: mooks11d 23.8.2008, 09:34
aktuba, спасибо.
мемо копирую что бы быстрее было так как перерисовку не запретил.
а как ее запретить? )

Автор: ama_kid 23.8.2008, 09:36
mooks11d, для таких размеров:
Цитата(mooks11d @  23.8.2008,  07:23 Найти цитируемый пост)
в memo пишем 7тыс строк а в файл 400 тыс
лучше использовать БД,  со строками в любом случае операции выполняются долго.
Мой вариант кода:
Код
procedure TForm1.Button1Click(Sender: TObject);
var
 FS:TStringList;
 MS:TStringList;
 Stream:TMemoryStream;
 i:integer;
begin
 FS:=TStringList.Create;
 FS.LoadFromFile('base.txt');
 MS:=TStringList.Create;
 Stream:=TMemoryStream.Create;
 Memo1.Lines.SaveToStream(Stream);
 Stream.Position:=0;
 MS.LoadFromStream(Stream);
 Memo1.Lines.Clear;
 i:=0;
 while i<MS.Count do
  begin
   Application.ProcessMessages;
   if FS.IndexOf(MS.Strings[i])>=0 then
    begin
     MS.Delete(i);
     continue;
    end;
   inc(i);
  end;
 Stream.Clear;
 MS.SaveToStream(Stream);
 Stream.Position:=0;
 Memo1.Lines.LoadFromStream(Stream);
 Stream.Free;
 FS.Free;
 MS.Free;
end;


Автор: aktuba 23.8.2008, 11:36
Код

 MS:=TStringList.Create;
 Stream:=TMemoryStream.Create;
 Memo1.Lines.SaveToStream(Stream);
 Stream.Position:=0;
 MS.LoadFromStream(Stream);

Ой-ой... Это еще для чего? Сохраняем мемо в поток, а потом из потока загружаем в StringList???

Цитата(mooks11d @  23.8.2008,  10:34 Найти цитируемый пост)
мемо копирую что бы быстрее было так как перерисовку не запретил.
а как ее запретить? ) 

Посмотри в drkb - там было.

Автор: Rohoss 23.8.2008, 15:35
Код

TStringList.Delete(); TMemo.Lines.Delete();
 имхо очень тяжёлая при большом количестве текста, лучше перестроить функции так чтобы текст добавлять а не удалять…

Добавлено через 4 минуты и 47 секунд
Цитата(mooks11d @  23.8.2008,  09:34 Найти цитируемый пост)
мемо копирую что бы быстрее было так как перерисовку не запретил.а как ее запретить? )

можно просто скрыть
Код

Memo1.Visible:=false;


Автор: VICTAR 24.8.2008, 14:11
Код

Memo1.Lines.BeginUpdate;
try
...
finally
  Memo1.Lines.EndUpdate;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)