![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Моргает ListView.(D7) [D7]
O'ShinW © (2013-01-17 13:27:00)Кто есть кто
procedure TfrmViewPic.FormCreate(Sender: TObject);
begin
CS := TCriticalSection.Create;
DoubleBuffered := True;
Это дергается из потока ,который считает и передаёт BMP для предпросмотра
procedure TfrmViewPic.OnNewPicAvailable(Sender: TObject; BMP: TBitmap; FileName: string);
var
LI: TListItem;
begin
CS.Enter;
try
ilSourceThumb.Add(BMP, nil);
lvThumbPic.Items.BeginUpdate; // lvThumbPic: TListView
try
LI := lvThumbPic.Items.Add;
LI.Caption := FileName;
LI.ImageIndex := lvThumbPic.Items.Count - 1;
finally
lvThumbPic.Items.EndUpdate;
end;
====================================
// lvThumbPic.Repaint;
// UpdateWindow( lvThumbPic.Handle);
// Application.HandleMessage;
Application.ProcessMessages;
====================================
finally
CS.Leave;
end;
Как надо, чтобы не моргал?
O'ShinW (2013-01-18 09:02:00) [1]
> Что, и Application.ProcessMessages тоже "дергается из потока"
> ?
нет, конечно :)
> Rouse_ ©
Спасибо, глянул. Да, не моргает!
На будущее пригодится.
Жаль, что это уже "сдал - приняли"
Rouse_ (2013-01-17 21:26:00) [2]
> Сергей М. © (17.01.13 21:21) [10]
> Т.е поведение там перекрыто ?
Угу, начиная с шестой версии CommCtrl32. Я просто разгребал это все в свое время по поводу SysListView32 плотно (см ссылку выше) и еще помню нюансы. А переход с дельфевой буферизации на "через стили", если память не изменяет, была сделана в 2006-ой дельфе и именно с нее DoubleBuffered в данном контроле, в самом VCL начинает работать немного по другому.
Сергей М. (2013-01-17 21:21:00) [3]
> Rouse_ © (17.01.13 19:59) [9]
Т.е поведение там перекрыто ?
Спасибо, Саш, верю на слово, посыпаю свою лысину позорным пеплом и впредь имею ввиду)
Rouse_ (2013-01-17 19:59:00) [4]
> потому и листвью.даблбуфферед есть седло)
Не Серег :) При выставлении буферизации у ListView у данного оконного контрола включается расширенный стиль LVS_EX_DOUBLEBUFFER, который к дельфийской буферизации, реализованной через (как ты говоришь) "седло", отношения не имеет :)
Сергей М. (2013-01-17 19:57:00) [5]
> Rouse_ © (17.01.13 19:12) [5]
Двойная буферизация нужна для оптимизации отрисовки безоконныхконтролов, чей парент есть оконныйконтрол, свойство DoubleBuffered которого рассматривается.
На листвью у топикстартера нет никаких безоконных контролов, потому и листвью.даблбуфферед есть седло)
Rouse_ (2013-01-17 19:14:00) [6]ЗЗЫ: кстати не посмотрел что у тебя семерка, тогда попробуй вопользоваться вот этим: http://rouse.drkb.ru/components.php#gslistview
здесь уже нормальная буферизация используется от комконтролов...
Rouse_ (2013-01-17 19:13:00) [7]ЗЫ: DoubleBuffered выставляй не у формы, а непосредственно у контрола.
Rouse_ (2013-01-17 19:12:00) [8]
> Сергей М. © (17.01.13 15:19) [2]
>
> > DoubleBuffered := True;
>
>
> Для TWinControl'а это как для коровы седло.
Угу, но только не для ListView, у которого буферизация реализуется на уровне системы (в случае если темы включены) :)
Сергей М. (2013-01-17 17:16:00) [9]
> Это дергается из потока
Что, и Application.ProcessMessages тоже "дергается из потока" ?
ну тогда ССЗБ)
O'ShinW (2013-01-17 17:01:00) [10]UpdateItems - Моргает все равно.
Ладно, оставлю, работает же.
Спасибо!
Сергей М. (2013-01-17 15:19:00) [11]
> DoubleBuffered := True;
Для TWinControl'а это как для коровы седло.
clickmaker (2013-01-17 14:53:00) [12]UpdateItems.UpdateItems(LastIndex, LastIndex) вместо Repaint
или попробуй DoubleBuffered