![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка из файла в ListView
Андреев Саша © (2013-07-08 23:49:00)Здравствуйте! Хочу загрузить файл в ListView по возможности побыстрее.
Нагуглил такой способ:
procedure LoadListViewToFile(ListView: TListView; S: String);
// © Song
Const Delimiter = '|';
Var
ff: TextFile;
label 1;
Begin
ListView.Clear;
{$I-}
AssignFile(Ff,s);
Reset(Ff);
if IOResult<>0 then Goto 1;
CloseFile(Ff);
{$I+}
AssignFile(ff, S);
Reset(ff);
try
While not Eof(ff) Do
Begin
ReadLn(ff,S);
With ListView.Items.Add Do
Begin
Caption:=Copy(S,1,Pos(Delimiter,S)-1);
System.Delete(S,1,Pos(Delimiter,S));
S:=StringReplace(S,Delimiter,#13#10,[rfReplaceAll]);
SubItems.Text:=S;
End; {With}
End; {While}
finally
CloseFile(ff);
end;
1:{..}
End;
Для сохранения ListView в файл такая процедура:
Procedure SaveListView(S: String; ListView: TListView);
// © Song
Const Delimiter = '|';
Var ff: TextFile;
t: Integer;
begin
AssignFile(ff, S);
ReWrite(ff);
try
With ListView Do For t:=0 to Items.Count - 1 Do
WriteLn(ff,StringReplace(Items[t].Caption + Delimiter + Items.Item[t].SubItems.Text,#13#10,Delimiter,[rfReplaceAll]));
finally
CloseFile(ff);
end;
end;
Загрузка списков в 200-300кб уже занимает большое время. Можно
как-то модернизировать процедуру загрузки для ускорения или использовать другой метод? С БД связываться пока неохота, программа
простенький тел.справочник до 500 записей. Возможно кто использует поновее и побыстрее ListView со своими методами Load/Save. Подкиньте ссылку пожалуйста на этот компонент. Спасибо!
Андреев Саша (2013-07-09 19:11:00) [21]Странно, но результаты тестов показали, что обе процедуры загружают один и тот же файл за одинаковое время. Как бы это дело ускорить? :/
Dimka Maslov (2013-07-09 18:48:00) [22]
> Андреев Саша (09.07.13 18:23) [7]
как-то так, не проверялось, но скорость возрастёт. Я гарантирую это.
var
F: TFileStream;
L, L1: TStringList;
i, j: Integer;
begin
F := TFileStream.Create('d:\file.txt', fmOpenRead);
try
L := TStringList.Create;
try
L.LoadFromStream(F);
L1 := TStringList.Create;
try
L1.Delimiter := '|';
L1.StrictDelimiter := true;
ListView1.Items.BeginUpdate;
try
for i := 0 to L.Count - 1 do begin
L1.DelimitedText := L[i];
if L1.Count <> 0 then begin
with ListView1.Items.Add do begin
Caption := L1[0];
for j := 1 to L1.Count - 1 do SubItems.Add(L1[j]);
end;
end;
end;
finally
ListView1.Items.EndUpdate;
end;
finally
L1.Free;
end;
finally
L.Free;
end;
finally
F.Free;
end;
end;
Германн (2013-07-09 18:48:00) [23]
> Dimka Maslov © (09.07.13 14:30) [6]
> Тогда надо xml использовать и не париться.
Правильно! Пусть Медвесёнок-Порожонок парится с ответами/советами.
:)
Андреев Саша (2013-07-09 18:23:00) [24]>Dimka Maslov И как написать аналогичную процедуру загрузки но с потоками? На сколько это поможет быстрее загрузить файл?
Dimka Maslov (2013-07-09 14:30:00) [25]
> не учел его "сабитемов" которые через разделитель - '|'.
Тогда надо xml использовать и не париться.
sniknik (2013-07-09 09:51:00) [26]Dimka Maslov © (09.07.13 09:26) [4]
не учел его "сабитемов" которые через разделитель - '|'.
Андреев Саша
лучше бы делал отступами... ИМХО. посмотри как TTreeView сохраняет по SaveToFile и сделай аналогично. гораздо нагляднее если как текст просматривать.
> С БД связываться пока неохота, программа простенький тел.справочник до 500 записей.
зачем тогда усложнять "самопальщиной"? не нужно БД, возьми любой датасет/рекордсет в памяти... автоматом получишь и работу с данными - поиск, фильтры, сортировка.
или не обманывай нас... "неохота", скажи "не знаю, а выбранное кажется проще" (хотя это ошибка, чтобы на нем сделать нормально ... ).
Dimka Maslov (2013-07-09 09:26:00) [27]Откуда взялись такие атавизмы как {$I-}, AssignFile и проч. Для загрузки текста давно используются списки и потоки (Stream).
procedure TForm1.Button1Click(Sender: TObject);
var
L: TStringList;
i: Integer;
begin
L := TStringList.Create;
try
L.LoadFromFile('d:\sh\1-1.txt');
ListView1.Items.BeginUpdate;
try
for i := 0 to L.Count - 1 do
ListView1.Items.Add.Caption := L[i];
finally
ListView1.Items.EndUpdate;
end;
finally
L.Free;
end;
end;
Германн (2013-07-09 01:02:00) [28]
> куда нужно добавить указанные команды?
Первую перед началом загрузки из файла, вторую после окончания загрузки.
Андреев Саша (2013-07-09 00:35:00) [29]>Герман А куда нужно добавить указанные команды?
Германн (2013-07-09 00:02:00) [30]TListItems.BeginUpdate
TListItems.EndUpdate