Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загрузка из файла в ListView


Страницы:   1 2

Андреев Саша ©   (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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо