Delphi如何从非主窗体启动

1、 Delphi如何从非主窗体启动?
    答:方法一:调用Showmodal函数来实现。Showmodal方式使一个窗口为激活窗口,和Show相似,
但它令窗口模式化。现举一例说明:
⒈开始一个新的工程,依次建立两个窗体(Form1和Form2,其中Form1为主窗体,目的是从Form2启动)
⒉为便于演示,在Form2中插入一个Label部件,设置其Caption 属性为“欢迎进入本系统”。
⒊建立两个窗体之间的关联。在单元 Uint1 的 implementation(私有区)中加入语句 uses Uint2;再为Form1创建OnActivate事件。
procedure TForm1.FormActivate (sender:TObject);
begin
Form2.Showmodal;
end;
⒋从Component模板的System类别中选择一个计时器(Timer),添加入Form2窗体中,设置其Interval属性为3000(可根据需要自定义),再为其OnTimer事件添加语句close;加入一个Timer部件目的是用以控制闪现窗口显示时间。在此,Form2显示了3秒钟后关闭,主窗口Form1自动被激活。
⒌编译、运行程序,就能得到延迟为3秒的闪现窗口。
方法二:也可以通过修改工程文件中的源代码来实现,这在Delphi 的编程中是很少见的。现举一例具体说明:
前两步同方法一。
⒊选择“Prjoect / Options”,击Option按钮,选择对话底部的Forms页栏目。注意,Form1和Form2是在“Auto-create forms”列表中。选择Form2并击右键头按钮,把这个窗体移到“Available forms”。所有的Delphi窗体通过缺省方式自动在内存中建立,因此它们要消耗内存和系统资源。在类似这里(程序运行时创建一个窗体)的情况下,你应该将窗体从自动创建列中去掉。
⒋下一步修改工程的源代码。选择“Project / View Source”,修改begin和end之间的语句如下:
程序清单:
program Project1;
uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1},
 Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
 Application.Initialize;
 Form2:=TForm2.Create(nil); //Create创建窗口对象
 Form2.Show;
 Form2.Update;
 Form2.Hide;
 Form2.Free; // Free从内存中释放对象
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.
  第一条语句创建了对象,该对象存在内存中,但还不能看见,为了让它出现并更新它的内容,调用对象的Show和Update成员函数:Show和Update。当闪现窗口使用完后,用Hide函数将它隐藏起来,然后用Free函数释放它所占据的内存。
⒌如果此刻你编译和运行程序,Form2窗口一闪而过,你可能未来得及看清。为使Form2窗口显示几秒种,我们有三种方法来解决这个问题:
1、在工程源程序的Form2.Hide; 之前调用一段延时程序。
Application.Initialize;
 Form2:=TForm2.Create(nil); //Create创建窗口对象
 Form2.Show;
 Form2.Update;
 // 在这里调用一段延时程序(如:Unit1.delay(3000) //延时3秒种)
 Form2.Hide;
 Form2.Free; // Free从内存中释放对象
 Application.CreateForm(TForm1, Form1);
 Application.Run;
2、修改工程源程序,并且为Form1(主窗体)的OnCreate 事件创建一个处理程序,延迟Form1窗口的显现时间。
1、工程源程序修改为:
 Application.Initialize;
 Form2:=TForm2.Create(nil); //Create创建窗口对象
 Form2.Show;
 Form2.Update;
 Application.CreateForm(TForm1, Form1);  // Form1的创建放在Form2的隐藏之前
 Form2.Hide;
 Form2.Free; // Free从内存中释放对象
Application.Run;
2、 Form1的OnCreate 事件程序如下:
procedure TForm1.FormCreate(Sender: TObject);
var
Start:LongInt;
begin
     Start:=GetTickcount;
repeat
      Application.ProcessMessages;
     until ((GetTickcount-Start)>=3000)
  end;
3、在工程源程序的Form2.Hide; 之前编写一段延时程序。整个工程源程序如下:
program Project1;
uses
 Windows,  // 默认的 Delphi 的工程源程序是没有的,但为了下面语句的 GetTickCount 函数此处必须添加上,否则出错
 Forms,
 Unit1 in 'Unit1.pas' {Form1},
 Unit2 in 'Unit2.pas' {Form2};
 
{$R *.res}
var
 currentTime:LongInt;
begin
 Application.Initialize;
 Form2:=TForm2.Create(nil); //Create创建窗口对象
 Form2.Show;
 Form2.Update;
 currentTime:=GetTickCount div 1000;
 while ((GetTickCount div 1000)<(currentTime+3)) do //此处的3表示延时3秒
    Application.ProcessMessages; //释放系统进程占有权
 Form2.Hide;
 Form2.Free; // Free从内存中释放对象
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.
注意:1、GetTickCount函数返回窗口启动后过去的毫秒数,这个值除以1000 转化为秒数。
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值