Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Помогите! 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.442 c
9-1095857074
Xerx
2004-09-22 16:44
2005.01.16
Сглаживание изображения


14-1103872779
ocean
2004-12-24 10:19
2005.01.16
Новости с Родины ддля Чеширского кота


1-1104044743
ReNEG@T 344
2004-12-26 10:05
2005.01.16
Delphi 8


10-1076326813
Aleksandr
2004-02-09 14:40
2005.01.16
Помогите настроить WebConnection


1-1104637374
antonn
2005-01-02 06:42
2005.01.16
Меню и подменю