Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1104369181
TButton
2004-12-30 04:13
2005.01.16
onHelp


1-1104514527
Cheguevara
2004-12-31 20:35
2005.01.16
Как юзануть канву в имэдже чтоб сделать прозрачный пиксель


1-1103914510
olookin
2004-12-24 21:55
2005.01.16
У меня тоже вопрос... По массивам...


9-1096361464
VasyaPupkin
2004-09-28 12:51
2005.01.16
DelphiX


3-1102935792
Barsky
2004-12-13 14:03
2005.01.16
Как изменить параметры поля в DBF





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский