Delphi中TApplication类

Delphi中TApplication类的巧用
---- Delphi是一种面向对象的编程语言,由于它采用完全集成OOP的优点,因此使它成为目前十分流

行的Windows开发工具。在Delphi包含的众多类中,TApplication是一个有着十分重要作用的类。

TApplication类是用于描述Delphi编制的应用程序的一个类。通过对这个类的灵活应用可以编制许多

有特点的程序。下面我们就举几个这方面的例子。 

---- 1 检测当前Windows程序是否被激活: 

---- Tapplication类有一个属性——Active,这个属性就可以描述当前运行的程序是否被激活,成为

Windows的焦点。检测的代码如下: 

If  Application.Active=False then
ShowMessage(’当前窗口没有被激活’);

---- 2 取得当前程序的名称: 

---- Tapplication类的EXEName属性可以返回这个可执行程序的完整文件名(包含路径)。实现的代

码如下所示: 

---- ShowMessage(Application.ExeName); 

---- 3 改变程序极小化时的标题 

---- 如果您细心观察可以发现,一些程序的标题和程序的名称并不一致,尤其是一些英文程序,窗体

的标题栏比较长,可以容纳比较多的文字,而在最小化时,往往变成了很少的几个字母。这中间起作

用的就是Tapplication类的Title属性。这个属性决定了程序最小化时的标题,而窗口中标题栏的标题

是由Form的Caption属性来决定的。其代码如下: 

  Form1.Caption:=’ 窗口的标题’;
  Application.Title:=’程序的标题’;

---- 其实我们也可以在在程序设计时指定Tapplication类的Title属性值。操作的方法是在开发环境

中拉下Project菜单,选择Options菜单时弹出如图1 (略)的对话框。在这个对话框中的Title栏中填写

程序的标题一样也可以达到这种效果。并且因为一般的工程文件都是以英文命名的,所以程序运行过

程中弹出的消息框中的标题是英文。但在指定了这个属性之后,这个程序的所有消息窗口的标题都变

为Title的值。这就使得程序看起来更加完整。 

---- 4 指明程序的主窗口 

---- Windows系统中的界面都是窗口,但一般来讲有一个主窗口。Tapplication的MainForm属性就可

以返回程序的主窗口。 

---- 5 显示消息框 

---- Delphi有许多显示消息框的函数与过程,比较常用的是ShowMessage,它用起来虽然十分方便,

但是却有一个问题,那就是这个消息框的按钮是以英文显示的。如果要生成一个含有中文显示的按钮

就要求助于Tapplication的MessageBox函数了。这个函数的原形如下: 

---- function MessageBox(Text, Caption: Char; Flags: Longint): Integer

---- 在这个函数中,前两项分别是显示的提示信息和消息窗口的标题,Flags是一个长整值,用来指

定按钮的个数及功能。熟悉Delphi的用户可能会注意到,这个函数和Delphi 3所提供的同名函数有一

点不同,那不是这个版本中字符串参数都以字符的形式给出,而不再要求将其转化成指针。我们在使

用时要注意加以区别。 

---- Application.MessageBox('需要存盘吗?','提示信息',MB_OKCANCEL); 这个语句在运行时显示

的样式如图2 (略) 所示。 

---- 最后就这个函数的返回值作一些说明,实际上这个函数返回的是一个整型的数值,而这个数值被

系统指定了具体的含义,比如:按下“确定”按钮时返回的值是“1”,而其它按钮的值列在表 1 中

。 

---- 表 1 按钮的意义及系统中对其定义的值 

按钮的意义 按下此按钮时函数返回的值
IDABORT 3
IDCANCEL  2
IDIGNORE     5
IDNO     7
IDOK     1
IDRETRY 4
IDYES 6

---- 6 控制窗口的尺寸 

---- 一般可以用窗口手柄来调整窗口的尺寸,但是也可以用Application的事件来调整。实现的方法

是用以下两个过程: 

Application.Minimized;
Application.Restore;

---- 前一个过程用来将程序的主窗口最小化,而后一个过程用来将最小化的窗口恢复到原来的尺寸。

 

---- 7 链接联机帮助文件 

---- Application的CurrentHelpFile属性能够指定当前程序所用的联机帮助文件的文件名。这个属性

经常与另一个方法联合在一起使用。举例如下:  

