Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Необычная задачка, memo 
:(
    Опции темы
mooks11d
  Дата 23.8.2008, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 23.8.2008

Репутация: нет
Всего: нет



обрый день всем участникам форума! 
Возникла очень необычная задачка. 

Вообщем, есть 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 тыс, и вот очень долго программа работает ((
PM MAIL   Вверх
aktuba
Дата 23.8.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



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

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

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

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


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

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

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

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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
mooks11d
Дата 23.8.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 23.8.2008

Репутация: нет
Всего: нет



aktuba, спасибо.
мемо копирую что бы быстрее было так как перерисовку не запретил.
а как ее запретить? )
PM MAIL   Вверх
ama_kid
Дата 23.8.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



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;




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
aktuba
Дата 23.8.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Код

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

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

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

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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Rohoss
Дата 23.8.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: 4
Всего: 18



Код

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

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

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

Memo1.Visible:=false;




--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
VICTAR
Дата 24.8.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Код

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0765 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.