AlphaControls 读取存贮数据VCL OnChange事件的处理
AlphaControls控件,窗口时显示,对于VCL控件的处理,需要通过调用皮肤模板重新画出来。因此,在窗口的显示过程中,对VCL控件的数据装载(变更),会引起窗口的不段地跟随变化(画图),造成不必要的屏幕闪动,或引导死屏现象。
特别是使用读取存贮数据VCL,读取存贮数据数据时,有一定的时间,如果不考虑因素,就会造成窗口的缓慢与出错。
这是AlphaControls控件的一大隐患。(这也是皮肤控件的共性特征)
如何使用AlphaControls控件,带来C/S软件带来新鲜亮丽效果。编程中,如何改(完)善,使用AlphaControls控件,引起的囧境。通过一段时间,使用AlphaControls控件,发现在Fprm窗口显示时,特别对VCL控件的OnChange事件特别敏感,如果我们关闭OnChange事件,即在FormOnShow过程中,让窗口的VCL处于静态,有效地改善使用AlphaControls控件带来的问题。
特别是几个读取存贮数据VCL,需要等待一定时间初始化,读取系统数据的VCL反应明显。
下面就是针对,TsShellTreeView,TsDirectoryEdit和TClientDataSet关联DBGridEh内存表,初始化VCl未成形(Creat末完成),对它赋值就会出错。 一、让VCL的OnChange事件,全部改名,后缀一个Temp,这样OnChange事件作为后续再加入的(临时)事件。
procedure TUploatServerFrm.sShellTreeView1ChangeTemp(Sender: TObject;
Node: TTreeNode);
begin
FileListBox1.Directory:=sShellTreeView1.path;
Button1Click(Sender);
end;
procedure TUploatServerFrm.sDirectoryEdit1ChangeTemp(Sender: TObject);
begin
sShellTreeView1.Root:=sDirectoryEdit1.Text;
end;
二、在VCL的OnChange事件,全部为空
三、Form加入一TTimer控件,在OnShow的最后通过代码启动TTimer,等待约1000至2000稁秒,将需要OnChangeg事件的VCL,加入带后缀名的OnChangeTemp方法。
1、Timer1初始
Timer1.Enabled:=False;
Timer1.interval:=1000; // 毫秒
2、Timer1事件
procedure TUploatServerFrm.Timer1Timer(Sender: TObject);
begin
sShellTreeView1.SetFocus;
Button1Click(Sender); // DBGridEH内存表读取数据
sShellTreeView1.OnChange:=sShellTreeView1ChangeTemp; // 加入关联事件
sDirectoryEdit1.onChange:=sDirectoryEdit1ChangeTemp;
Timer1.Enabled:=False;
end;
四、OnShow处理
procedure TUploatServerFrm.OnShow(Sender: TObject);
var i:integer;
begin
......
sDirectoryEdit1.Text:=sClientDisk; // 初始化数据
sShellTreeView1.Path:=MainPath;
FileListBox1.Directory:=sShellTreeView1.path; // 关闭了OnChage 需同步数据
sShellTreeView1.SetFocus;
Timer1.Enabled:=True; // 最后启动Timer1
end;
问题基本解决。