![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Замена Memo на что либо более подходящее [D7]
Draught © (2005-10-30 15:49:00)Ситуация следующая:
Существует приложение для обработки текстовых файлов, в нем изначально я использовал компонент [b]Memo[/b]. Соответственно делал загрузку из файла:
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
и запись содержимого Memo в файл
Memo2.Lines.SaveToFile(fmMain.SaveDialog1.FileName);
до некоторого времени все устраивало, пока не появились файлы большого размера, а программа не стала использоваться на слабых машинах. В итоге имеем очень долгую загрузку/сохранение файла в/из Memo, да и обработка (поиск дубликатов и сортировка), по мере увеличения количества строк в результирующем Memo, сильно замедляется.
Есть ли какой-то другой способ работы с текстовыми файлами, кроме как с компонентом Memo? Есть еще вариант обработки файлов на прямую, читать и писать в файл, но тогда возникают трудности с поиском среди результатов (например при использовании функции поиска дубликатов или сортировки строк). Как вариант еще рассматриваю работу с массивами, но там тоже размер массивов не резиновый, может динамические массивы? Какие есть мнения по этому поводу? Из возможных функций требуются лишь добавление/удаление строки по номеру и быстрый поиск строки по содержимому.
sniknik (2005-10-31 07:53:00) [1]> по моему небольшое различие есть, не находишь? ;)
да уж действительно... небольшое. ;)
jack128 (2005-10-30 23:53:00) [2]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-30 21:10:00) [3]> Наврядли.
ну почему?
TStringList и TMemoStrings, разве так уж и отличаются? во всяком случае LoadFromFile у обоих от Tstrings унаследован...
не спорю TStringList больше подходит для хранения данных, но если их надо еше и отображать? как раз подойдет способ "быстрой загрузки" в мемо.
jack128 (2005-10-30 20:34:00) [4]> конторолы
контролы(controls), конечно
jack128 (2005-10-30 20:33:00) [5]sniknik © (30.10.05 18:11) [5]
практически тоже самое должно получится при
Наврядли.
2Draught
на будущее - использовать конторолыдля хранения и обработки данных - не есть хорошо. конторолы должны только отображатьданные и ничего более.
sniknik (2005-10-30 18:11:00) [6]> ... практически мгновенно глотает 100метровые файлы... ....
практически тоже самое должно получится при
Memo1.Lines.BeginUpdate;
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
Memo1.Lines.EndUpdate;
Draught (2005-10-30 17:45:00) [7]
> MBo © (30.10.05 16:22) [1]
>
> TStringList
Спасиб, результат заметен сразу... практически мгновенно глотает 100метровые файлы... и примерно с такой же скоростью их записывает (ограничивается скоростью диска)...
sniknik (2005-10-30 17:43:00) [8]> Только почему a:=TstringList.Create не понятно... Через Tstrings не работает!
Tstrings абстрактный класс. (база для остальных)
Sergey_R (2005-10-30 17:40:00) [9]
var a:Tstrings;
...
begin
a:=TStringList.Create;
...
end;
Только почему a:=TstringList.Create не понятно... Через Tstrings не работает!
MBo (2005-10-30 16:22:00) [10]TStringList