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

Вниз

мерцание в ListBox   Найти похожие ветки 

 
Gear   (2004-08-17 19:23) [0]

Добрый день, Господа! Помогите пожалуйста разобраться. Каждые 500 мс делаю ListBox1.Repaint; чтобы обновлять статус в ListBox (пытаюсь примерно реализовать такой же эффект как в ICQ online/offline)
Внизу часть недописанного кода который просто выводит иконку, логин и надпись online в каждой строчке.
Всё вроде нормально, но вижу мерцание на ListBox. Что я делаю не так и как от него избавиться?


procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
S:string;
N:Word;
begin

with (Control as TListBox), Canvas do
begin
Canvas.FillRect(Rect);
MoveTo(Rect.Left+15 + form1.ImageList2.Height, Rect.Top+3);
SetTextAlign(Canvas.Handle, TA_LEFT OR TA_UPDATECP);

S:=Items[Index];
for N:=1 to Length(S) do begin
 Windows.TextOut(Canvas.Handle,0, 0, @S[N],1);
end;

Font.Color:= clGreen;
Font.Size:=8;
Windows.TextOut(Canvas.Handle,0, 0, "   online",9);

Font.Color:=clBlue;
Rect.Bottom:=Rect.Top + form1.ImageList2.Height;
Rect.Right :=Rect.Left + form1.ImageList2.Width;
Rect.Top:=Rect.Top+2;

form1.ImageList2.Draw(Canvas,Rect.Left+8,Rect.Top,39);

end;
end;


 
Rem   (2004-08-17 19:34) [1]

Варианты:
1. Рисовать все на промежуточном Bitmap"е, а потом копировать на ListBox
2. Form.DoubleBuffered := true;
3. Не использовать таймер, а перерисовывать по факту реального изменения списка.
4. Не читать 1, 2, 3, а установить Timer.Enabled := false (а лучше вообще убрать его из проекта), забыть про Repaint и понять, наконец, что прорисовка происходит автоматически при добавлении/удалении элементов в список ListBox.


 
Gear   (2004-08-17 19:38) [2]

Rem   (17.08.04 19:34) [1]
Спасибо. Относительно 4 дело не в добавлении, а в изменении статуса. Например человек выпал из сети. На это событие необходимо логин его в ListBox отобразить синим цветом (то что описано пунктом 3).

Если можно пример небольшой по пункту 1?


 
Rem   (2004-08-17 20:00) [3]

[2]
Откуда берется информация о статусе?

Могу предположить:
1. Информация о статусе хранится в отдельном списке
2. Статус определяется в момент перерисовки, например, используется обращение к внешним компонентам.

Решение:
1. По факту изменения этого отдельного списка перерисовывать ListBox.
2. Об этом лучше забыть, так как подобное решение чревато большими накладными расходами. Я бы советовал исходить из предпосылки: вся информация должна хранится в одном месте. В крайнем случае, уж если так хочется, можно создать какой-то дополнительный "монитор", который будет следить за статусом, и вызывать перерисовку по факту изменения.

[1.1]:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
 Bitmap: TBitmap;
begin
 Bitmap := TBitmap.Create;
 try
   Bitmap.Width := Rect.Right - Rect.Left;
   Bitmap.Height := Rect.Bottom - Rect.Top;
   Bitmap.Canvas... // рисуем на Canvas"е Bitmap"а
   ...
   TListBox(Control).Canvas.Draw(Rect.Left, Rect.Top, Bitmap);
 finally
   FreeAndNil(Bitmap);
 end;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.043 c
1-1092834503
Erik1
2004-08-18 17:08
2004.09.05
Как прямо записать в структуру TMaps = set of TMap число?


14-1092743459
Григорьев Антон
2004-08-17 15:50
2004.09.05
Delphi+БД. Какую книгу посоветуете?


11-1080408399
Михаил
2004-03-27 20:26
2004.09.05
Класс Pstrlist


1-1092890049
Хыыыы
2004-08-19 08:34
2004.09.05
Unsafe type


1-1093081640
Рома
2004-08-21 13:47
2004.09.05
Что-то не то с библиотекой