Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизПрорисовка одной строки в ListBox e Найти похожие ветки
← →
Slaga © (2006-02-20 18:45) [0]Добрый вечер, такой у меня вопрос.
Я использую некую разновидность ListBoxа (TcxMCListBox), но вопрос у меня впринципо по ListBox, а именно:
я изменяю запись в ListBox
ListBox.Items.String[1] := "test";
это у меня делает около 20 потоков практически паралельно, тоесть часто, и от постоянного изменения лисбокса он мерцает, очень неприятно.
А все потому что он полностью перерисовывается.
Как мне перерисовавывать только одну обновляемую строку а несь листбокс ?
← →
clickmaker © (2006-02-21 12:06) [1]
> Как мне перерисовавывать только одну обновляемую строку
> а несь листбокс ?
SendMessage(LB.Handle, LB_GETITEMRECT,0, Rect);
InvalidateRect(LB.Handle, Rect, 0, FALSE);
можно заюзать ListView, у него есть метод для обновления только диапазона строк
← →
Slaga © (2006-02-21 13:18) [2]спасибо, надо попробовать
← →
Leonid Troyanovsky © (2006-02-21 13:44) [3]
> 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 14:09) [4]спасибо
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.057 c