说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在Delphi中巧改窗体文件实现控件数组化

HTML文档下载 WORD文档下载 PDF文档下载
在Delphi中巧改窗体文件实现控件数组化

---- delphi 开发的应用中,每一个窗体都有一个对应的窗体文件(.dfm),用来记录该窗体的属性以及窗体上所有控件的属性,以便在窗体关闭后能准确地重新生成窗体。几乎所有的DELPHI参考书都没有提到过该文件的具体情况,偶尔提到,也都泛泛而谈,因为窗体文件是二进制文件,只有在DELPHI提供的编辑环境中才能看到它的本来面目,对其进行操作可能会出现不可预知的错误;而且在大多数情况下,确实没有修改的必要。而本文谈到的和窗体文件密切相关。

---- 要利用窗体文件,首先必须了解该类型文件的结构。窗体文件的结构很简单,朋友们可以生成一个窗体,随便放上一些控件,存盘后打开Unit1.dfm文件,就可以看到窗体文件是由关键字"object"和"end"构成的代码段,基本结构如下:

object 控件名 :类名

属性1 =属性值

属性2 =属性值

end

---- 并且支持嵌套。Delphi在记录控件属性时,只记录修改过的属性,举一个例子,比如对一个标签控件(label1)的缺省描述如下:

object Label1: TLabel

Left = 256

Top = 80

Width = 32

Height = 13

Caption = 'Label1'

End

---- 记录的五个属性都是随开发者拖放的位置和顺序不同而变化的,其它属性由于没有修改过,都是缺省值,所以不必记录。

---- 窗体文件是有序的,它的有序性表现如下:

object 窗体名:Tform

窗体属性1=属性值

窗体属性2=属性值

。。。 。。。

// 以下是TgraphControl类型的控件

object 控件名:类名

控件属性1=属性值

控件属性2=属性值

。。。 。。。

end

object 控件名:类名

控件属性1=属性值

控件属性2=属性值

。。。 。。。

end

。。。 。。。

// 以下是TwinControl类型的控件

object 控件名:类名

控件属性1=属性值

控件属性2=属性值

。。。 。。。

end

object 控件名:类名

控件属性1=属性值

控件属性2=属性值

。。。 。。。

end

。。。 。。。

// 以下是其它类型的控件

object 控件名:类名

控件属性1=属性值

控件属性2=属性值

。。。 。。。

end

。。。 。。。

end

---- 在同一种类型的控件中,各控件排列的先后顺序和它被拖放到窗体上的先后顺序相同。这个顺序是可以人为修改的,我们正是通过修改这个顺序,来实现控件的数组化。下面将详细介绍。

---- 熟悉VB的朋友肯定知道在VB中可以通过控件拷贝实现控件的数组化。而DELPHI中则没有这种功能。Delphi中可以使用Components

Controls两个控件数组在一定程度上模拟控件的数组化,比如:

for I := 1 to ControlCount-1 do

if (Controls[I] is Tlabel) then

(Controls[I] as Tlabel).Caption := 'Test';

---- 这段代码的功能是将窗体上所有Label的Caption属性设为'Test';这是一种非常有用的方法,大家如果不太熟悉可以参考delphi帮助作进一步了解。这种方法有很多局限,最明显的是我们并不知道Controls[i]或Components[i]到底代表哪一个控件,只能用遍历的方法进行筛选,这不仅影响了程序执行的效率,也带来编程上的繁琐。

---- 其实,Controls和Components中控件的排列顺序和对应的窗体文件(.dfm)中控件描述代码段的排列顺序是相同的。前面我们谈到窗体文件是可以进行适当修改的,也就是说,我们可以根据需要调整窗体文件中控件描述代码段的排列顺序,让Controls和Components这两个控件数组全在掌握之中,这样我们就能清楚知道Controls[I]或Components[I]具体代表的是哪一个控件。下面举例说明。

---- 比如,我们想让窗体Form1上的所有Tbutton灰化,最简单的方法是一句一句的编写代码:

Button1.Enabled := False;

Button2.Enabled := False;

… …

