Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.129 c
2-1130862793
KorvinOE
2005-11-01 19:33
2005.11.20
Кодировка


3-1128596236
vajo
2005-10-06 14:57
2005.11.20
Одно и тоже значение при сравнении не совпадает.


14-1130357222
LordOfRock
2005-10-27 00:07
2005.11.20
Muse


2-1130517058
_guest_
2005-10-28 20:30
2005.11.20
wizard


3-1128085302
ZedeS
2005-09-30 17:01
2005.11.20
Быстая работа с большой базой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский