TApplicaton封装了标准API WndProc过程.每次创建工程时,C++Builder都会自动创建一
个名为Application的TApplication类对象.在Project Options的Applcation页中,我们
可以设置这个Application的Title(标题)和Icon(图标).也可以在工程源文件中编辑App
lcation的代码.
, G- U# g. l+ e3 z& M; ^Application对象不是需要经常使用.下面是TApplcation比较常用的方法和属性/事件等
) i2 K) E5 c5 |. I9 Z3 r。
3 Z3 F z# V( E) y7 B$ C一>属性:
1.bool Active:
这个属性是一个运行时才有效的只读属性.当应用程序处于激活状态且有焦点时它返回t
( K9 O" U' S- O orue,否则为false
$ R/ I! f8 G5 N$ y2.AnsiString ExeName:
这是一个常用的属性.它返回应用程序的全路径执行文件名.运行时有效,只读.
Label1->Caption=ExtractFileName(Applcation->ExeName);//取得执行文件全文件名中
的文件名部分
3 Z6 o& C3 _$ W8 C9 @2 G+ e3.HWND Handle:
取得应用程序的窗口句柄.调用API时可能需要.这个句柄是不可见的应用程序的窗口句柄
,而不是主窗口的句柄.要取得主窗口句柄,可以用Application->MainForm->Handle.
4.TColor HintColor:
, i+ M& t3 m. O- Y* m8 I确定工具提示窗口的颜色.运行时有效
: {$ e& y! p' S0 x5 u: R6 ~5.int HintHidePause:
确定显示工具提示后的工具提示显示持续时间,缺省值为2.5s.
6.int HintPause:
0 |3 [, L( c$ t7 f3 Q1 f确定工具提示显示之前需要的停顿时间.也就是工具出现所需要的等待时间.缺省值为80
0ms
7.int HintShortPause:
5 ~2 Q4 ?+ Z9 d7 Q( t9 A% T确定工具提示再次显示之前所需要的等待时间.缺省值为50ms
( g8 S0 ^6 A- Z( `8.TIcon Icon:
& E! D* j- s$ V( C/ M) C应用程序的图标.此Icon出现在应用程序的任务栏窗口按钮上.并作为在文件浏览器中应
用程序的图标.一般在Project options中的Applition标签中设定.当然也可以用代码:
) s! c3 t) t6 ~/ L! C( |Application->Icon->LoadFromFile("e:\\icon\\cb3.ico");
9.TForm MainForm:
( e9 \ W. H& \* ~# X7 }0 u应用程序的主窗体.这是一个只读的属性.主窗体就是应用程序最先创建的窗体.可以在P
roject Options的Forms页中设定.当主窗体被关闭时,应用程序将结束.
1 `, h( u( n0 g8 F5 I6 u8 ]1 s10.AnsiString Hint:
9 ~$ [4 h' u; S- T应用程序的Hint(工具提示)
11.bool ShowHint:
* ]4 F, ?3 T3 |1 j- U; h是否显示提示
12.AnsiString Title:
& O* c* q; F8 `- x应用程序的标题,它显示在应用程序在任务栏按钮中
13.bool ShowMainForm;
是否显示主窗口,缺省为true.当我们想建立一个不显示主窗口的应用程序时,在工程源
' k( a2 m% t! K, y) p文件中的Application->Run()之前设定这个属性为false即可.
8 I2 g! H! {/ s* r+ [14.bool Terminated;
检查应用程序是否已收到关闭消息.如果为true,表示应用程序即将关闭.
4 g! P: _; G+ L3 D" r! L5 c* r二>方法:
" ~* i2 w/ z/ z/ c' c2 ]1.void BringToFront():
将应用程序置于激活状态并且拥有焦点.它将使用应用程序的窗口置于其它应用程序的窗
口之前.
: _" B& U& K+ n' P9 s) c0 \3 {5 gApplcation->BringToFront();
2.int MessageBox(char *text,char *caption,int flag);
这是最常用的方法了.显示一条消息的对话框,可以有一个或多个按钮.它封装了API中的
9 Z+ |8 e/ T) Q3 J3 T4 s+ U2 t& YMessageBox函数.
; j D) j' d; p# _text:消息字符串,可以是多行,多行可以用"\n"隔开.如"你好!\n欢迎使用本程序."
caption:对话框标题
8 k6 ?$ w$ ^7 }9 Y7 yflag:决定此对话框形式.常用的如下(位组合,用|)
# z5 r9 w: W D' B! f/ b按钮,决定对话窗口的基本用途
3 p3 l7 H* r4 F; }MB_OK:显示一个OK按钮
MB_YESN显示二个按钮:Yes或No
MB_YESNOCANCEL:显示三个按钮,YES/No/Cancel
MB_ABORTRETRYIGNORE:显示三按钮:Abort(中止)/Retry(再试)/Ignore(忽略)
0 S! \) ~3 c# z* h1 B2 ]4 AMB_HELP:显示帮助按钮,当按F1或点按钮时触发Help事件
) k2 g& b, B: V) p' Q缺省按钮:
3 q* Q& K& S$ M+ q; l+ t9 a2 dMB_DEFBUTTON1/MB_DEFBUTTON2/MB_DEFBUTTON3/MB_DEFBUTTON4:决定哪一个按钮为缺省
$ H$ t; Q3 H, j按钮.缺省为MB_DEFBUTTON1
: v+ v! q; M# M8 `- q( c: ^图标:
; S3 ~6 ^( w0 fMB_ICONSTOP:显示一个红色X图标
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
$ p& \- W, j6 P9 O+ _& F返回值:
1 Q; I3 [ L6 w9 t9 p+ V+ d0 oIDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
if(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
NQUESTION)==IDYES)
{
' J& R% q4 n; d# V+ K; VClose();
! {$ x' f8 ^& |8 R) a2 \}
8 i7 A" C5 i1 x4 B$ F3.void Minimize()
* u+ B, @' R: R e' S9 Y( w, w7 n- G最小化应用程序的每个窗口和当前显示的窗口
5 e( c9 c8 `6 ]# q7 z4 _$ \" @8 k, s4.void Restore()
" }, E( |: u I$ b( v/ ^) A还原一个最小化的应用程序
5.void Terminate()
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
6.void ProcessMessages(void)
' L/ i0 O6 g! P n$ O常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
返回值:
6 Y1 S; P9 Q1 }# M; h- a( T* h按钮.缺省为MB_DEFBUTTON1
$ r' ^* h7 w8 N- O图标:
MB_ICONSTOP:显示一个红色X图标
MB_ICONINFORMATION:最常用的提示图标,一个小写的i
MB_ICONQUESTION:当MB_YESNO使用时这是最常的图标,显示一个问号图标
返回值:
IDABORT/IDCANCEL/IDIGNORE/IDNO/IDOK/IDRETRY/IDYES:表示用户按了哪个按钮返回.
- q5 e, W0 _+ u) {7 Wif(Appliation->MessageBox("你是否真的退出本程序?","关闭程序",MB_YESNO|MB_ICO
2 @& X _; F6 W6 ]6 q5 tNQUESTION)==IDYES)
{
4 J. S' e% q- Z# ` ?4 D Q+ yClose();
9 S. L9 d8 p) [9 d" A" D. N. H9 \ `}
3.void Minimize()
( e- ?* Q: A: S) b3 U: u最小化应用程序的每个窗口和当前显示的窗口
4.void Restore()
2 j1 S. d; v( I7 }还原一个最小化的应用程序
5.void Terminate()
自动调用API函数PostQuitMessage发送一个WM_QUIT消息以关闭应用程序
6.void ProcessMessages(void)
常用方法,在长时间循环中调用它以让应用程序及时处理消息.它可以立即处理消息队列
9 ]$ ]! I' j6 ~+ Y中的消息
6 ?0 e; R6 \+ r* H# `/ I P三>事件:
6 c+ I% d8 I! ?5 _1.OnHint
* K1 L+ F. ~9 z+ G% H( ^( }当应用程序的提示要显示时的事件.我们也可以将它指向自定义的函数中作特殊的工具提
示显示
4 ~% j5 n A. n" A$ u! \$ i4 Y: l例:
void __fastcall TForm1::FormCreate(TObject *Sender)
9 _+ ~$ z5 l0 G9 m0 \, |{
Application->OnHint = DisplayHint;
}
" H" R& M4 u4 z& A5 K3 Hvoid __fastcall TForm1:
isplayHint(TObject *Sender)
{
StatusBar1->SimpleText = GetLongHint(Application->Hint);
0 }' f2 j/ m- Y- t3 h* o9 s3 ]5 V5 u}
//一个Hint可以包含由|字符分隔的二部分.GetShortHint是另外一个函数
2.OnIdle:
2 w* j0 X+ J% A' G) ^4 ]0 M当应用程序空闲时的事件.通常在这时候作一些不重要的状态检测或处理要求不是很严格
" P4 R$ n: J% ]的任务.
% p3 W$ D5 P& O, U: E* i3.OnException:
$ o2 f0 d" c1 K' _当应用程序发生异常时.你也可以自定义一个异常处理过程而不用缺省的ShowException
' i8 o9 j2 M$ x+ _
4.OnMinimize
8 `: B' a+ \& A3 U! @7 \应用程序最小化时的事件
# F2 \$ e0 P; G( z5.OnActivate:
应用程序被激活时的事件
, o. j( R8 L% r6.OnDeactivate
应用程序失去焦点的事件
7.OnMessage
3 Y7 L5 h# O, I. n应用程序接收到消息时的事件.如果你想作特定的消息处理.你可以按管这个事件
3 ]* G0 N4 {. [' m8.OnRestore
0 y: W1 I' d) W5 r$ K; p应用程序由最小化状态恢复时的事件
TApplication应用小技巧:
A.打开相对路径数据文件.通常要打开的数据文件(如程序需要使用的DBF数据文件,TXT
( f4 H) c9 M! o2 _) k8 S/INI文件等)都不是固定路径,而是相对于应用程序的安装目录变化的.
AnsiString filepath;
filepath=ExtractFilePath(Applcation->ExeName);
//ExtractFilePath与ExtractFileDir是有区别的.表现在ExtractFilePath最后总是有"
\\",而ExtractFileDir只是在路径为根目录时最后才是"\\"
Table1->DatabaseName=filepath+"data";
Table1->TableName="maindb.dbf";
4 R) t, Q" H4 T: r: A: ztry{
3 x+ s0 O; |) A: j3 N& wTable1->Active=true;
; X$ L" r; P( D# D8 n f( @}
catch(...)
3 ~4 k% h- G2 v" [/ r* Q+ K4 Q{
! x6 ~" v$ [ z) J//......
( v' t5 O/ J h- `- Z d}
另外有一个函数ParamStr(int index)与Application->ExeName有同样效果.ParaStr(0)
" ^' f! S: ^" |- R B" w就是应用程序命令行第一部分.也就是执行文件的全路径.
* f) m, s9 q1 m' w" o' iB.自定义异常处理窗口
缺省异常处理窗口是用ShowException显示的一个窗口,其标题为应用程序的Title.我们
1 w( {8 h% L# j, Q也可以自定义异常处理函数,以便对异常进行自定义的处理。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnException = HandleException;
}
. r: ~* W/ e( ]void __fastcall TForm1::HandleException(TObject *Sender,SysUtils::Exception
+ k( L; ~* \/ C( h% l( C* L*E)
# X& U2 H. J i4 r1 p{
AnsiString errorstr="应用程序发生了错误.\n"+E->Message;
Application->MessageBox(errorstr.c_str(),"发生异常",MB_OK);
}
( l: ~# k2 l9 bC.利用OnIdle事件做一些时效要求不严的任务.
我们用Timer定时处理一些事务。但Timer是要占一定CPU时间的,对应用程序的执行效率
有一定影响。如果这个要处理的事务并不十分重要.我们就可以放在OnIdle中处理。让应
1 |9 w% X, O0 K" q3 N用程序在空闲进处理.
8 u2 M; {% Y$ W6 D# g ) x& X, r+ `9 D2 N9 Bvoid __fastcall TForm1::FormCreate(TObject *Sender)
{
& c# w: L3 \5 M. T6 V% u$ W8 q! r4 rApplication->OnIdle = updatestatus;
}
void __fastcall TForm1::updatestatus(TObject *Sender,bool &Done)
* A! e3 W$ ]8 q1 _0 W9 M: |{
( l) O [2 i5 o2 L1 KStatusBar1->SimpleText=DateTimeToStr(Now());
* _ @3 H) U, y% M. i}
由于C++Builder5已经将Application做到了控件选取面板上。这使得我们对Applicatio
9 a! M! p- X! G5 H* m8 ?n编程比以前方便了不少。以上的方法对cb5以前的版本是很适用的。如果是C++Builder
$ g. T3 e2 M: m, a/ ]' B& H5,我们也不用这么麻烦地写代码了,直接在Application控件的对应事件中写处理代码
" G' C9 r! K2 Y% f. [2 ~即可.
D.在一个长时间的执行代码之前或之中及时处理其它消息
Form1->Label1->Caption="开始执行指定任务:"+jobname[0];
8 V# X$ p: h- K! |4 y3 fApplication->
rocessMessages();
runjob(0);//假设runjob是一个长时间的任务处理函数,在执行中不处理系统消息
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |