Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Замена Memo на что либо более подходящее   Найти похожие ветки 

 
Draught   (2005-10-30 15:49) [0]

Ситуация следующая:
Существует приложение для обработки текстовых файлов, в нем изначально я использовал компонент [b]Memo[/b]. Соответственно делал загрузку из файла:

Memo1.Lines.LoadFromFile(OpenDialog1.FileName);

и запись содержимого Memo в файл

Memo2.Lines.SaveToFile(fmMain.SaveDialog1.FileName);

до некоторого времени все устраивало, пока не появились файлы большого размера, а программа не стала использоваться на слабых машинах. В итоге имеем очень долгую загрузку/сохранение файла в/из Memo, да и обработка (поиск дубликатов и сортировка), по мере увеличения количества строк в результирующем Memo, сильно замедляется.

Есть ли какой-то другой способ работы с текстовыми файлами, кроме как с компонентом Memo? Есть еще вариант обработки файлов на прямую, читать и писать в файл, но тогда возникают трудности с поиском среди результатов (например при использовании функции поиска дубликатов или сортировки строк). Как вариант еще рассматриваю работу с массивами, но там тоже размер массивов не резиновый, может динамические массивы? Какие есть мнения по этому поводу? Из возможных функций требуются лишь добавление/удаление строки по номеру и быстрый поиск строки по содержимому.


 
MBo ©   (2005-10-30 16:22) [1]

TStringList


 
Sergey_R ©   (2005-10-30 17:40) [2]

var a:Tstrings;
...
begin
a:=TStringList.Create;
...
end;


Только почему a:=TstringList.Create не понятно... Через Tstrings не работает!


 
sniknik ©   (2005-10-30 17:43) [3]

> Только почему a:=TstringList.Create не понятно... Через Tstrings не работает!
Tstrings абстрактный класс. (база для остальных)


 
Draught   (2005-10-30 17:45) [4]


> MBo ©   (30.10.05 16:22) [1]
>
> TStringList

Спасиб, результат заметен сразу... практически мгновенно глотает 100метровые файлы... и примерно с такой же скоростью их записывает (ограничивается скоростью диска)...


 
sniknik ©   (2005-10-30 18:11) [5]

> ... практически мгновенно глотает 100метровые файлы...  ....
практически тоже самое должно получится при

Memo1.Lines.BeginUpdate;
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
Memo1.Lines.EndUpdate;


 
jack128 ©   (2005-10-30 20:33) [6]

sniknik ©   (30.10.05 18:11) [5]
практически тоже самое должно получится при


Наврядли.

2Draught
на будущее - использовать конторолы для хранения и обработки данных - не есть хорошо. конторолы должны только отображать данные и ничего более.


 
jack128 ©   (2005-10-30 20:34) [7]

> конторолы

контролы(controls), конечно


 
sniknik ©   (2005-10-30 21:10) [8]

> Наврядли.
ну почему?
TStringList и TMemoStrings, разве так уж и отличаются?  во всяком случае LoadFromFile у обоих от Tstrings унаследован...

не спорю TStringList больше подходит для хранения данных, но если их надо еше и отображать? как раз подойдет способ "быстрой загрузки" в мемо.


 
jack128 ©   (2005-10-30 23:53) [9]

sniknik ©   (30.10.05 21:10) [8]
TStringList и TMemoStrings, разве так уж и отличаются?  

Сравни
procedure TMemoStrings.Insert(Index: Integer; const S: string);
var
 SelStart, LineLen: Integer;
 Line: string;
begin
 if Index >= 0 then
 begin
   SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0);
   if SelStart >= 0 then Line := S + #13#10 else
   begin
     SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index - 1, 0);
     if SelStart < 0 then Exit;
     LineLen := SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0);
     if LineLen = 0 then Exit;
     Inc(SelStart, LineLen);
     Line := #13#10 + s;
   end;
   SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelStart);
   SendMessage(Memo.Handle, EM_REPLACESEL, 0, Longint(PChar(Line)));
 end;
end;

И
procedure TStringList.Insert(Index: Integer; const S: string);
begin
 InsertObject(Index, S, nil);
end;

procedure TStringList.InsertObject(Index: Integer; const S: string;
 AObject: TObject);
begin
 if Sorted then Error(@SSortedListError, 0);
 if (Index < 0) or (Index > FCount) then Error(@SListIndexError, Index);
 InsertItem(Index, S, AObject);
end;

procedure TStringList.InsertItem(Index: Integer; const S: string; AObject: TObject);
begin
 Changing;
 if FCount = FCapacity then Grow;
 if Index < FCount then
   System.Move(FList^[Index], FList^[Index + 1],
     (FCount - Index) * SizeOf(TStringItem));
 with FList^[Index] do
 begin
   Pointer(FString) := nil;
   FObject := AObject;
   FString := S;
 end;
 Inc(FCount);
 Changed;
end;

по моему небольшое различие есть, не находишь? ;)


 
sniknik ©   (2005-10-31 07:53) [10]

> по моему небольшое различие есть, не находишь? ;)
да уж действительно... небольшое. ;)



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
1-1130676546
Draught
2005-10-30 15:49
2005.11.20
Замена Memo на что либо более подходящее


2-1130968376
Duralei
2005-11-03 00:52
2005.11.20
прозрачное текстовое поле


3-1128584311
Andrushk
2005-10-06 11:38
2005.11.20
TSQLStoredProc и схема


4-1126964773
NikNet
2005-09-17 17:46
2005.11.20
У меня есть HDC как мне нарисовать иконку на ней?


2-1131189872
Kostafey
2005-11-05 14:24
2005.11.20
Программа то работает, то не работает на разных PC