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

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

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

VB利用 App.Path 读取「应用程序所在之目录」 VB利用 EM_LINESCROLL 信息控制 TextBox 的卷动。 命名的技巧 -VB资料 目录所占的字节数-VB资料 VB判断文件是否在IE的缓存中 屏蔽文本框的右键菜单-VB资料 VB取得长文件名 VB取得临时文件名 VB取得某个目录底下所有文件大小总和 VB取得文件的扩展名 VB取得文件内容 确定 TextBox 有几行-VB资料 确定是 WINDOWS 的可执行文件-VB资料 让打印机只打印一行-VB资料 VB如何把批处理文件转换成EXE文件? VB如何调用 Office VB如何将文件删除到回收站 VB如何快速移动文件? VB如何让文本框输入完后,直接跳入下一行? VB如何使用vb取得一个文件的控制权 VB如何使用文件复制对话框? VB如何使用资源文件 VB如何用Dir()函数来列出C下所有TMP文件并且用文本框输出 VB如何在 VB 中使用 Winzip 来压缩文件? VB如何在DOS程序结束执行时,自动将其关闭? VB如何在VB中实现Undo(撤消)功能? VB如何在VB中实现目录遍历 VB如何在Windows操作系统中改变文件打开方式 VB如何知道硬盘是使用那一种文件系統(FAT32,FAT16)? VB如何自动更动成中文输入 VB删除整个目录 JBoss高手看过来! 下面的js执行错误,请看看 请教高手:如何当一个程序被反复调用时利用command$? 声明游标时可否用变量? 能不能提供几个漂亮的repeater控件的模版? dbs.Execute "SELECT * INTO 在校学生 FROM [Excel 8.0;DATABASE=" & App.Path & "\MyExcel.xls].[WorkSheet1] "报错,在线等待 有没有什么工具或办法可以将Tc 下的程序移植到linux下运行? 求助! 请教!急! 世间什么才是最珍贵的? 大家來說說2003年版<射雕>的敗筆. 请教:如何在VB开发的程序中判断一个程序在硬盘上的安装路径? 帮忙!谢谢! 此类问题如何查询? 请教个问题:每次启动机器都会打开IE跳到我们这边的一个内部网站去,本来启动就慢----火死了,怎么去掉---在注册表了改么? combo控件问题. 问一个关于刚开机的win.com的问题。请高手帮帮忙呀! dbs.Execute "SELECT * INTO 在校学生 FROM [Excel 8.0;DATABASE=" & App.Path & "\MyExcel.xls].[WorkSheet1] "报错,在线等待 请问我如何在注册网站成功后,在exchange中也建立一个与注册网站时同名的帐号呢? ASP(javascript)自动回复问题?? ★★母亲的生日★★ 哪位有没有用spcomm控件进行串口通讯的例子? 大家帮我看看这是用哪个做的? 关于打印... 两路由器的使用方法比较,哪个好些? 在线求助:有没有改变电脑所连的打印机打印属性方向的API函数?多谢 我要送分 设置ejb的几个接口时,我有点弄不明白 有没有什么办法把ACCESS的表打印出来?格式改变一下? 烦啊~~~~ 谢谢!如何让对话框的大小不受屏幕分辩率的影响??? 请问怎样避免多用户同时访问数据库中的表? 简单问题:怎样用url打开一个文档?多谢 怎么控制小数的位数? 这个QQ炸弹好厉害,是什么原理呢? 我的问题怎么老是出现在这个地方。。。。 一个对话框程序调用dll中函数的问题! 请教有关类的扩展 请问WIN2000专业版IIS为什么连接限制是10 急,为什么我的数据库会出现这样的错误? 寻求一个好的全屏翻译软件(在线等候,在线给分) 寻找《编译原理与时间》电子文档下载url 升级了,散分小庆.认识的朋友进来捧个场,不认识的也进来热闹热闹!忠心感谢:-) 奇怪的问题 如何解决在一个表单中多个提交按钮的问题? 请问怎样关闭135端口 Photoshop7.0的一个简单问题,大师们帮帮忙! 关于动态查询的问题? 请问如何验证代理服务器? 超过半个小时不作任何操作就把这个连接KILL掉,改如何做呢? 如何才能做出只存在于托盘栏的程序! 求一教学系统设计案例运用所学的理论与方法,对教学内容进行分析并进行初步学习者分析,确定教学起点和学习起点 饥饿为什么使肠道蠕动加快大概机理是什么啊?明明没有食物 取一定质量的Fe ,Al混合物向其中加入足量的NaOH溶液生成气体在标况下体积为33.6L测该反应的离子方程式————————————————————混合物中al的物质的量 教学系统设计专著有哪些? 来自星星的你拍了多久? 请看第二题 我想问的是为什么要强调植株甲乙是纯种的?怎么知道突变是发生在体细胞中的?为什么是隐性突变就不能在子一代表现出突变性状? 教学系统设计中,可操作性应考虑哪些方面?是在设计一个教学方案时. 全国人民代表大会,国家主席,国务院,最高人民法院,最高人民检察院,中央军事委员会的职权分别是什么?简明概括,或者回答:职权是什么?怎么理解“职权”? 节能灯里面的白色粉子是什么 声音是物体什么而产生的,是以什么的形式传播的 家鸽的主要呼吸器官是什么? 还有数量众多的中等的恒星,这些恒星像太阳一样,体积不太大,密度不太小(太阳的密度是水的1.4倍)这句话用了什么说明方法? 1. 试简单说明猪肉绦虫有什麼特化结构使之适於寄生? 2. 试简单说明蛔虫有什麼特化结构使之适於寄生?急!急! 家鸽鱼的生活环境不同呼吸器官的结构和呼吸方式也不同但它们的呼吸在本质上都是相同的他们的呼吸本质是? 英语翻译节能灯管里用的卤粉,混合粉,三基色粉用英语分别怎么说? 中国石油大学华东大学物理实验报告怎么写,包括哪几项 猪肉绦虫的成虫寄生在人体的什么部位 大脑浆和骨髓都同样是神经细胞嘛,它们的性能有何区别. 我的世界怎么制造其他生物?就像制造铁傀儡,雪傀儡那样的制作方法,谁还有,请详细指出来(我知道的有:凋零,铁傀儡和雪傀儡.这三个就不用说了)还能制作什么怪物请说出来(要详细步骤 寄生在猪体内的是猪带绦虫的幼虫还是虫卵,(这种猪肉被称为米猪肉) 审议表决了《保守国家秘密法修订草案》属于全国人大的什么权力 节能灯什么品牌的好用,并且使用寿命较长? 小农经济和自然经济什么区别 全国人大今日选举国家主席副主席 酝酿总理人选 不是早就定了吗 怎么还要选? I used to go outside every night to _____ the start中的______应填look for 还是 look at?如果正确的追加50分 高中生物必修三人体三道防线疑问拜托各位大神“ 感染发生时,病原体已经突破了前两道防线.”这个表述对不对? 下列哪种不是鸟类( ) A.家鸽 B.野鸭 C.褐马鸡 D.蝙蝠 一条直线上至少有_______点在一个平面内,则这条直线就在这个平面内. 猪肉绦虫体表没有角质层,它为什么也能安全寄生在人体小肠内呢? 我国国家主席又颁布法律的权利吗谢谢了, 什么是非谓语动词,怎么用?我是说英语中的非谓语动词. 猪肉绦虫与猪之间的种间关系是 直流屏怎么选择?希望大家可以帮助我介绍个. 节能灯的使用寿命真的可以达到8000小时? 什么吸血虫寄生在人或哺乳动物的门脉系统血管内,靠吸食血液生活 直流屏的容量的选择和数量的选择 谁认识这种蜜蜂呀 叫啥 哪些哺乳动物是吸血的? 那么人的头上有几个神经细胞呢? 平面上有10条直线,三条线段不能交于一点,欲使它们出现17个交点,你想怎样安排 国务院各部人员任免是由国家主席决定还是国务院总理决定? 人有多少骨头,细胞和神经? 政府组织形式形式定义 We could't go because it was raining heavilyWe couldn't go ____ ____ ____ ____rain 生物生存的秘密 个体小农经济是我国古代农耕经济的主要耕作方式,这种方式最早形成于 官员任免权在谁? 生物的得分秘诀有什么? 农耕经济 农业经济 小农经济三者区别? 任免权是什么意思? 生物的秘密 阅读答案跪求跪求!后天上学就交卷纸啦! 农耕文明与大河文明的区别?小农经济,自然经济,自耕农经济之间有什么关系? 为爷爷的回忆录写感想 该怎么写 另外推荐些好点的诗句 什么是节能灯? 夏商时期的农耕属于小农经济否?为什么 增加肠蠕动的药有?药 直流屏怎么选择,哪家的质量好? 指亲近而信任的人,一般用于反面人物(身体器官) 用什么相机能拍星星请写下相机名称,不用怕多贵!(可以找满天星星的那种的哇) 怎么选择直流屏? 斯诺登最新照:在莫斯科乘游览船 未戴以色列攻击叙利亚军事基地 目标是俄制默克尔遭美国监听 德议员称斯诺登愿协国际新闻早报:美国务卿将访沙特修补关美媒:日本大幅升级预警机应对中俄海南乐东退休局长房屋夜半遭强拆 警方初三女生因学习压力大 屡次到超市偷零宁波红光集团等6企业涉税违法被罚23浙江省省级28个部门三公经费(附表)海南乐东退休局长房屋夜半遭强拆 警方思鑫坊曾是杭城近代建筑代表 如今成无新消法引入\"举证倒置\" 经营者需前3季度国内渔业产值达5362亿元 上海自贸试验区营造“宽进严管”的营商谷歌雅虎数据遭美国国安局窃取 美媒称菲律宾议员“港人生命值钱说”激起香港俄罗斯核武部队大规模战略演习 抗衡北台湾花莲发生6.7级地震 杭州等多地医生举报官员公款出游 出门戴钢盔执擀美国务卿将访欧洲中东八国 重申与沙特俄律师称斯诺登在俄找到工作 新工作与2套净月住宅 500万元现金卡总价值原铁道部“天价宣传片案”宣判 一处长全省福利彩票工作电视电话会议召开国务院:适当扩大全国社保基金投资范围如不能自行处理 将强行拖走四月公益相亲会报名啦本月成交量至少提升20%来新海岸一号不出国门让你拥有阳光、沙马自达“越己心旅程”彰显产品风采汪峰要参加扑克大赛!伊核问题谈判延长钟世坚被调查喜欢啥样的有啥样的改需房你可劲儿挑我省首家24小时多功能自助办税服务厅美两架战机迫降台湾第九代索纳塔沈阳推介会圆满收官最“洋气”楼盘 我们带您随心挑盘点那些经典的体彩即开票缺油缺液少水的 要补齐用雪地胎的要换江城一男子坠桥后求救消防员、护鸟人齐《备忘beiwang
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