怎样防止Listview刷新闪烁?(10分)

  • 主题发起人 主题发起人 TIMDONG
  • 开始时间 开始时间
T

TIMDONG

Unregistered / Unconfirmed
GUEST, unregistred user!
With Listview
Clear all item;
For
Add Item;
Next

每次刷新都有明显的闪烁,怎样解决?
 
Timdong大虾的10分是历史上最值的10分。
以下我本人的一个程序单元,其中的第一个函数就是。对所有的TWinContrl继承类
有特效,使用时:
xSetReDraw(ListView.Handle, false);
try
With Listview
Clear all item;
For
Add Item;
Next
...
finally
xSetReDraw(Listview.handle, true);
end;




unit xCtrlFunc;

interface
uses
windows, Messages, Classes, controls, stdctrls;

procedure xSetReDraw(Handle:integer; CanReDraw : Boolean);
procedure xSetAllEmpty(Comp : TWinControl);

implementation

//uses windows;

procedure xSetReDraw(Handle:integer; CanReDraw : Boolean);
begin
SendMessage(Handle, WM_SETREDRAW, integer(CanReDraw), 0);
end;

procedure xSetAllEmpty(Comp : TWinControl);
var n, k : integer;
begin
k := Comp.ControlCount;
for n:=0 to k-1 do begin
if Comp.Controls[n] is TCustomEdit then
(Comp.Controls[n] as TCustomEdit).Text := ''
else if Comp.Controls[n] is TComboBox then
(Comp.Controls[n] as TComboBox).Text := ''
else if Comp.Controls[n] is TCheckBox then
(Comp.Controls[n] as TCheckBox).Checked := false;
end;
end;

end.
 
with ListView.Items do
begin
BeginUpdate;
try
Clear;
....
Add(...);
finally
EndUpdate
end;
end;
 
TO WiseAnt:
好人做到底吧!

我在程序中这样实现,但还是有明显闪烁现象(我是从数据库中读取数据不会有影响吧).

SendMessage(ListView.Handle, WM_SETREDRAW, integer(false), 0);
with Listview.items
clear;
for
Read data from database
add item
next
end;//with
SendMessage(ListView.Handle, WM_SETREDRAW, integer(true), 0);
 
看了你的程序。
如果在整个过程中会发生两次闪烁则是正常的,因为最后面的一句会使控件刷新。
如果发生了多次闪烁,那就是我也不能解决了。

但我要说的是,在我的程序中,我一直是这样做的。
在我的一套进销存中,我用TTreeView来做单据导航,在没有使用之前,刷新一次
需要很久的时间,这几乎与单据总数成正比。
当使用后,使刷新上千张单据在短时间成为可能。

最后要说的是,检查你的程序,另我还会帮你测一测,如有新发现我再通知你。
 
Lockwindowupdate(ListView1.Handle);
{
do anything
}
Lockwindowupdate(NULL);
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
866
DelphiTeacher的专栏
D
后退
顶部