TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一个名为Application的TApplication类对象.在Project Options的Applcation页中,我们可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑Applcation的代码. Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等。
一>属性: 1.bool Active: 这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回true,否则为false 2.AnsiString ExeName: 这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读. Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中的文件名部分 3.HWND Handle: 取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle. 4.TColor HintColor: 确定工具提示窗口的颜色.运行时有效 5.int HintHidePause: 确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s. 6.int HintPause: 确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为800ms 7.int HintShortPause: 确定工具提示再次显示之前所需要的等待时间.缺省值为50ms 8.TIcon Icon: 应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码: Application->Icon->LoadFromFile("e://icon//cb3.ico"); 9.TForm MainForm: 应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在Project Options的Forms页中设定.当主窗体被关闭时,应用程序将结束. 10.AnsiString Hint: 应用程序的Hint(工具提示) 11.bool ShowHint: 是否显示提示 12.AnsiString Title: 应用程序的标题,它显示在应用程序在任务栏按钮中 13.bool ShowMainForm; 是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源文件中的Application->Run()之前设定这个属性为false即可. 14.bool Terminated; 检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭. 二>方法: 1.void BringToFront(): 将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗口之前. Applcation->BringToFront(); 2.int MessageBox(char *text,char *caption,int flag); 这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的MessageBox函数. text:消息字符串,可以是多行,多行可以用"/n"隔开.如"你好!/n欢迎使用本程序." caption:对话框标题 flag:决定此对话框形式.常用的如下(位组合,用|) 按钮,决定对话窗口的基本用途 MB_OK:显示一个OK按钮 MB_YESNO:显示二个按钮:Yes或No MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略) MB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件 缺省按钮: MB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省按钮.缺省为MB_DEFBUTTON1 图标: MB_ICONSTOP:显示一个红色X图标 MB_ICONINFORMATION:最常用的提示图标,一个小写的i MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
返回值: IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICONQUESTION)==IDYES) { Close(); } 3.void Minimize() 最小化应用程序的每个窗口和当前显示的窗口 4.void Restore() 还原一个最小化的应用程序 5.void Terminate() 自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序 6.void ProcessMessages(void) 常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列中的消息 三>事件: 1.OnHint 当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提示显示 例: void __fastcall TForm1::FormCreate(TObject *Sender) { Application->OnHint = DisplayHint; } void __fastcall TForm1::DisplayHint(TObject *Sender) { StatusBar1->SimpleText = GetLongHint(Application->Hint); } //一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数 2.OnIdle: 当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格的任务. 3.OnException: 当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException 4.OnMinimize 应用程序最小化时的事件 5.OnActivate: 应用程序被激活时的事件 6.OnDeactivate 应用程序失去焦点的事件 7.OnMessage 应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件 8.OnRestore 应用程序由最小化状态恢复时的事件
TApplication应用小技巧: A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的. AnsiString filepath; filepath=ExtractFilePath(Applcation->ExeName); //ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"//",而ExtractFileDir只是在路径为根目录时最后才是"//" Table1->DatabaseName=filepath+"data"; Table1->TableName="maindb.dbf"; try{
Table1->Active=true; } catch(...) { //...... }
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)就是应用程序命令行第一部分.也就是执行文件的全路径. B.自定义异常处理窗口 缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们也可以自定义异常处理函数,以便对异常进行自定义的处理。 void __fastcall TForm1::FormCreate(TObject *Sender) { Application->OnException = HandleException; } void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception *E) { AnsiString errorstr="应用程序发生了错误./n"+E->Message; Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK); }
C.利用OnIdle事件做一些时效要求不严的任务. 我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应用程序在空闲进处理. void __fastcall TForm1::FormCreate(TObject *Sender) { Application->OnIdle = updatestatus; } void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done) { StatusBar1->SimpleText=DateTimeToStr(Now()); } 由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Application编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码即可.
D.在一个长时间的执行代码之前或之中及时处理其它消息 Form1->Label1->Caption="开始执行指定任务:"+jobname[0]; Application->ProcessMessages(); runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息  
|