将一个子窗体插入另一个窗体,想过没?可能没想过.现在有了FormContainer,呵呵,梦想成真了.
开始的第一步,当然得拖一个FormContainer到被插入的窗体,即父窗体.
Formcontainer在哪?,别问我.这个东东与Panel类似,放完之后再放入其他的控件,操作也与panel差不多.
下一步,准备要插入的子窗体,在设计期,子窗体要满足一些条件:
1.BorderStyle=bsNone
2.FormStyle=fsNormal
3.WindowState=wsNormal
4.Visible=False
运行时对于使用的窗体也有一些限制:
1.不要用窗体的Show,Hide方法或Visible属性改变其可见性(visibility)
2.不能调用ShowModal,close,Destroy,Free或Release
3.不能改变Borderstyle,FormStyle与WindowState
4.OnActivate与OnDeactivate事件用标准控件的OnEnter与OnExit代替
5.OnClose事件不会被触发
6.OnClosequery只能被CloseQuery或ClosequeryAll触发
7.OnShow与OnHide只在直接或间接调用ShowForm或ShowFormEx并窗体显示或隐藏时触发
为了建立一个窗体,必须用formContainer的CreateForm方法.通过这种方法建立的窗体将作为FormContainer的子窗体,并将随其的消毁而消毁.例如:
MyForm:=TMyForm(MYFormcontainer.CreateForm(TMyForm)));
上面这行代码建立一个MyForm,类为TMyForm,它是MyFormcontainer的一个子窗体.
窗体虽然建立但依然是不可见的,为了显示它,还要通过两种方法:ShowForm与ShowFormEx.
MyFormContainer.Showform(Myform,False);
或
MyFormcontainer.ShowFormEx(MyForm,False,nil,nil,fcfaDefault);
到这我们显示了MyForm窗体,如果有以前显示的窗体,他将被隐藏,但并没有被删除.(如果要删除,随时调用DestroyForm方法并将第二个参数设为True.)
由于没用使用转换(Transition),所以不能改变BackGroundOptions.并且显示的窗体将依照设计时的设置时行排列.
所有联系到FormContainer可通过Forms属性来访问,Form返回显示的窗体.
如前所述,当FormContainer被destroy,所有与其联接的窗体也被destroy.
FormContainer自动维护一个LRU(Last Recently Used)窗体列表.可通过设置
LRUFormCapacity改变列表元素的最大值.要返回以前用过的窗体,可用:
ShowLRUForm,ShowLRUFormEx,ShowNextLRUForm,ShowNextLRUFormEx,ShowPriorLRUForm或ShowPriorLRUFormEx.
除非设置了SaveLRUDestroyedForms为True,否则Destroyed的窗体不被包含在列表中,当以前消毁的窗体需自动重新建立,FormContainer有一种机制,允许适当的初始化窗体.例如:假设你有一个窗体包含了edit控件并且你用以前用户输入的文本初始化它,则可继承TFCExtraData类和他的三个published方法.
published
function FCGetExtraDataClass: TFCExtraDataClass;
procedure FCGetExtraData(ExtraData: TFCExtraData);
procedure FCSetExtraData(ExtraData: TFCExtraData);
…
TMyExtraData = class(TFCExtraData)
public
MyEditText: String;
end;
function TMyForm.FCGetExtraDataClass: TFCExtraDataClass;
begin
Result := TMyExtraData;
end;
procedure TMyForm.FCGetExtraData(ExtraData: TFCExtraData);
begin
MyEdit.Text := (ExtraData as TMyExtraData).MyEdit.Text;
end;
procedure TFormLRUSample.FCSetExtraData(ExtraData: TFCExtraData);
begin
(ExtraData as TMyExtraData).MyEditText := MyEdit.Text;
end;
可以在演示程序的LRU.PAS单元中看到这样的例子.
如果一个子窗体有TMainMenu并设置其AutoMerge为True,当其显示时menu将与主窗体的menu(Application’s main menu)容和.
可以用图片作为FormContainer的显示背景,用不能的效果.(例子中用tiled效果),窗体的alignment可通过ShowFormEx的最后参数来控制.(如:强制窗体在FormContainer中居中,则可调用fcfaCenter).
每次可见窗体被切换时,OnFormChange事件将被触发.
隐藏当前显示的窗体也不显示其他的窗体,象下面这样调用:
MyformContainer.ShowForm(nil,False);
当显示或隐藏窗体时用转换(transition),在调用ShowFormEx时传进一个Transition参数:
var
Transition: TFuseTransition;
begin
Transition := TFuseTransition.Create;
try
Transition.Milliseconds := 500;
MyFormContainer.ShowFormEx(MyForm, False, Transition, nil, fcfaDefault);
finally
Transition.Free;
end;
end;
Delphi:用FormContainer渐变效果
为什么要写这篇短文,目的之一感谢所有帮助过我的人,之二为了让用delphi的朋友们节约点时间来看其Demo.之三是感谢那些为大家无私奉献的朋友,如DelphiVCL,saycc.keeping.coder….太多了.之四是Formcontainer作者做一下宣传,感谢他这么精彩之作,如果大家用好这个东东,一定要想办法购个正式版来用.之五,把LP给忘了:)
先看看什么是渐变效果,作者在其文档中是这样定义的:一个渐变是运行窗体从开始显示的图形到最后完成显示过程的图形效果.实际上,按我的理解,就是指一个控件在显示过程中所细化的显示过程.这里的控件,指从Tcontrols继承来的所有组件.
在Formcontainer机制中,渐变效果已经被作者抽象成一个基类TTransitionEffect,其他所有要实现的渐变效果都要从这个类继承,并处在其类的层次结构中,而非组件.为了使用一个渐变效果,我们不得不建立,配置,执行最后释放掉这个效果.
对于不同的控件所使用的渐变效果的处理过程是不同的.具体可分为以下三种情况:
一.控制标准窗体的渐变效果.
主要可分为三步:
1.拖一个TFormTransitions组件到一个窗体上;
2.然后通过窗体的Create事件,通过TFormTransitions设置窗体的显示效果;具体作法是建立一个渐变效果类实例,附值给TFormTransitions.ShowTransition.
3.利用窗体的Show或ShowModal,窗体显示时就以设置的显示效果来显示了.
下面是我从其Demo中剪出的示例代码:
procedure TMainForm.FormCreate(Sender: Tobject);
var
lTWipeTransition:TWipeTransition;
begin
lTWipeTransition:=TWipeTransition.Create;
FormTransitions.ShowTransition := lTWipeTransition;
with lTWipeTransition do
begin
Milliseconds := 3000;
BandWidth := 100;
Direction := tedDown;
end;
end;
上面的代码中,FormTransitions 是我们手工拖到要改变窗体显示效果上去的TFormTransitions组件.TWipeTransition是作者直接在FormContainer VCL中完成的渐变效果类,代码中用这个类实例lTWipeTransition 来处理窗体的显示效果.通过上面的代码,也不难想到,要使用不同的渐变效果来显示窗体,只要改变FormTransitions.ShowTransition的值就能达到. 二.插入到父窗体中的子窗体的渐变效果
按前文,为了将一个窗体插入一个父窗体,我们要用到Tformcontainer,并用其来建立被插入窗体.下面是具体的代码:
FormIntro := TFormIntro(FormContainerNavigator.CreateForm(TFormIntro));
同样,为了显示被插入的子窗体,我们不能调用子窗体的Show或ShowModal,而不得不用TFormContainer的ShowForm或ShowFormEx方法.实际上,如果要改变子窗体的显示效果,就只能用ShowFormEx显示子窗体.下面这行代码演示如何利用TransEffct效果实例显示子窗体FormIntro:
FormContainerNavigator.ShowFormEx(FormIntro, True, TransEffct, nil, Align);
到此,我们看一下完整的代码,来理解如何控制子窗体的渐变效果:
procedure TFormNavigator.Intro;
var
TransEffct: TTransitionEffect;
begin
TransEffct := TWipeTransition.Create;
TransEffct.FlickerFreeWhenDisabled := True;
TransEffct.Milliseconds := 500;
(TransEffct as TWipeTransition).BandWidth := 50;
try
FormIntro := TFormIntro(FormContainerNavigator.CreateForm(TFormIntro));
FormContainerNavigator.ShowFormEx(FormIntro, True, TransEffct,nil,Align);
finally
TransEffct.Free;
end;
end;
通过上面的代码,很容易就能看原来子窗体的显示效果是通过Formcontainer的ShowFormEX方法的第三个参数来完成.
三.控件的渐变效果
下面的代码演示如何控件一个Tmemo的显示效果:
procedure TFormIntro.ShowText;
var
TextTransition: TWipeTransition;
begin
TextTransition := TWipeTransition.Create;
try
TextTransition.Milliseconds := 2000;
TextTransition.Direction := tedDown;
TextTransition.BandWidth := 100;
TextTransition.Prepare(MemoText.Parent, MemoText.BoundsRect);
MemoText.Visible := True;
if TextTransition.Prepared then
TextTransition.Execute;
finally
TextTransition.Free;
end;
end;
从代码中可以看到,首先要为控制显示的Tmemo控件设置为不可见.一般的情况在设计期设置Visible=False.然后建立一个效果类,利用效果类对Tmemo进行Prepare,再设置Tmemo为可见,最后让效果执行.即执行效果类的Execute方法.别忘了释放声明的效果类.
到此,也无法完整说明FC-Demo,这里,只是一个总结,如果想进一步了解FC的使用,还得参考其帮助文档及Demo.当然,你会得到意外的收获.
posted on 2008-05-12 15:50 booktian 阅读(208)
评论(0) 编辑 收藏