51CTO技术论坛_中国领先的IT技术社区's Archiver

黑夜 发表于 2006-8-29 01:15

TForm的一些技巧

一、让窗口总是在最前面
] K'Z@Y     Form 的FormStyle属性设置为fsStayOnTop值。
dt)L#GAr
L+P I?Q$RL 二、 动态调用窗体Form
_yK$o9t'X6I+aa     在缺省情况下, 由File/New Form生成添加入项目文件中的 窗体都具有"Auto Create"(自动创建)的特性。即只要程序运行,该窗体就存在于 内存中了,不管当前它是否被调用。具有这种特性的窗体一般适用于窗体属性比较 固定、经常被调用的情况。其优点是速度快,缺点是占用内存。在实际程序设 计中,会遇见大量类似对话框功能的窗体,它们用于显示状态或输入信息,仅须在程 序中调用一下,完成其功能就行了,无需常驻内存。这时可以通过选择Project/Options/Forms,将"Auto--Create forms " 栏中相应的窗体, 如Form1,用" >" 键移动到 "Available forms"栏中,并在程序需调用该窗体处,加入下列语句:
a d GJSNb,b %\ M?mcWH
    TForm1  *myform=new TForm1(this); ^.G XqP
    myform- >ShowModal(); aS!fy+\'~9`V
    delete myform;
JFv!Kl GTu1W
V8s&A"][0G3K      窗体Form1仅是在需要调 用时才调入内存,调用完成后,即用delete清除出内存。这样可减少程序对内存资源 的占用。
dI8[2gQyM L\ QYT d
三、遍历窗体控件的方法 $\\"V;L r4Gh
    要访问或修改窗体上的控件,方法很简单,以TEdit为例子:
#G-o*rulA B3~3Zi h(f
    Edit1- >Text="";
yx} {(}     Edit2- >Text=""; $|oNF"yH

2ae4c&qFZv    但如果窗体上有十来个像Edit1 这样的控件,需要进行相同的初始化,用上面的方法一个一个地进行,岂不麻烦 ! 所以有必要掌握 遍 历窗 体 控 件 的 方 法。 在 介 绍 该 方 法 之   前, 让 我 们 先了 解 一 下 窗 体Form 的Components 和Controls 属 性。 参 见 表 一。
`5?"NH q9hA8fe}*Y9b
7pN#^0c\ HD                          表 一
F&ww$y3PB
/AF q!|u ^ k+TN       属性                 类型                  说明
|Hjn%Jtu5]
e] VjE   ComponentCount            Int      目前Form上各类控件的总数 p'Z E]7f4s
    Components           TCompont*   目前Form上指向所有控件的数组 upH!dD2KZC
   ControlCount             Int      目前Form上某一子区域上各类控件的总数
/k4k[!gt*b n      Controls            TControl*   目前Form上指向某一子区域上所有控件的数组 P3R0yUf.S-~!h
  
$PN \w;V~/x6R;{OR
`A-\VgR%wOU       Form1的ComponentCount=6, 而Panel1的ControlCount=4.,
|(zYS:] 'U-G Z$x5Q2U&H&^jQ
      其中:数组对象
l.r9Q@Y-e
9Q.wv4O;GD o"p@'x     Components[0]           Panel1 :Hzw] r2}2M*kn/o
    Components[1]           Label1 3]F ~%uy0tK
    Components[2]           Edit1 Txel"ibz%XZ
    Components[3]           Label2 yt1[\6ugj2s
    Components[4]           Edit2 $D H#M+G|.LrQ;n
    Components[5]           Button1
;F,q3`^KJ4Y S
%q/Z9E yM1K      数 组                        对 象
2D*U!Lq/h{ [/?   Controls[0]                     Label1
Hi6suD_2h$e   Controls[1]                     Edit1
C.t!st| wK   Controls[2]                     Label2 k4jvN.N
  Controls[3]                     Edit2
H5zW r%U mZ y    l|FIj5tI6A

K\)U%`e   下面这段代码完成了对Panel1上所有TEdit 控件的遍历初始化。读者稍加修改,即可对其它控件进行遍历。这里有一个小技巧, 我们把需要进行初始化的控件放置在了一Panel1上,与不需要初始化的控件区分开 来,这样便于编程。
k']X}LB9lO0WT
8Pe3P.PC#b3FB3o    AnsiString namestring="TEdit";
T2P4\*G}8u    for(int i=1;i ControlCount;i++)
-]+r/I ve(x      {
z.op r6K      if(Panel1- > Controls[i]- > ClassNameIs(namestring))
2D\:i\ }        {
-?8R p.M;vdF-eRA        TEdit *p=dynamic_cast  (Panel1- >Controls[i]); l!is7^J/DoL
       P->Text=""; 'a$cAE\
       } ,zq G uAo RoR
     }  S~*~:O5d6Y0x(H&l7[&Q

o!\}'C@R#t }bU 四、不规则窗口 ["`)Z]5lx{Q o

i"i"Vb6~    1.在窗口定义中,加入HRGN hWndRgn;
L {\E\~e@*vn    2.在TForm::OnCreate()消息函数最后,加入下面的代码:
] JD7hL      hWndRgn=::CreateEllipticRgn(0,0,Width,Height);
X OFc!{}}q      ::SetWindowRgn(hWndRgn,TRUE); .ge(?3I3n7x p
   3.设置TForm的属性为无标题,无边框。
;y,Mys k    4.编译连接应用程序,就可以看到一个椭圆形窗口。 !{-A _,zvI

7AfN}Gv-|j 五、MDI Form 8@0p*b'{6d ?
   J Td\ n&`Y"}Z
   1.Application->CreateForm(__classid(Tjjcginput), &jjcginput);
{&G?y6]y
+UcC6G*M    后不用在使用显示Form的语句就可以显示出来了。 #o}3YT5t$N9{6dn J

n5[&n,Uh&Q;H    2.form 的onclose 事件必须用下面语句释放空间: 'k$aO6zsSj;s}
     void __fastcall TMDIChild::FormClose(TObject *Sender, TCloseAction &Action)
#p'Z8iUd%l^X       { f y'u*qH"~
        Action = caFree; 3AZ4XJ+x/g
       }

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.