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

在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,则应包括所有的控件。

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

JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember 大数据推广引领精准推广浪潮 ThoughtWorks负责人曾学海:数字渠道细分带来的架构演进 你画我猜2 : Draw Something 2正式发布 云中游科技CEO张帆:畅谈“找你妹”的自营销 Oracle当心,MySQL原始团队已重整旗鼓! 优秀的Meteor学习资源 ThoughtWorks美女分析师:如何规划企业在线数字渠道战略? OpenStack将怎样影响软件行业? 知识产权日特稿:谁动了程序员的源代码版权? MIT技术评论评选2013十大突破性技术:深度学习居首 Chrome测试版添扩展程序 可直接浏览Office文档 Ubuntu 13.04携中文衍生版UbuntuKylin 13.04发布 Spark核心开发者:性能超Hadoop百倍,算法实现仅有其1/10或1/100 移动开发的碎片化时代,我们该怎么办? 谈应用分发控制力:还是渠道为王 Unity亚洲开发者大会:手游半衰期越短,开发者手中的机会越多 《割绳子》开发者:俄罗斯双胞胎的奋斗史 曾应聘Rovio未果 Win7系统上常见IE 10问题汇总 如果苹果推廉价手机,市场份额会不会超过安卓? 移动互联网下,如何做儿童新音乐? 第三届“中科杯”全国软件设计大赛正式启动 注重稳定性 Docker 0.2.0发布 何谓机器学习 机器学习能做些什么? 艰难的决定:EA裁员10%,殃及PopCap 或提前落地!Amazon和Facebook急聘SDN工程师(Python优先) 轻松完成网站提速:来自Google、淘宝等的Nginx PageSpeed模块 Touch-Pay发布 移动联通在手机游戏领域联合推融合计费SDK 如何组织大型JavaScript应用中的代码? Robert Scoble:戴Google Glass两周后 再也不想摘下它 赶时髦?Facebook CEO 2013年将领取1美元年薪 装了腾讯的浏览器现在删了 可是用cterm点击里面的网址还会调用腾讯的浏览器 如何修改注册表 那个键值? 电子邮件的问题 怎样给为我解答问题的注册用户打分? 谁做过这样的新闻系统! 为什么RealPlayer放有些网站的流媒体文件时会出错? 请问什么地方有软件开发标准。如国标,国军标等。 如何取得读网页时ie的状态,如正在下载,完毕等等? 朋友们能不能提供我一些关于VC读取文件操作的资料? 关于数据库服务器和备份的问题 win2kPRO 简单问题,高分相送!!在线发分,第一个答对者,定送此分!!!!!! c程序总出现"out of memory..." bzszp(蝎子)和ATCG(ATCG),谢谢!请问可以给我你们的E-mail吗?我以后还有些问题想请教你们! 如何设置java环境 更改工作站的下载等权限 制作一个修改程序外表的东西 怎样ENABLE 注册表编辑 MFC向导生成的基本对话框程序,一按回车就会退出,怎么设置都没有用.怎么办? 小弟下个学期就学vc了,想在这个暑假里好好的去接触接触但是不知道改看那些书好!还请~~~~~~~?高分!! 请问这个错误是什么原因啊? QMAIL高手:关于分页的问题,函数vauth_getall() 制作修改程序外表的东西 初学者学习编程什么样的学校比较适合? 制作修改程序外表的东西 原本对这个世界失望了,居然还发现还有和我一样善良的人,你让我有了活下去,继续灌水事业的勇气,谢谢给我捐献可用分的好人! ******初学者问题 ,如何实现2个Edit框同步******* 请问DataGrid如何和ADO控件梆定? 在servlet中设置了一个javaBean的属性,怎样把他传递到jsp中呢? ADOStoredProc1中存的游标数据如何附给变量中???带原码) 如何提取OLE 容器的嵌入对象? 大家喜欢什么格式的电子书? chm, pdf, html, doc,.... 怎样才能向一个文件中插入一个汉字? 在Word中快速插入日期和时间 备份access数据库原代码,看看错在哪里? 如何写收取、检索POP3邮箱的页面? 代码智能感应? 请教:c++编译器的问题 承蒙看得起~~最近半个月平均没天收到两封带毒邮件,散分:( WinSock控件编程中的一个小问题 QMAIL高手:关于分页的问题,函数vauth_getall() 高手们你们好,请您帮助 大家都在网上混了这么长时间了,有谁知道新浪网的sina是什么意思?俺不知道阿!!! 请大家帮忙看一下,这个问题怎么办???? QMAIL高手:关于分页的问题,函数vauth_getall() 哪里有英文的win2000下阿? 大家帮我看看如何在更新不成功的情况下,能提示出“更新出错” 打开一个任意一个目录下grid的存档程序怎写? 有没有办法防止<Frameset>拖动? 关于boost 请教有关于RichTextBox的问题,高手进来看! 这个ASP提交数据为什么出错,代码如下,在线给分 不知道各个X的意义 能讲解下么? 并把 各个X代表的意义讲解一下! 跪求'对数平均温差法进行热设计基本思路'是什么啊? 黑龙江漠河日照现在的时间 半径为r的实心球体在液体中,球上表面与液面相距h,球体积为3/4π,半径为r,液体密度为ρ求液体对球向下的压力大小(2014昆明物理中考最后一题25) 对数平均温差 1n代表的什么 1n等于多少对数平均温差 因为在冷凝器 板换 一系列的换热器中 温度是变化的 为了我们更好的选型计算所以出来一个相对准确的数值,当 △T1/△T2>1.7时 用公式: 漠河夏至节旅店、宾馆的标间普间价格及电话. 已知函数f(x)对任意x,y∈R均满足:f(x+y)=f(x)+f(y);f(1)=2;当且仅当xf(x)=2x是唯一的答案,还有,仅从可加性得不到单调性啊,即使我说f(x)是单调递减的也成立啊:假设g(x)是单调递减函数,且满 怎样判断线圈是否产生感应电流或者怎样判断磁通量发生变化 描写长城的诗句有哪些? 用不同材料制成2个实心球,放入同一液体中,浮出液面的体积分别是各自体积的1/2和1/3,它们密度比是 制冷系统冷凝器为水冷,其对数平均温差为20度正常么?是不是太大了?冷却水进出口为32和37,冷凝温度为55,是否合理…… 氯化铵的化学式怎么写 设a∈R,函数f(x)=a-2/(2^x)+1,(x∈R)...求证函数是增函数. 用导电塑料作成线圈,改变穿过线圈的磁通量,导电塑料会不会产生感应电流? 夏至日下列地区白昼最长的是A曾母暗沙B漠河C乌苏里江上D帕米尔高原上 我用的电热水器不能用了,测了一下电阻是47k欧,怎么会事? 黄河湿地国家级自然保护区在河南省焦作市孟州段有没有分布,范围包括那些乡镇? 描写长城的句子和词语同问 碳酸钠溶液与硝酸钾反应的化学式如题是我写错了,不过顺便问下为什么两个正盐不能反应?还有就是正盐是什么? 长时间加热水为什么水不能沸腾 某晶体的熔点是120摄氏度,那么当该晶体的温度是120摄氏度时,其状态.A 一定是固态 B 一定是液态 C 一定是固、液共存状态D 以上三种情况都有可能我选的C,同学选的D. 东营黄河口湿地公园和黄河口生态旅游区是一回事吗? 水在长时间加热能变为土吗 请问此化学式的反应结果NH4Cl+Na2SO3 做托里拆利实验时,可以确认管内进入了少量空气的现象是 A玻璃管内水银柱高度小于76cmB轻轻提起玻璃管,水银柱高度增加C倾斜玻璃管时,水银柱的高度不变D轻轻下压玻璃管,水银柱高度增加我 小石潭记,岳阳楼记,醉翁亭记,满井游记的区别 请问北京漠河夏至日和冬至日的昼长求具体的数字 微波是什么波?热辐射的波是电磁波吗? 为什么托里拆利实验中如果将玻璃管向上提起一些,水银柱会管内下降,但距水银槽中水银面高度仍是760mm. 小石潭记、岳阳楼记、醉翁亭记、满井游记相同点和不同点~ 北美大陆东部气候问题为什么北美大陆东部温带大陆性气候的降雨量我国同纬度的温带季风气候多?貌似不合逻辑啊,不是温带季风气候降雨量都比温带大陆性气候多吗?真的是年降水量 ?那么,现在假设有一个超导线圈部分处于匀强磁场中则线圈中的电流不会消失,然后这个线圈将会永远...?那么,现在假设有一个超导线圈部分处于匀强磁场中则线圈中的电流不会消失,然后这个 我国漠河冬至时昼长约为7小时,相当与夏至时昼长的12分之5,夏至时漠河昼长达约为几小时写算式啦 加拿大多伦多天气怎样? 对数温差算法 《小石潭记》《岳阳楼记》《醉翁亭记》《满井游记》四文中心句? 如图所示,三个实心球在液体中静止,球1有一半体积浸在液面下,球2和球3的密度之比ρ2∶ρ3 =1∶2,三%如图所示,三个实心球在液体中静止,球1有一半体积浸在液面下,球2和球3的密度之比ρ2∶ρ3 =1 黄河入海口在东营吗? 小石潭记 岳阳楼记 醉翁亭记 满井游记 的原文 北美从西到东的气候类型 明天什么天气, 比较《小石潭记》《岳阳楼记》《醉翁亭记》《满井游记》的相同点与不同点····表格的形式 已知一次函数y=kx+b的图像与x轴相交于点A(-2,0),与函数y=3x的图象交于点M(m,3),求一次函数的解析式 山东黄河入海口湿地的红色生物是什么 请问北京、漠河等中国城市夏至日和冬至日的昼长?请说详细点,备考用的 如何用右手定则判断磁体南北极?书上说的我看不懂,说说如何判断手的摆法 明天天气几点有雨 黄河国家湿地公园怎么样 已知一次函数y=kx+b的图像过点(1,2),且与x轴交于点P,若直线y=3x+6也经过点P,求这个一次函数的解析式 怎么去东营的黄河入海口旅游呀?我在蓬莱 请问膜盒压力表就是两个膜片对接之间通入测量流体对吧?1,我的问题是那和膜片式有什么区别,不都是通过膜片变形吗?只不过膜片式一个传到弹簧管测压膜盒是两个膜片传到弹簧管测压? 2,还 电热丝发热时是发出热辐射的对吧?那有什么物质能反射热辐射呢?电热丝用什么材料最好? 为什么这样的天气是多雨的天气 是不是夏至的时候在漠河村可以看见极光?怎么去?我是哈尔滨的,想去看极光,要怎么样才能到达那传说中的北极村呢?是不是黑河市漠河县的漠河村?还是什么?有点搞不清楚……请大家帮帮忙~ 天人永隔 是什么意思? 东营黄河入海口从东营的八分场,怎么坐车去黄河入海口啊 在夏至时,曾母暗沙和漠河哪个日照时间长 硝酸钠溶液中加入铜粉不反应,再加入硫酸锌怎么还不反应?①硫酸锌水解显酸性,不是酸性条件下与硝酸根具有氧化性,应该会和铜粉反应啊?②同理,加入Fe(NO3)2也不反应,为什么? 我想问问你,我们家的电水壶里面的水烧开后忘记带了,凉了后又自动加热,是正常现象么? 黑龙江漠河日照时间只有7个小时应在什么时候?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