Application.HelpFile := '联机帮助文件名';
Application.HelpJump('联机帮助文件的主题’)

---- 通过这一命令组合,我们就能使系统弹出一个显示某主题的联机帮助文件。
 

---- 8 在程序运行时动态地创建窗口 

---- 一般情况下,窗口是在设计时加入到工程项目中的,但是有时也需要我们在程序运行时动态地加

入窗口,这就要用到Application 的CreateForm过程,举例如下: 

Form3:Tform3; //声明窗口类
Application.CreateForm(TForm3, Form3); //创建窗口

---- 9 结束程序 

---- 虽然我们可以用关闭主窗口的方法来关闭一个程序,但是更好的办法是用Application的

Terminate过程。它能够起到更彻底地关闭程序的效果。 

---- 10 Destroy 属性. 

---- 虽然Delphi提供了这一属性,但是并不提倡使用它,如果要终结程序就要调用Terminate过程,而

Destroy过程一般是用来在程序发生悬挂时来退出程序时才调用,有些类似Windows中的结束任务功能

。它不仅能关闭程序实例本身,而且还能释放程序所占用的资源,能够达到将程序彻底清除出系统的

目的。 

procedure TApplication.Terminate;
begin
  if CallTerminateProcs then PostQuitMessage(0);
end;

destructor TApplication.Destroy;
type
  TExceptionEvent = procedure (E: Exception) of object;
var
  P: TNotifyEvent;
  E: TExceptionEvent;
begin
  UnhookSynchronizeWakeup;
  P := HandleException;
  if @P = @Classes.ApplicationHandleException then
    Classes.ApplicationHandleException := nil;
  E := ShowException;
  if @E = @Classes.ApplicationShowException then
    Classes.ApplicationShowException := nil;
  if FTestLib <> 0 then
    FreeLibrary(FTestLib);
  FActive := False;
  CancelHint;
  ShowHint := False;
  inherited Destroy;
  UnhookMainWindow(CheckIniChange);
  if (FHandle <> 0) and FHandleCreated then
  begin
    if NewStyleControls then SendMessage(FHandle, WM_SETICON, 1, 0);
    DestroyWindow(FHandle);
  end;
  if FHelpSystem <> nil then FHelpSystem := nil;
  if FObjectInstance <> nil then Classes.FreeObjectInstance(FObjectInstance);
  FWindowHooks.Free;
  FTopMostList.Free;
  FIcon.Free;
end;
 
constructor TApplication.Create(AOwner: TComponent);
var
  P: PChar;
  ModuleName: array[0..255] of Char;
begin
  inherited Create(AOwner);
  if not Assigned(Classes.ApplicationHandleException) then
    Classes.ApplicationHandleException := HandleException;
  if not Assigned(Classes.ApplicationShowException) then
    Classes.ApplicationShowException := ShowException;
  FBiDiMode := bdLeftToRight;
  FTopMostList := TList.Create;
  FWindowHooks := TList.Create;
  FHintControl := nil;
  FHintWindow := nil;
  FHintColor := DefHintColor;
  FHintPause := DefHintPause;
  FHintShortCuts := True;
  FHintShortPause := DefHintShortPause;
  FHintHidePause := DefHintHidePause;
  FShowHint := False;
  FActive := True;
  FAutoDragDocking := True;
  FIcon := TIcon.Create;
  FIcon.Handle := LoadIcon(MainInstance, 'MAINICON');
  FIcon.OnChange := IconChanged;
  GetModuleFileName(MainInstance, ModuleName, SizeOf(ModuleName));
  OemToAnsi(ModuleName, ModuleName);
  P := AnsiStrRScan(ModuleName, '\');
  if P <> nil then StrCopy(ModuleName, P + 1);
  P := AnsiStrScan(ModuleName, '.');
  if P <> nil then P^ := #0;
  AnsiLower(ModuleName + 1);
  FTitle := ModuleName;
  if not IsLibrary then CreateHandle;
  UpdateFormatSettings := True;
  UpdateMetricSettings := True;
  FShowMainForm := True;
  FAllowTesting := True;
  FTestLib := 0;
  ValidateHelpSystem;
  HookSynchronizeWakeup;
end;

procedure TApplication.Initialize;
begin
  if InitProc <> nil then TProcedure(InitProc);
end;

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance;
  try
    Instance.Create(Self);
  except
    TComponent(Reference) := nil;
    raise;
  end;
  if (FMainForm = nil) and (Instance is TForm) then
  begin
    TForm(Instance).HandleNeeded;
    FMainForm := TForm(Instance);
  end;
end;

procedure TApplication.Run;
begin
  FRunning := True;
  try
    AddExitProc(DoneApplication);
    if FMainForm <> nil then
    begin
      case CmdShow of
        SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;
        SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized;
      end;
      if FShowMainForm then
        if FMainForm.FWindowState = wsMinimized then
          Minimize else
          FMainForm.Visible := True;
      repeat
        try
          HandleMessage;
        except
          HandleException(Self);
        end;
      until Terminated;
    end;
  finally
    FRunning := False;
  end;
end;

procedure TApplication.HandleMessage;
var
  Msg: TMsg;
begin
  if not ProcessMessage(Msg) then Idle(Msg);
end;
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;

http://www.openitpower.com/wenzhang/97/10954_1.html

转载于:https://www.cnblogs.com/sideandside/archive/2007/03/21/682897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值