![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прорисовка одной строки в ListBox'e [D7, WinXP]
Slaga © (2006-02-20 18:45:00)Добрый вечер, такой у меня вопрос.
Я использую некую разновидность ListBoxа (TcxMCListBox), но вопрос у меня впринципо по ListBox, а именно:
я изменяю запись в ListBox
ListBox.Items.String[1] := 'test';
это у меня делает около 20 потоков практически паралельно, тоесть часто, и от постоянного изменения лисбокса он мерцает, очень неприятно.
А все потому что он полностью перерисовывается.
Как мне перерисовавывать только одну обновляемую строку а несь листбокс ?
slaga (2006-02-21 14:09:00) [1]спасибо
Leonid Troyanovsky (2006-02-21 13:44:00) [2]
> Slaga © (20.02.06 18:45)
> Как мне перерисовавывать только одну обновляемую строку
> а несь листбокс ?
Прежде всего, у него должен быть Style = lbOwnerDraw*.
Далее, отображаемый текст должен храниться не в Items,
а, например, в sl : TStringList. Т.е., OnDrawItem:
{Кол-во пустых строк в листбоксе равно sl.Count}
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with Control as TListBox do
begin
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left, Rect.Top, sl[Index]);
end;
end;
Тогда, после изменения значения sl[i] достаточно сделать:
var
r: TRect;
..
r := ListBox1.ItemRect(i);
InvalidateRect(ListBox1.Handle,@r, False);
--
Regards, LVT.
Slaga (2006-02-21 13:18:00) [3]спасибо, надо попробовать
clickmaker (2006-02-21 12:06:00) [4]
> Как мне перерисовавывать только одну обновляемую строку
> а несь листбокс ?
SendMessage(LB.Handle, LB_GETITEMRECT,0, Rect);
InvalidateRect(LB.Handle, Rect, 0, FALSE);
можно заюзать ListView, у него есть метод для обновления только диапазона строк