Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.04.20;
Скачать: [xml.tar.bz2];

Вниз

Загрузка из файла в ListView   Найти похожие ветки 

 
Андреев Саша   (2013-07-08 23:49) [0]

Здравствуйте! Хочу загрузить файл в 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 00:02) [1]

TListItems.BeginUpdate
TListItems.EndUpdate


 
Андреев Саша   (2013-07-09 00:35) [2]

>Герман А куда нужно добавить указанные команды?


 
Германн ©   (2013-07-09 01:02) [3]


> куда нужно добавить указанные команды?

Первую перед началом загрузки из файла, вторую после окончания загрузки.


 
Dimka Maslov ©   (2013-07-09 09:26) [4]

Откуда взялись такие атавизмы как {$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;


 
sniknik ©   (2013-07-09 09:51) [5]

Dimka Maslov ©   (09.07.13 09:26) [4]
не учел его "сабитемов" которые через разделитель - "|".

Андреев Саша
лучше бы делал отступами... ИМХО. посмотри как TTreeView сохраняет по SaveToFile и сделай аналогично. гораздо нагляднее если как текст просматривать.

> С БД связываться пока неохота, программа простенький тел.справочник до 500 записей.
зачем тогда усложнять "самопальщиной"? не нужно БД, возьми любой датасет/рекордсет в памяти... автоматом получишь и работу с данными - поиск, фильтры, сортировка.
или не обманывай нас... "неохота", скажи "не знаю, а выбранное кажется проще"  (хотя это ошибка, чтобы на нем сделать нормально ... ).


 
Dimka Maslov ©   (2013-07-09 14:30) [6]


> не учел его "сабитемов" которые через разделитель - "|".


Тогда надо xml использовать и не париться.


 
Андреев Саша   (2013-07-09 18:23) [7]

>Dimka Maslov И как написать аналогичную процедуру загрузки но с потоками? На сколько это поможет быстрее загрузить файл?


 
Германн ©   (2013-07-09 18:48) [8]


> Dimka Maslov ©   (09.07.13 14:30) [6]
> Тогда надо xml использовать и не париться.


Правильно! Пусть Медвесёнок-Порожонок парится с ответами/советами.
:)


 
Dimka Maslov ©   (2013-07-09 18:48) [9]


> Андреев Саша   (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 19:11) [10]

Странно, но результаты тестов показали, что обе процедуры загружают один и тот же файл за одинаковое время. Как бы это дело ускорить? :/


 
MBo ©   (2013-07-09 22:01) [11]

использовать ListView в  виртуальном режиме


 
robt5   (2013-07-09 22:02) [12]


> Я гарантирую это.

бгг


 
robt5   (2013-07-09 22:03) [13]


> Откуда взялись такие атавизмы как {$I-}, AssignFile и проч

этот атавизм работает также как и твои "потоки"


 
Андреев Саша   (2013-07-09 23:03) [14]

>MBo Это как?


 
Германн ©   (2013-07-09 23:56) [15]


> Андреев Саша   (09.07.13 23:03) [14]
>
> >MBo Это как?

Читать хелп по TCustomListView.OwnerData


 
RWolf ©   (2013-07-10 00:06) [16]


> robt5   (09.07.13 22:03) [13]
> этот атавизм работает также как и твои "потоки"


не так же.
потоки поддерживают большие файлы, а атавизмы — нет.


 
sniknik ©   (2013-07-10 09:43) [17]

> Это как?
> скажи "не знаю, а выбранное кажется проще"  (хотя это ошибка, чтобы на нем сделать нормально ... ).
учи базы.


 
Dimka Maslov ©   (2013-07-10 11:25) [18]


> этот атавизм работает также как и твои "потоки"


На низком уровне - да, но они оставлены исключительно для целей обратной совместимости. Если они ещё есть, то не значит, что ими надо вовсю пользоваться. Они не быстрее и не медленнее, но с их использованием код становится яснее, проще и понятнее. И проблема автора не столько в скорости чтения и обработки данных, а в непонимании принципов работы компонента TListView.


 
Андреев Саша   (2013-07-10 11:36) [19]

>Dimka Maslov Список он и в Африке список :)


 
Андреев Саша   (2013-07-10 11:47) [20]

>sniknik Какая БД попроще подойдет для ведения тел.справочника до 500 записей(Access, SQL lite, MySQL)?


 
Плохиш ©   (2013-07-10 11:52) [21]


> попроще


> Access


 
Андреев Саша   (2013-07-10 12:02) [22]

>Плохиш Для отображения результатов поиска  в БД Access обязателен DBGrid или можно как-то данные показать юзверю в ListView?


 
Dimka Maslov ©   (2013-07-10 12:28) [23]


> Список он и в Африке список


К сожалению, нет. Списки бывают разные.


 
Андреев Саша   (2013-07-10 13:08) [24]

>Dimka Maslov Зеленые,синие,красные ;)


 
sniknik ©   (2013-07-10 13:15) [25]

> Какая БД попроще подойдет для ведения тел.справочника до 500 записей(Access, SQL lite, MySQL)?
любая
но вообще, для 1 таблички -
> возьми любой датасет/рекордсет в памяти...


 
Плохиш ©   (2013-07-10 13:41) [26]


> Андреев Саша   (10.07.13 12:02) [22]
> >Плохиш Для отображения результатов поиска  в БД Access
> обязателен DBGrid

nein

> или можно как-то данные показать юзверю в ListView?

ja


 
Андреев Саша   (2013-07-10 19:03) [27]

>Плохиш :) ja-ja ther goot volkswagen narkota! ;) Link можно с примером?


 
Dennis I. Komarov ©   (2013-07-11 09:42) [28]

Цель сего творения какова?


 
sniknik ©   (2013-07-11 09:50) [29]

> или можно как-то данные показать юзверю в ListView?
конечно... и как же ты без любимого "тормоза"? вставляй, и тут же пиши на форум -
> Странно, но результаты тестов показали, что обе (три) процедуры загружают один и тот же файл за одинаковое время. Как бы это дело ускорить? :/

может сначала научится? на стандартном? ведь не умеешь с ListView работать, нафига и к базам его тянешь?


 
Плохиш ©   (2013-07-11 12:38) [30]


> Link можно с примером?

Учебник по программированию в среде делфи.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2014.04.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.002 c
15-1382962260
И. Павел
2013-10-28 16:11
2014.04.20
Запись/чтение данных в больших количествах


2-1372686573
Vasa777
2013-07-01 17:49
2014.04.20
ActionToolBar надписи на кнопках


15-1383229267
Rouse_
2013-10-31 18:21
2014.04.20
Нужна помощь с ZLIb


2-1373707361
Jimmy
2013-07-13 13:22
2014.04.20
Windows Store


15-1382550265
Jeer
2013-10-23 21:44
2014.04.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский