Delphi(程序人生)

Delphi Programer DoubleCat

导航

Application

1,TApplication定义在Forms单元中TComponent->TApplication

2,只有基于窗体的Delphi应用程序才有全局Application对像,Console(控制台)程序与服务程序没有Application对像,一个EXE只有一个Application全局对像.

3,Application可做为属主对像创建组件,当Application释放时,会先自动释放他的从属对像,如果组件的属主为nil则要手工释放,否则有可能造成内存泄漏,

在这里也说明了,Application.CreateForm(TForm1,Form1)与Form1:=TForm1.Create(Application)是相同的,而与Form1:=TForm1.Create(nil)是有区别的,主要是

属主对像的区别,特别是做Logo窗口与Login窗口时,窗体的属主必须是nil,下面是一段Login窗体的DPR文件代码可以叁考使用

-----------------------------------------------------------------

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {FrmLogin},
  DataMoudle in 'DataMoudle.pas' {DataModule2: TDataModule},
  Main in 'Main.pas' {MainForm};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TDataModule2, DataModule2);//必须先建立数据模块才能使用数据连接
  FrmLogin := TFrmLogin.Create(nil);
  FrmLogin.ShowModal;//FrmLogin关掉后才会执行下面的代码
  if FrmLogin.Tag = 1 then
    Application.CreateForm(TMainForm, MainForm);//第一个窗体不用Show他自己就会显示出来,他就是主窗体,
  FrmLogin.Free;//必须手工调用Free
  Application.Run;

end.

-----------------------------------------------------------------

下面的代码是做Logo窗口,并且二个窗口有延时启动

-----------------------------------------------------------


注意二个过程
1,如下是写在Project里面的
begin
  Application.Initialize;
  Splash:=TSplash.Create(Application);   //创建Splash
  Splash.Show;                           //显示Splash
  Splash.Update;                         //更新Splash
  Application.CreateForm(TForm1, Form1);
  Splash.Free;                           //删除Splash
  Application.Run;
end.
2,如下是写在主窗体里面的
procedure TForm1.FormCreate(Sender: TObject);
var
CurTime:LongWord;
DelayTime:LongWord;
begin
//设置延迟时间为5秒
DelayTime:=5000;
CurTime:=GetTickCount;
while(GetTickCount<(CurTime+DelayTime))do;
//在这儿可以加上应用程序的初始化过程
end;
其实上面GetTickCount函数是取得开机以来过的时间秒数
只写一行Sleep(5000)就行了.
-----------------------------------------------------------

4,Application.ExeName->返回EXE文件的全路径名与文件名,

 ①可以用ExtractFilePath(Application.ExeName)取EXE的全路径名后面代'\'号,

②ExtractFileName(Application.ExeName.)取EXE的文件名,

③ExtractFileExt(Application.ExeName)取EXE的扩展名

④ExtractFilePath(ParamStr(0))=ExtractFilePath(Application.ExeName)在EXE使用桌面快捷方式时,请用ExtractFilePath(ParamStr(0))来取EXE的全路径

5,Application.MainForm应用程序的主窗体,只读属性,只能通过Project->Options->MainForm来指定,或是手工改写DPR文件.

6,Application.Handle提供了对应用程序主窗口的句柄访问,Handle属性是一个HWND(标识WIN32 API的窗口句柄)

7,Application.ShowMainForm设置应用程序启动时是否显示主窗体,一旦把它设为False应用程序看到不任何界面,在桌面的任务栏里也没有应用程序的信息

只有在进程中结束,

8,Application.CreateFormw创建一个窗体实例.

9,Application.HandleException用于显示应用程序中出现异常的有关信息,如果希望用自己的方式显示异常信息,可以使用Application.OnException事件

10,Application.ProcessMessage用于从Windows消息队列中检索任何等待处理消息并进行处理,当使用Progress组件时,要使用此属性否则进度条显示不正常.

11,Application.Terminate终止应用程序的执行,Application.Terminate会调用Windows的PostQuitMessage向应用程序的消息队列中发一个退出消息(WM_Quit),VCL

据此消息释放应用程序所创建的所有实例.

关于代码终止还有如下几个方法

①Exit->如果它写在DPR里,将终止应用程序,如果写在单元代码里,不执行Exit后面的代码,返回程序入口点,并不关闭应用程序.注意:如果在 try 块中,except 和 finally 中的代码会被执行.
②Halt->不论写在哪里,立刻中断应用程序,而且不释放资源,用的是Windows的API直接杀死应用程序进程

③Break->跳出一个循环

④Continue->跳过当前循环,续继执行下一个循环

⑤RunError(i:Word)->不论你写在DPR还是Unit终止程序运行,并产生一个运行期错误,错误号最大只能为255

⑥Abort->这个方法定义在SysUitls里,终止程序运行,但并不关闭应用程序,如果写在DPR里,会关闭应用程序,并报错,写在UNIT里与Exit相当,只不过执行指针停在原处.如果在 try 块中,except 和 finally 中的代码会被执行.

并不返回程序入口处.

⑦GoTo语句->我一直喜欢GoTo语句,我想和我一样从DOS时代写过来的人都喜欢GoTo语句吧,不知道哪个神经病先说的,不要使用GoTo语句,GoTo语句相当自由,想

去哪儿执行就去哪儿执行,不可以跨语句块执行,标签必须定义在语句块内,下面出一个GoTo语句的例子1+.2+..100

procedure TForm1.Button1Click(Sender: TObject);
Label AA;//前面不要加任何申明
var
  sum, i : Integer;
begin
  sum:=0;
  i:=0;
  AA://一个goto标签只能使用一次
  sum := sum + i;
  Inc(i);
  if i<=100 then goto AA;
  Caption:=IntToStr(sum);
end;

12,Application.OnMessage  Windows发往应用程序的所有消息都要经过这个事件

下面举个例子,让所有窗口不能移动,这个功能在工程中很常用到

//----------------------------------------------------------------------
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);//不要把这个Handled设为True
begin
  if (Msg.message=161) then Msg.message := 0;//这样窗口不动能,当然窗口上的按钮也不起作用
end;
//-------------------------------------------------------------------------

 

当然,如果要让窗体上按钮可以用,那要拦截每个窗体的消息,代码如下

//---------------------------------
procedure TF_UserCheck.LockForm(var MSG: TMessage);  //message WM_NCHITTEST;
begin
  inherited;
  if (MSG.Result=2) then Msg.Result:=HTCLIENT;
end;
//------------------------------------

 

13,Application.OnException,当应用程序中的无句柄异常发生时,就会触出此事件,可以在这个事件内给出提示.

--------------------------------------------------------------------------------------------------------------------------

DoubleCat QQ:28088191




posted on 2008-06-10 01:40  DoubleCat  阅读(718)  评论(0)    收藏  举报