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