Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.10.2008, 22:09
Izhic Izhic вне форума
Прохожий
 
Регистрация: 21.10.2008
Сообщения: 11
Репутация: 10
Сообщение Как ускорить отрисовку TListBox ?

Нашёл такой текст, а как этим пользоваться понять не могу. У меня при передвижении с multiselect'om происходят ужасные полосы. Вероятно да так и есть когда происходит exchange сначала становится фоновым цвет, а далее я снова выделяю. Как вариант может как то отключить снятие селектов при exchange'е можно?

Цитата:
Предположим ListBox имеет в своем списке два элемента, элемент 0 имеет фокус, активен другой компонент и вы щелкаете на элементе 1. При этом происходит *ПЯТИКРАТНЫЙ* вызов OnDrawItem, смотрите сами изменения состояний двух элементов:

Index State
0 [odSelected, odFocused]
0 [odSelected]
0 []
1 [odSelected]
1 [odSelected, odFocused]

В случае единственного элемента в списке ListBox получается конфуз, поскольку при щелчке на нем вы получаете тот же самый сценарий, только вместо двух индексов присутствует один, нулевой.
Имея эту информацию, вы можете минимизировать количество вызовов процедуры отрисовки. Для примера, в не-multi-select ListBox, элемент не нужно отрисовывать, если его состояние = [odSelected], поскольку это состояние всегда сопровождается НЕ selected НЕ focused, или ОДНОВРЕМЕННО selected и focused. В этом вам поможет технология отслеживания в обработчике OnDrawItem предыдущего отрисованного элемента, и если предыдущий запомненный элемент равен текущему, то отрисовывать его необязательно, например:

...
const
LastIndex: LongInt = -1;
begin
IF Index = LastIndex THEN
...
ELSE
...
LastIndex := Index;
end;

Я покавот так вот сделал, в принципе тоже самое что и вообще ни чего не писать:

Цитата:
with (Control as TListBox).Canvas do
begin

if odSelected in State then
begin
Brush.Color:=rgb(88,88,255);
end
else
begin

Brush.Color:=clBlack;
Font.Color:=rgb(0,255,0);
end;
Windows.FillRect(Handle,Rect,Brush.Handle);
TextOut(Rect.Left,Rect.Top,(Control as TListBox).Items[Index]);
end;
__________________
Улёттттттттттттт!!!!
Ответить с цитированием
  #2  
Старый 29.10.2008, 22:27
Izhic Izhic вне форума
Прохожий
 
Регистрация: 21.10.2008
Сообщения: 11
Репутация: 10
По умолчанию

Дак вот зачем они нужны . Целый вечер убил. Однако пока ещё заметно мелькание(намного меньшее), за пределами multiselect. Т.е. не выеленный текст. КАк чтобы вообще не мелькало? ТоваристЧи, Есть идея? Пожалуйста....
Items.BeginUpdate;
<code></code>
Items.EndUpdate;
__________________
Улёттттттттттттт!!!!
Ответить с цитированием
  #3  
Старый 29.10.2008, 23:04
Аватар для Wipahacker
Wipahacker Wipahacker вне форума
Начинающий
 
Регистрация: 01.06.2007
Адрес: ДОНЕЦК
Сообщения: 112
Репутация: 10
По умолчанию Отрисовка элиментов

Код:
procedure TForm1.Button1Click(Sender: TObject);

var

S : String;

begin

// Очистка

ListBox1.Clear;

S := 'C:\Windows\*.bmp';

// Даем команду листбоксу чтобы он нашел все картинки в папке Windows

// и занес их имена к себе

ListBox1.Perform(LB_DIR, DDL_READWRITE, Longint(@S[1]));

end;

 

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

begin

with (Control as TListBox).Canvas do

begin

   // очищаем прямоугольник

   FillRect(Rect);

   // В зависимости от индекса - определяем цвет

   Font.Color := clBlack;

   case Index of

     0: Font.Color := clBlue;

     1: Font.Color := clRed;

     2, 4: Font.Color := clGreen;

   end;

   // Выводим текст

   TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]);

end;

end;

end.
Ответить с цитированием
  #4  
Старый 30.10.2008, 21:12
Izhic Izhic вне форума
Прохожий
 
Регистрация: 21.10.2008
Сообщения: 11
Репутация: 10
По умолчанию

Да Wipahacker эту заметку видел спасибо

надо наверное обрабатывать изменяющих положение элеменов, то обрабатывать. Тогда только оселекченные элементы буду мерцать. А
это уже не так страшно, наверное

ЗЫ://Кстати у Винампа всё же уловил слабое мерцание.
__________________
Улёттттттттттттт!!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025