Главная страница
    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.036 c
3-1092029381
Fynjy
2004-08-09 09:29
2004.09.05
ADOCommand


4-1090500778
юзверь
2004-07-22 16:52
2004.09.05
Как запустить процедуру, зная ее адрес??


3-1092231824
Bless
2004-08-11 17:43
2004.09.05
Как получить запись, соответсвующую максимальному значению поля


14-1092750205
Cosinus
2004-08-17 17:43
2004.09.05
Хм... А почему через стандартный OpenDialog нельзя открыть *.FON


14-1092395682
Igorek
2004-08-13 15:14
2004.09.05
Указатели в параметрах WM_ сообщений.





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