FormCreate、FormShow、FormActivate事件的区别与运用
一、事件的激发时段
- FormCreate在窗口的创建时激发;
- FormShow在窗体建立后,显示时触发;
- Formactivate在窗体之间切换被激活时触发;
二、运行机制
1、当窗口中创建、显示并作为当前运用(激活焦点)窗口时(三者的运行顺序)
(1)form1.onCreate
(2)from1.onShow
(3)form1.onActivate;
依次执行。
2、当窗口创建后
(1)form1.onCreate不再会执行
(2)当窗口隐藏后,再显示时from1.onShow执行
(3)当窗口再显示,但不作为当前窗口,form1.onActivate不执行,当窗口被激活(窗口作为焦点时)form1.onActivate再次执行。
3、多窗口处于显示状态时
当指定某窗口作为当前窗口(被激活),也就是窗口之间切换时,当指定为当前窗口(作为焦点被激活)时,该窗口的onActivate被执行一次。
例如使用,TPageControl嵌入多窗口时,点击PageControl切换窗口时,窗口仅是切换显示,并末激活,onActivate不执行,当鼠标点击到显示的窗口时,它被激活,此时该窗口的onActivate被执行一次。
三、onActivate实际运用场景
FormCreate、FormShow、FormActivate事件的运用,前二个非常熟悉。这里仅提示一下FormActivate事件的运用。
灵活地运用FormActivate事件,可以为用户得到良好的软件体验:
1、关联性数据的更新
2、VCL控件的切换(数据随机变更),读取默认值
例如:TPageControl多窗口,某窗口Combobox控件的选项参数,由“参数”窗口设置。当“参数”窗口修改值后,用户再返回窗口,就会执行一次FormActivate事件,Combobox控件的选项参数就会被自动更新。
上图修改“护理区域”的值,返回其它窗口,参数就会更新了。看见下图:
FormActivate事件代码:
procedure TOld_ON_Frm.FormActivate(Sender: TObject);
var SQL,S:string;
MyList:TStringList;
begin
Combobox1.Text:='';
MyList:=TStringList.Create;
SQL:='select * from 系统配置 where (分支='+#39+sFCID+#39+') and (主题=''系统'')';
DataModule1.ClientDataSet1.Active:=False;
DataModule1.ClientDataSet1.DataRequest(SQL);
DataModule1.ClientDataSet1.Active:=True;
with DataModule1.ClientDataSet1 do
begin
First;
While Not Eof do
begin
S:=Trim(FieldByName('名称').asString);
if S='护理区域' then
begin
MyList.Text:=FieldByName('Items').asString;
if MyList.Count>0 then
begin
Combobox1.Items:=Mylist;
end
end;
Next;
end;
end;
DataModule1.ClientDataSet1.Active:=False;
MyList.Free;
end;
3、多窗口之间数据保持一致
4、重要的数据需要同步显示时
5、窗口使用前需要提示时,显示相关信息
6、窗口激活时出现对话框
继续......