Форум: "Начинающим";
Текущий архив: 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