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

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

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

从YunOS话阿里移动互联网云生态布局 Mobile First!苹果联合IBM发布10款企业级App iOS8.1.1越狱又惹急苹果!扒一扒黑客与苹果的斗争史! Firefox.html:用HTML重现Firefox UI Qt 5.4正式发布!引入WP,支持HTML5混合开发 2014智能硬件盘点第二弹!这次咱走暖心的 聚合数据资产,推动产业创新——2014中关村大数据日看大数据变现 拥抱开源:微软Windows 10宣布全面支持AllJoyn技术 改变App领域发展!友盟推“数据工场”战略,两款新品亮相 Cloudera正式登陆中国市场:与英特尔携手共助本土企业淘金大数据 Go 1.4正式发布 支持Android开发 【特别提醒】2014中国大数据技术大会门票全面告罄 不接受现场购票 累计4000万美元 Qualcomm在华投资5家公司 支持Android、WatchKit开发,全新RubyMotion 3面世! 快速开发移动医疗App!开源框架mHealhDroid 2014CVW﹒产业互联网大会解密未来20年 Nimble VR的收购与一封来自友商的感言 Google Earth API将在2015年12月彻底关闭 AR、美颜、机器人:计算机视觉库几乎无所不在 不激增,无爆收,年度最佳手游为80 Days带来了什么? 《近匠》机智云CEO黄灼:跨越智能硬件的“鸿沟” 智能手机≠智能家居!我们要的究竟是什么? 亚信大数据事业部总经理张灏:打通各行业数据壁垒 让大数据变现畅通无阻 Web App和Native App不是生死之争,而是可以和平共处! 微信之父张小龙说微信坚持“去中心化”,这样真的好吗? 亚信CFO武军谈进军海外市场成功经验 前瞻性思维是开路先峰 Swift,任重而道远! DevOps系统的变迁 玩转Docker镜像 “扫描建模”速建AR应用 Vuforia 4.0 SDK更新 硅谷里的外星人:纵观Reddit十年风雨路 在MainFrame里怎么得到一个指向MyDoc类的指针? 上海的弟兄前来领分!!!! 能ping通代理服务器,但不能上网(ftp等都不能用)。有那些原因! 谁有api做的串口通讯例子 很简单的Temporary used 问题,就是搞不清,请哪位详细点拨一下,铭谢 DataGrid中使用HyerLinkColumn,请怎样动态传递多个参数或改变DataNavigateUrlFormatString的值(在线等待答复) 在winsock1.1下怎样监听网络事件。(请给个API 的 sample ) 高分急求数据库解决方案! 高分求助软件稳定性问题! 高分请教exej4的问题!~ 我的代码可以被编译吗? 十万火急(在线等)关于发邮件问题!多谢了(最后50分了) 感谢各位的鼎力支持!!! 急:如何让sqlload使用命令行方式,把数据库中的指定几个表导出?(在线) 单元全局变量与工程全局变量有什么区别 问一个关于JSP和XML结合的问题. 请问怎样用ASP连接Mysql数据库,急! 有没有j2ee的qq群??? win2k里的smtp服务器,怎么是需要身份验证的? 怎样让智能ABC记住输入的词组呢? 你在delphi中,用到了多少面向对象的知识? Dragover事件什么情况下触发 北京还是深圳 如何实现两个类互相访问--急! <Code Complete>怎么翻译好呢? 急!!!!!在dcom中向数据源添加数据报错,为什么? 有哪些方法可以在ASP.NET设计文件.aspx(html格式WEB)与脚本文件.aspx.cs(.aspx.vb)中传递数,或者说传递变量的值!!! 我用CDONTS.NewMail发邮件,怎么判断邮件发送成功或者是不成功呢? asp.net的客户端键盘的事件处理的有关问题? 请问怎么在程序里随机产生CLSID代码?$$$$$$$$$$$$$$$$ 急! 如何定义一个全局的类的实例,请高手指招? 到底怎么创建桌面快捷方式? 给点参考吧! ADO连接带密码的数据库时出现的错误!!! (在线求助),哪位老大知道怎样写一个字符串在一个iframe内框架里? zzxxdd过来接分? 刚才没说清楚再问一下救急 allforly(白衣胜血) 请进,其他人解答也可以。 windows 2003 关于fso问题,求救! 请问通过表单上传文件是否有大小限制? 关于函数的返回类型 JavaScript在使用showModalDialog的问题,急!!!!!! 急!datagrid中的Checkbox问题? 各位仁兄:在Redhet8下为什莫打开中文pdf文档是乱码?下弟在此先谢过了。 请提供北京招聘信息(java方面)。毕业三年了,一直在一个公司里面工作,昨天辞职了,现正是开始重新找工作。 win2k服务器问题,请大家帮忙解决! asp生成excel文件的问题!! 出一个程序员需要做的智力题,也来让大家头痛一下。 可以上qq,不可打开网页,这是为什么?主机为server2000,其他电脑有的可一打开 如何得到DataReader的字段的名字 请教C++通用排序程序 哲理小故事,最好是名人的,或者是讽刺的 心肌细胞为什么细胞内为负电荷外面为正电荷 plenty的《劣势》 歌词 一个三位数 百位数比十位数大一,个位数比十位数小2 设十位数为X 这个三位数是? 神经细胞的独特结构与物理中的尖端放电有无关系,就是电荷都集中在尖端一侧,有利于传导的速度加快 plenty的《境界线》 歌词 有一个两位数、个位数比十位数大一、十位数与个位数之和为5 can not t_____ it home plenty的《ACTOR》 歌词 个位数比十位数大一的两位数 已知M(3,-2),N(-5,-1)且MP向量=1/2MN向量,则点P的坐标为?A(-4,1/2) B(-1,-3/2)在这两个选项中存在争议, plenty的《ETERNAL》 歌词 千亿后面的位数是什么 一个善良,执着, 严嵩是怎么死的 一个8位数比一个7位数肯定大一 向量a=(m,n),b=(p,q),且m+n=5,p+q=3,则|a+b|的最小值是什么?请把步骤写出来 着急 说一个人,做人做事都很执着, “走出哲理的误区”的素材 太执着的人 会怎样 谁能详细的描述 其中的含义. 谢谢你. 严嵩的儿子是怎么死的啊?听说是中毒 kiss是形容词还是动词 he moom isn't the biggest among the stars ,is it的biggest是什么意思啊,比较级有这样的吗,还是其他的呢 严嵩怎么死的 千亿后面是什么 如何理解资本主义所有制的实质是资本家占有雇佣工人的使用价值?来自任汝芬序列二 已知三点坐标为A(5,-1),B(-2,3),C(3,1),△ABC内任意一点P(x,y)经过平移后,P点对应的点P`的坐P点对应的点P`的坐标为(x-4,y+2),请说明此图形是怎样平移的,平移后得到△A`B`C`的三个顶点的 编程中有许多的词语,谁能告诉我有那些词语? 你知道哪些像王家新这样执着追求信念的人? my happy school 歌词跟视频上的英文要相符! 细菌属于那类 圆锥的底面半径3㎝,母线AB的长为9㎝,动点P从B点出发,沿着圆锥的侧面移动一圈,然后回到B点,P点移动的最短距要准确步骤,谢谢 资本主义国家雇佣劳动力就算是剥削劳动力,而我国为什么不算呢两者有何区别?资本主义的生产资料私有和我国的生产资料公有,体在人民群众上有什么不同.\x0c亲,不要复制粘贴好吗?说说自己 考研数学概率题例题1.26,答案为什么不选择B呢? 从右边起第几个数是千亿 历史说资本家剥削了剩於劳动力,那我老板也算是不是资本家呢? 例题, 比千亿更大的数读作什么? 人,只要有一种信念,有所追求,什么艰苦都能忍受,什么环境也都能适应.是什么意思?说明了什么? 材料一说明了什么问题 圆锥的底面半径3㎝,母线AB的长为9㎝,动点P从B点出发,沿着圆锥的侧面移动一圈,然后回到B点,P点移动的最短距 细菌会进入细胞吗 历史材料一说明了什么问题 创造一个有关"路"的富有哲理的句子 解释细菌为什么通常带负电荷.(必要时用化学式来解释) 广州亚运会作文400就行!急! 在农业生产上,常需要用质量分数为16%的氯化钠溶液来选种.现要配置100g这种溶液,试计算需要固体氯化钠和水的质量各是多少懒人们要记得写解题过程 统计学里的“同比”和“环比”是什么意思 广州亚运的新景象 作文 求问一道Haskell题目,是一道英文题目,我害怕翻译不到位,还是把原题po上来了:Give the type and definition for a funtion called 'matches' that take an element and a list where the element is of the same type as the elements in 很固执的女人怎么对付我女朋友非常非常的固执,只要她决定的事情就一定要那么做,就是有时明明可以改变的也愿意改变,事情吧也总会会自己着想,根本不会去想想别人,那么固执那么死板的 台湾省,什么时候能够统一 It was ( ) during the winter in China this year snowy heavily snow heavily heavy snowy snow heavy it was exciting news for all the people 为什么是it was exciting而不是it was an exciting? 台湾什么时候能统一 请使用递归的形式,写出一个名为 ’sumAcc‘ 的函数,它用一个累积的参数来使一个list的整数加起来求和.原题是:Write a function called 'sumAcc' in recursive style that uses an accumulating parameter to sum a list o 定语和状语的区别例如the boy here needs a pen中的here为什么是副词作定语而不是地点状语,什么情况才会是地点状语,最好有例句分析 台湾什么时候能统一啊 鸿壑是不是词语 卓别林怎么死 柬埔寨反对党举行街头示威 抗议选举成日本一公司推出价值66万纯金奥特曼美国职棒大赛 球员为赢对手纷纷留长胡日本6名女性涉嫌在网络上上传猥亵视频韩考虑增加新一代战机项目预算 现为4德防长批评美国监控传闻 称欧美关系将俄总理七小时“安徽印象”澳洲一名男子涉嫌逼迫未婚妻致其死亡接韩考虑增加新一代战机项目预算 现为4浙江省政协公开征集提案线索 侧重群众湖北阳新县:两名女干部上班时间互殴难美国一女子梦游跌落地铁仅擦伤(图)美军将撤离阿富汗 价值70亿美元军需美国男孩携玩具枪街头把玩不肯放下 被美国扶贫粮食券遭诈领 部分受惠人折价调查称8成法国选民认为2017年大选日本最古老农村歌舞伎舞台将公演 祈祷日本明治奶粉决定停止在华销售 称市场澳大利亚一消防飞机救火时坠毁 驾驶员沙特暗示拒任“非常”是针对美国 恐与泰国咖啡摊主因招牌与星巴克标志雷同被中国驻旧金山总领馆遭纵火金鑫任池州市副市长 夏月星已任安徽省河南新增36家节能减排科技创新示范企“日月明功”虐杀案 妇产科医师颜正松日媒:TPP谈判关键在于各方对关键利数据简报:2013年全球主要股票市场2013全球股市回顾:美日表现抢眼 数据简报:2013年12月全球主要股湖北安陆:分散办活动 节俭迎新春中南财经政法大学自主招生办法出台 今“我把太阳迎进祖国”浙江温岭2014澳大利亚2013年交通事故死亡人数有湖北省首个大学生村官网络交流平台上线林允儿李胜基宋茜尼坤李敏镐 韩国真假杨幂范冰冰谢霆锋崔始源 扒开刘海也惊桂林宝贤中学举办迎新文化艺术节 畅想禄劝一企业高寒山区送温暖 12吨“爱李娜三盘苦战艰难取胜 复仇怪球手进深浙江一村落历时两年写村志 见证400三百六十厨 厨厨是人才自主知识产权的自动压缩氧自救器在北京
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