Форум: "Начинающим";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
ВнизМоргает ListView.(D7) Найти похожие ветки
← →
O'ShinW © (2013-01-17 13:27) [0]Кто есть кто
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;
Как надо, чтобы не моргал?
← →
clickmaker © (2013-01-17 14:53) [1]UpdateItems.UpdateItems(LastIndex, LastIndex) вместо Repaint
или попробуй DoubleBuffered
← →
Сергей М. © (2013-01-17 15:19) [2]
> DoubleBuffered := True;
Для TWinControl"а это как для коровы седло.
← →
O'ShinW © (2013-01-17 17:01) [3]UpdateItems - Моргает все равно.
Ладно, оставлю, работает же.
Спасибо!
← →
Сергей М. © (2013-01-17 17:16) [4]
> Это дергается из потока
Что, и Application.ProcessMessages тоже "дергается из потока" ?
ну тогда ССЗБ)
← →
Rouse_ © (2013-01-17 19:12) [5]
> Сергей М. © (17.01.13 15:19) [2]
>
> > DoubleBuffered := True;
>
>
> Для TWinControl"а это как для коровы седло.
Угу, но только не для ListView, у которого буферизация реализуется на уровне системы (в случае если темы включены) :)
← →
Rouse_ © (2013-01-17 19:13) [6]ЗЫ: DoubleBuffered выставляй не у формы, а непосредственно у контрола.
← →
Rouse_ © (2013-01-17 19:14) [7]ЗЗЫ: кстати не посмотрел что у тебя семерка, тогда попробуй вопользоваться вот этим: http://rouse.drkb.ru/components.php#gslistview
здесь уже нормальная буферизация используется от комконтролов...
← →
Сергей М. © (2013-01-17 19:57) [8]
> Rouse_ © (17.01.13 19:12) [5]
Двойная буферизация нужна для оптимизации отрисовки безоконных контролов, чей парент есть оконный контрол, свойство DoubleBuffered которого рассматривается.
На листвью у топикстартера нет никаких безоконных контролов, потому и листвью.даблбуфферед есть седло)
← →
Rouse_ © (2013-01-17 19:59) [9]
> потому и листвью.даблбуфферед есть седло)
Не Серег :) При выставлении буферизации у ListView у данного оконного контрола включается расширенный стиль LVS_EX_DOUBLEBUFFER, который к дельфийской буферизации, реализованной через (как ты говоришь) "седло", отношения не имеет :)
← →
Сергей М. © (2013-01-17 21:21) [10]
> Rouse_ © (17.01.13 19:59) [9]
Т.е поведение там перекрыто ?
Спасибо, Саш, верю на слово, посыпаю свою лысину позорным пеплом и впредь имею ввиду)
← →
Rouse_ © (2013-01-17 21:26) [11]
> Сергей М. © (17.01.13 21:21) [10]
> Т.е поведение там перекрыто ?
Угу, начиная с шестой версии CommCtrl32. Я просто разгребал это все в свое время по поводу SysListView32 плотно (см ссылку выше) и еще помню нюансы. А переход с дельфевой буферизации на "через стили", если память не изменяет, была сделана в 2006-ой дельфе и именно с нее DoubleBuffered в данном контроле, в самом VCL начинает работать немного по другому.
← →
O'ShinW © (2013-01-18 09:02) [12]
> Что, и Application.ProcessMessages тоже "дергается из потока"
> ?
нет, конечно :)
> Rouse_ ©
Спасибо, глянул. Да, не моргает!
На будущее пригодится.
Жаль, что это уже "сдал - приняли"
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c