---- 如果Tbutton数量很多,代码就变得很冗长。于是我们采用一个循环来实现:

for I := 0 to ControlCount -1 do

if Controls[I] is Tbutton Then

(Controls[I] as Tbutton).Enabled := False;

---- 现在我们有了更有效的方法,首先打开窗体文件(Form1.dfm),调整Tbutton的排列顺序,让所有Tbutton的代码段(Object…end)都排在一起,然后数一下前面其它控件代码段的个数,设为n,n-1就是第一个Button在Controls(Components)数组中的位置,这样程序就很简单:

for I:= n-1 to n-1+ButtonNum do

(Controls[I] as Tbutton).Enabled := False;

---- 代码的效率和简洁比以前有了很大提高。其中ButtonNum是Button的个数。

---- 下一个例子更能体现利用这一规律的优越性。在编写Socket通信程序的时候,我们通常需要将用户输入的信息按照一定的顺序形成字符串,然后发送给服务器,服务器再根据事先约定的顺序解包,提取出内容,进行入库或其它操作。在形成字符串时,一般都是直接写代码,比如:

InfoS := '';//用于存放字符串。

if Edit1.Text < > '' then InfoS := InfoS + Edit1.Text

else begin

Application.Message('请填写必要信息');

Exit;

end;

if Edit2.Text < > '' then InfoS := InfoS + Edit2.Text

else begin

Application.Message('请填写必要信息');

Exit;

end;

……

---- 如果录入的项目多,这种方法会使代码冗长不堪。现在我们可以先调整窗体文件中Edit框描述代码段的顺序,让它们排列在一起,并确定第一个Edit框在Controls控件数组中的位置(方法入前),设为n-1(其中n表示排在Edit框前面的控件的描述代码段个数),编写如下代码实现:

for I := n-1 to n-1+EditNum do

if ((Controls[I] as TEdit).Text < > '') then

InfoS := InfoS + (Controls[I] as Tedit).Text

Else begin

Application.Message('请填写必要信息');

Exit;

End;

其中EditNum表示Edit框的个数。

---- 还有其它很多方面的应用,在这里就不一一赘述了。这实际上就是彻底实现了控件的数组化,而且这个数组还可以包含不同类型的控件。

---- 这里有两个问题需要注意:一是在调整控件描述代码段顺序时,一定要遵照文中提到的窗体文件的有序性规则,比如试图将一个TButton控件的描述代码放在一个TLabel控件的描述代码前面是不可能的;另外请大家注意Controls和Components的区别,窗体文件中,控件间的父子关系可以通过缩进的格式很明显的看出来,在计算控件在数组中的位置时,一定要考虑控件间的层次关系,如果使用Controls,就应该只对同级控件进行计数,如果是Components,则应包括所有的控件。

---- 当然,这种方法也有它的弊端,首先需要调整窗体文件顺序,其次程序的可读性会受到影响,所以大家在使用这种方法时应多写帮助。

