Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

мерцание в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.032 c
6-1088778205
Vadim X
2004-07-02 18:23
2004.09.05
Как найти все Компы в сети?


8-1082840940
hiperLogun
2004-04-25 01:09
2004.09.05
Работа с mp3 форматом


14-1092769840
Sanek_metaller
2004-08-17 23:10
2004.09.05
Вопрос про выделенку


8-1087117501
Genie
2004-06-13 13:05
2004.09.05
Использование шрифта


14-1092857665
Klopan
2004-08-18 23:34
2004.09.05
А жаловаться здесь можно?





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