Форум: "Основная";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизЗамена 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.062 c