iSuppli:微软Surface RT实际销量远低于出货量 业界前三甲:App Store两个刷榜者,站了出来 极客无极限 一行HTML5代码引发的创意大爆炸 将服务器“弃”之荒野? 微软玩转露天数据中心 Dropbox:我们现在关注“内容” 而不仅仅是文件存储 访Teradata Aster Mayank Bawa:抛弃无效数据,让分析走向大众化 谷歌Chrome或新增通知中心 与Google Now整合 传言称HBO节目将登陆苹果Apple TV? Crashlytics被收购,应用崩溃报告服务要火了? 微软公布WP7.8完整功能 诺基亚率先升级 BlackBerry 10或许不仅仅是一剂强心针 一周消息树:专访蒋彪:JavaEE是企业级开发首选 移动周报:从封闭到开放,iOS生态系统要变天? 游戏平台上:Win7已跌破70% Ubuntu突破1% 不再那么传奇 扎克伯格时代或结束 微软应该联手Firefox OS,打造破坏性生态系统 中美IT人才俱乐部第一期:硅谷经验面面观 中国第四季度Android和iOS智能手机出货量高达98% 开发者眼中的代码审查“真相” 互联网产品设计的12个理念 Pair、Between、小恩爱:妹纸装个情侣应用吧? 横跨四大操作系统:3DMark将挑战所有智能设备 美国碰壁欧洲得意 华为获CERN青睐 应用数据分析新标准:Flurry增应用崩溃分析功能 Twitter被黑客入侵,25万用户信息可能被窃 16亿美元超级计算机项目助力解读人脑 卡巴斯基发现新型Android恶意软件 可入侵Windows 谷歌发布基于B-Tree的C++模板库 开源产品系列:高性能Web框架Zend Framework LiFi是否会取代WiFi? 1月浏览器排行:IE10突破1% Chrome连续3月下滑 如何取消sendmail 8.9.3的第三方邮件转发权限? SelectDirectory函数打开的是英文对话框,但是我的程序需要向用户发布,怎样才能中文界面 111222(), 你已经被剿灭了么 ? 请教如何把一个Project移植到另一台机器的不同目录下编译? ListView 的 OnColumnClick 要实现items 的升降序排列 ,怎么办?还有,点击单元Item,出现该Item 的 编辑Panel? 刚学java,请问。。。 怎样用猫来传文件 有没有谁有D6光盘,刻张给我 到底要怎样学 新手请教问题 我的安装老是不能成功,那一位大虾能告诉我,谢了 各位大虾,谁能给我提供,匿名发送邮件的程序代码啊。。。。 那位打下知道有什么针对BMP图像的压缩算法? 怎样使WAV播放的幅度表达出来?象WINDOWs的录音机显示一致? 窗口的问题(稍后加分,100分) 大家是如何解决数据库平台无关性的问题的? 呦,阿紫,你真的改名啦,红袖添香夜读书的小乖乖,太长了,你还当斑竹吗? vb开发进程?Hook技术? 所谓的基础的是什么 识别上网状态问题,请教各位大虾。 再问:请问可以在applet中使用MenuBar吗?(昨天的已经给分了) 统计一下win2000下可以玩的游戏 *.chm文件能作在线帮助吗?在窗体的helpfile、和helpcontext如何设置??? 如何根据列名用object来取出字段,急!!!! 关于箭头在数据窗口移动的问题? 再问个菜鸟问题,showmodaldialog的title怎样控制 javascript中如何取整? ALT和MFC的区别是什么?? 试用DELPHI6,BUG太多了! 我是新手,请问在delphi5中如何建库(orcle和sybase)? 问一个比较弱智的问题 js文件里如何使用另一个js文件里的函数30? 哪位大虾知道可以在哪里下载mpeg-1的codec,谁先告诉有效地址谁先得分!(不给分是小狗!) 可能很菜的问题,送分的问题!! 一个关于CDaoTableDefInfo的问题 ado的问题??求救!!!高分!!! 有关代码重用的问题,对Form的继承。 一个关于CString.Format的问题 学习编程时学图算法怎么学好? 一个很简单的CREATE TABLE语句为什么出错呢?向大家请教! jbuilder5运行需要最低配置 ,傻傻的问 Delphi6的盗版已经到了@_@ 喂,为什么我提问只能给最多37分,原先可比这要多的多 一个关于派生类的问题 关于页面关闭的问题 用new JTalbe(10, 20)创建了一个table,如何设置该table列(column)的宽度 请教一个关于用VC6开发outlook\exchange的问题。急!急! 时间服务器 请问一下,用DBM,如果用户注册的数量多了以后,程序的速度很一般的文本速度比较哪个快 纯数学问题:如何求模逆元? VB中实现进程间通信的方法?VB中的CallWindowProc的用法?VB中如何发送自定义的消息? 光明小学航模数人数是生物组的4/5,生物组人数是美术组人数的三分之一,航模组有八人,美术组有多少人? 小刚让我才他参加了什么兴趣小组,我说:“( )美术组,( )航模组.”关联词 去鲁迅故里的春游作文(五年级)400字以上 光明小学航模组人数是生物组的4/5,生物组人数是美术组的1/3,航模组有8人.美术组有多少人? 美术小组有25人,比航模小组多4分之1人,航模小组多少人.(列出数量关系式并解答) 小学五年级作文《话春游》400字 光明小学航模作人数是生物组的5分之4,生物组人数是美术组的3分之1.航模组有8人,美术组有多少人?要步骤,5年级数学 美术小组有25人,美术小组比航模小组的人数多四分之一.航模小组有多少人? 春游 (我们去的是上海科技馆)400〜500字 五年级作文 光明小学航模作人数是生物组的5分之4,生物组人数是美术组的3分之1.航模组 某小学航模小组有20人,比美术小组的人数少了五分之一.小学美术小组有多少人?非常急急急急急急急急急啊 要用方程来解!(我会算但不会解) 每8人分一组多6人,每7人分一组多5人,五年级一共有多少人参加春游? 少年宫美术小组有36人,航模小组的人数是美术小组的三分之二,微机小组的人数是航模小组的六分之五,微机小组有多少人 光明小学航模组有30人,美术组的人数是航模组的4/5,又是生物组的人数的1/3.美术组有多少人? 同学们去春游,六年级去了150人,五年级去的的人数是六年级的五分之一,四年级去的人数是五年级的四分之三,同学们去春游,五年级去的的人数是六年级的五分之四, 少年宫里,参加航模组人数占五分之一,参加书法组人数占四分之一,又知书法组比航模组多三十人,少年宫多少人? 东风小学航模组人数是生物组的4/5,美术组人数是生物组的5/6,航模组有24人.美术组有多少人? 三年级共有师生306人 春游包了6辆车,问每辆车坐多少人?怎样安排? 学校舞蹈队有35人,航模小组有10人,围棋小组有25人.航模小组的人数比围棋小组的人数少百分之几 某校有数学,气象,航模三个兴趣小组,其中数学小组是三个小组2分之1,气象组人数是航模组人数的3分之4,航模组比数学组少3人.三组一共多少人? 某校五年级的学生人数是六年级的90%,四年级的学生人数比五年级得多10%.四年级的学生人数和六年级的比较,哪个年级的学生人数多?为什么? 六年级共有37名学生参加航模组和舞蹈组,航模组每5人一组,舞蹈组每3人一组正好分了9组,参加航模组和舞蹈组的共有多少人.(别有方程) 某校有数学,气象,航模三个兴趣小组,其中数学小组是三个小组人数的1/3,航模小组比数学小组3人,气象小组人数与航模小组人数的比4:3,数学小组有多少人? 某校五年级的学生人数是六年级的90%,四年级的学生人数比五年级的多10%.数和六年级的相比较,哪个年级学生人数多?为什么? 航模小组与舞蹈小组人数的比是四:一,航模小组比舞蹈小组多90人,舞蹈小组有多少人 5.一个车间有工人360人,其中女工占五分之三,后来招进一批女工,这时女工人数占全车间工人总人数的五分之八.有招进女工多少人? 光明小学六年级有学生220人.急 学校的航模小组与舞蹈小组人数的比是四比一,航模组比舞蹈组多90人,舞蹈组有多少人? 某车间有工人120人,其中男工人数与女工人数的比是3比2.后来又招了一批女工,这时女工人数与车间总人数的比是3比7.现在女工有多少人? 光明小学六年级有学生二百二十人六年级比四年级多百分之十四年级有学生多少人 航空模型小组共有26人,其中男生有16人.航空模型小组男女生人数的比是( ):( ),航空模型小组共有26人,其中男生有16人.航空模型小组男女生人数的比是( ):( ),比值是( ).女生人数与小组总人数 一个车间有360人女工占3/5,后来又招进一批女工这时女工占全车间的5/8又招进多少人 实验小学五年级有学生152人,现在要选出男生人数的11分之1和女生5人,到国际数学家大会与专家见面,学校按照上述要求选出若干名代表后,剩下的男,女生人数相等. 光明小学航模小组男生咋还能全组人数的三分之二,女生人数占男生人数的几分之几?1,这道题能列积等式吗,要确定.2,如过用方程的话,希望给写出过程,3,用算式也行. 某车间有工人120人,其中女工人数是男工人数的2/3.后来又招收了一批女工人,这时女工人数占车间总数的3/7现在女工人有多少人?今天回答! 五年级原有学生420人,其中女生占七分之三,后来转进女生若干人,这时女生占总人数的十一分之五,转进多少名女生? 学校美术组有35人,其中男生是女生的2/3.女生有多少人? 希望小学五年级学生360人,其中男生占7/12,后来又转来几名男生,这时男生占五年级总人数的60%,转来的男生有多少? 育才小学五年级有260人,六年级有300人. 美术兴趣小组有男生5人,女生6人.女生人数是男生人数的几分之几?男生人数是女生人数的几分之几?快我要答案,不要只写算式,好的最多加200财富值 五年级原来的学生,其中女生占十五分之七,后来又转来8名女生,这样女生人数就占总人数的三十一分之十五,原来有几名学生? 六年级参加植树活动有300人,比五年级参加植树的人数多60人,六年级植树人数比五年级多百分之几列式子, 学校展开了课外兴趣小组活动,文艺组的人数是体育组的3分之4,后来文艺组又增加了4人.这时文艺组人数是体育组的2分之3,文艺组现在有多少人? 学校美术组的人数在40..50人之间,男生人数和女生人数人数的比是5:4,美术组男生和女生各多少人? 某工厂年初有职工630人,男工人数比女工多3分之1,后来招进一批女工,这时女工占总数的7分之4招进多少女工?正确率100%【只写算式】 学校数学兴趣小组原来男生人数占七分之四,后来又有6名男生参加进来,这样男生就占数学兴趣小组的5/8现在数学兴趣小组有男生多少人 学校美术小组女生人数是男生人数的90%,科技小组又有15名女生到美术小组,这时女生人数是男生人数的120%.学校美术小组有男生多少人? 人民路小学六年级上学期有学生360人,其中男生占十二分之七,本学期又转来若干名男生,这样男生人数占六年级总人数的五分之三,本学期转来多少名男生? 学校数学兴趣小组原来男生人数占7/4,后来又有6名男生参加进来,这样男生占数学兴趣小组的8/5现在数学兴趣小组有男生多少人? 报名参加航模兴趣班的男生人数比女生人数的4倍少8人,比女生人数的3倍多24人.报名的女生有多少人? 光明小学六年级女生占7/12,后来转来15名女生,这样女生占全班人数的3/5,六年级原有学生多少人?用抓不变量法做!THANK YOU! 学校数学兴趣小组有60人,写作兴趣小组的人数相当于数学兴趣小组的十二分之五兴趣小组增加多少名同学,就是数学兴趣小组人数的5分之4? 前进小学航模队有女生24人占全队人数的八分之三少6人六年级男生多少人 光明小学六年级(1)班学生中女生占7/3,后来又转来了14名女生,这时女生占全班人数的7/4.六年级(1)班原有人?光明小学六年级(1)班学生中女生占3/7,后来又转来了14名女生,这时女生占全班 学校数学兴趣小组原来男生人数占七分之四,后来又有6名男生参加进来,这样男生就占数学兴趣小组的八分之五要式子 学校美术兴趣组和电脑兴趣组共102人,美术兴趣组人数的2/9和电脑兴趣组人数的25%相等.学校美术兴趣组和电脑兴趣组各有多少人?【求算数解 小学春游作文,400字,广州滨海公园4月份之前回答,过期不算 学校开展课外兴趣小组活动.文艺组人数是体育组的3分之4.后来文艺组又增加了4人,这时体育组人数是文艺组的3分之2,体育组有多少人? 学校兴趣小组活动,六年级有美术小组,航模小组和文学小组共有158名同学,其中美术小组人数比航模小组多20%,文学小组人数比美术小组少20%,求个兴趣小组的人数?7点之前 (加解释 列式) 快 学校组织春游,五年级去的学校组织春游,8倍,五年级去的人数与一年级相差40人.如果每人交活动费70元,两个年级各收多少元?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn