Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизПомогите! TListView какой-то медленный! Нужно ООчень срочно. Найти похожие ветки
← →
rolex (2004-12-26 17:07) [0]Раньше в программе был chеcklistbox, нуждаясь во второй колонке я был вынужден перейти на listview.
После продолжительного переписания кода я всё же откомпилировал программу с новым listview.
Но потом обнаружил, что listview работает ГОРАЗДО медленнее checklistbox"a! Теперь незнаю что делать.
А проявляется эта тормознутость вот в чём:
Моя программа выводит список файлов из папки Temporary Internet Files (а их там несколько тысяч, сами знаете) в listview.
Listview начинает дико мерцать. Далее список файлов выводится гораздо медленнее, раз в 10-15 если не больше, чем в checklistbox! Вот основная проблема!
Да, и ещё, перед добавлением строки, программа проверяет весь список на копию строки.
Т.е. получается примерно так:
var x,i:integer;
begin
x:=0;
for i:=0 to Listview1.items.count do if "добавляемый текст"=listview1.items[i].caption then x:=1;
if x=0 then listview.items.add.caption:="добавляемый текст";
end;
Что-то типа этого.
И перед добавлением каждой строки, а их там оочень много, тысячи, т.е. процесс очень объёмный.
CheckListbox с ним справлялся спокойно, а listview ну ооочень долго это делает. Вот впринципе и основная проблема.
Очень прошу вас помочь. Для меня это очень важно. Вся надежда на вас. Заранее спасибо.
← →
begin...end © (2004-12-26 17:22) [1]> rolex (26.12.04 17:07)
Попробуйте перед добавлением большого количества элементов в ListView вызывать ListView.Items.BeginUpdate, а после - ListView.Items.EndUpdate.
← →
Palladin © (2004-12-26 17:23) [2]TListView.OwnerData + F1
← →
rolex (2004-12-26 18:25) [3]
> Palladin © (26.12.04 17:23) [2]
> TListView.OwnerData + F1
Поставил OwnerData:=true. Да, в список всё вывелось быстрее, но ничего в списке невидно. Как я понял надо что-то написать в событие onData. А вот что? Прошу помочь, желательно кодом.
P.S. Весь инет облазил, инфы вообще нигде нету!
← →
Leonid Troyanovsky © (2004-12-26 18:42) [4]
> rolex (26.12.04 18:25) [3]
> > TListView.OwnerData + F1
> P.S. Весь инет облазил, инфы вообще нигде нету!
Demos\Virtual Listview\
--
Regards, LVT.
← →
rolex (2004-12-26 18:45) [5]Да я уже сижу разбираюсь там. Только ничего немогу понять. Программа больно большая (по крайней мере для меня).
Ну пожалуйста приведите примерчик!!!
← →
Leonid Troyanovsky © (2004-12-26 19:04) [6]
> rolex (26.12.04 18:45) [5]
> Да я уже сижу разбираюсь там. Только ничего немогу понять.
> Программа больно большая (по крайней мере для меня).
> Ну пожалуйста приведите примерчик!!!
By Remy Lebeau:
Set the OwnerData property to true and assign
an OnData event handler.
procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.Items.Count := 100;
end;
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
Index: Integer;
begin
Index := Item.Index + 1;
Item.Caption := IntToStr(Index);
Item.SubItems.Add("Item " + IntToStr(Index));
end;
--
Regards, LVT.
← →
rolex (2004-12-26 20:22) [7]Вы неповерите, но приведённый вами код нерабочий :(
Т.е. при OwnerData=True всёравно ничего невидно. К сожалению приведённый вами код неработоспособный :((
Буду рад, если вы мне поможете правильным кодом. Очень надеюсь на вас!
← →
sniknik © (2004-12-26 20:31) [8]> при OwnerData=True
нужно самому отрисовывать либо все описанные методы описать, правильно...
(F1 Note: ...)
выключи пока не разберешся более менее, с выключеным попробуй
procedure TForm1.Button1Click(Sender: TObject);
var
Count: integer;
procedure AddItems(const path: string);
var
sr: TSearchRec;
ListItem: TListItem;
begin
if FindFirst(path + "*.*", faAnyFile, sr) = 0 then begin
repeat
if (sr.Attr and faDirectory) <> faDirectory then begin
Inc(Count);
with ListView1.Items.Add do Caption:= sr.Name;
end else
if sr.Name[1] <> "." then AddItems(path+sr.Name+"\");
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
begin
Count:= 1;
ListView1.Items.BeginUpdate;
try
AddItems("D:\Documents and Settings\xxxxx\Local Settings\Temporary Internet Files\");
finally
ListView1.Items.EndUpdate;
end;
Label1.Caption:= IntToStr(Count);
end;
← →
Leonid Troyanovsky © (2004-12-26 21:06) [9]
> rolex (26.12.04 20:22) [7]
> Вы неповерите, но приведённый вами код нерабочий :(
> Т.е. при OwnerData=True всёравно ничего невидно. К сожалению
> приведённый вами код неработоспособный :((
Не верю.
--
С уважением, LVT
← →
rolex (2004-12-26 21:55) [10]
> > rolex (26.12.04 20:22) [7]
> > Вы неповерите, но приведённый вами код нерабочий :(
> > Т.е. при OwnerData=True всёравно ничего невидно. К сожалению
>
> > приведённый вами код неработоспособный :((
>
>
> Не верю.
>
> --
> С уважением, LVT
Да не. Я уже разобрался, всё он работает. Я просто колонку забыл создать :).
Поработав с ним я понял, что это не для меня. Т.к. я незнаю как удаленить строки из ListView через этот метод. И при прокрутке перерисовывать как-то надо.
Может вы посоветуете какой компонент?? Чтобы была вторая колонка и чекбоксы. Я уже думал Checklistbox рядом с listbox сделать, правда велосипед какой-то получается.
← →
begin...end © (2004-12-26 21:58) [11]> [10] rolex (26.12.04 21:55)
Вам [1] или [8] не подошло?
← →
Leonid Troyanovsky © (2004-12-26 22:14) [12]
> rolex (26.12.04 21:55) [10]
> Поработав с ним я понял, что это не для меня. Т.к. я незнаю
> как удаленить строки из ListView через этот метод. И при
> прокрутке перерисовывать как-то надо.
И, чего - не перерисовывается? :(
А "удаляются" данные, которые отображаются, а в самом вью
лишь меняется Items.Count.
> Может вы посоветуете какой компонент?? Чтобы была вторая
> колонка и чекбоксы. Я уже думал Checklistbox рядом с listbox
> сделать, правда велосипед какой-то получается.
Возьми owner-draw TStringGrid.
CheckBox рисуется DrawFrameControl. Его состояние можно
хранить хоть в строке, хоть в Objects.
--
С уважением, LVT.
← →
Defunct © (2004-12-27 03:28) [13]rolex (26.12.04 17:07)
....
SendMessage( P_Surface.Handle, WM_SETREDRAW, 0,0);
try
...
заполняем ListView
...
finally
ListView1.Scroll(0,$7FFFFFFF);
SendMessage( P_Surface.Handle, WM_SETREDRAW, 1,0);
ListView1.Left := 10000; // чтобы особо не маяться с перерисовкой, пусть ListView сам себя нарисует
end;
P_Surface - то на чем находится ListView, например TPanel. Свойство ListView.Align должно быть установлено в alClient.
← →
rolex (2004-12-27 15:17) [14]Ну сделал я вот такое:
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
SendMessage(Form1.Handle, WM_SETREDRAW, 0,0);
try
Item.Caption:=edit1.Text;
finally
ListView1.Scroll(0,$7FFFFFFF);
SendMessage(Form1.Handle, WM_SETREDRAW, 1,0);
ListView1.Left := 10000; // чтобы особо не маяться с перерисовкой, пусть ListView сам себя нарисует
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.items.Add;
end;
И нифига не получилось. Всё мигать начинает...
← →
sniknik © (2004-12-27 16:52) [15]onData
Occurs immediately before an item is displayed in the list view control.
а ты его там же перерисовываться заставляеш, что порождает это же самое событие.
← →
rolex (2004-12-27 18:51) [16]и что нужно делать?
← →
Defunct © (2004-12-28 20:32) [17]rolex (27.12.04 18:51) [16]
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
[13]
...
try
for i:=1 to 10000 do
ListView1.Items.Add.Caption := "zzzzz" + IntToStr(i)
finally
....
end
end;
тоже мерцает?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c