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

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

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

MDCC之移动娱乐游戏峰会:百家手游齐逐金玩奖 专访Mozilla宫力:基于Web是Firefox OS最大的资本 如何设计一款Java框架? AngularJS优化最佳实践:从1200ms缩减到35ms Linus Torvalds宣布Linux kernel3.12正式发布! 硅谷的技术文化——渴求独处! MDCC为移动开发者服务:一看、一聊、一聚 做华为合伙人:华为开发者联盟沙龙&#183;北京站纪实 Q3全球智能手机报告:Android和iOS基本不变 WP最得意 Google Apps不再支持IE9 IE9用户或将无法使用Gmail等服务 [开源推荐]CecOS:企业级的云操作系统和虚拟化平台 Avangate SaaS模式开启全球软件新营销之门 Android平台的两大移动威胁现状与变化趋势 推荐五款优秀的PHP代码重构工具 11个值得注意的安全问题及应对,第12个高端黑 微软新举措:打通Windows和WP开发者账户,下调注册费用 合并两应用商店的前兆?微软开始合并Windows Store和WP开发者账户 最难忘的Bug调试经历 LiveCode:让每个人都能开发APP的开发平台 17173总经理赵佳:媒体移动化需抓住三大要素 Django 1.6发布 支持持久数据库链接 如何优化单页面网站搜索引擎? TechCrunch国际创新峰会将于上海举行 极路由:一场由路由器引发的概念盛宴 14nm制程:三星64bit处理器 Exynos 6/S曝光 从Oracle到MySQL,余额宝云实践分享 从南水北调东线工程看物联网,大数据的另一面 不只是技术!成为IT经理必备的十大软技能 看看传说5亿行代码的Healthcare.gov网站的架构 如何走出选择PHP还是ASP.NET的两难境地? 你的设计够档次吗?分享25个奇异的404页面 怎样调用 其它窗体的内的对象的属性?? JSP的应用经验 工具条的问题,求解 我喜欢西瓜小姐 我公司现有固定电话收发电子邮件系统,可收附件,将WORD,HTML文档转换为TXT文本 关于内码问题 远程控制 关于JDBC2.0的问题(50分!!!!) 哪位有高招? 升级BIOS和升级主板? 急!急!急!急!窗口不能关闭. 哥哥姐姐们请帮忙???(急需linux环境下用php+mysql如何实现搜索引擎) 大家赞不赞成开一个Palm技术区?赞成的跟贴,满50个就开。 定义 Dim reader As System.Data.SqlClient.SqlDataReader lvlvlvlylyly请看,你的贴子我加不上了,还查一段程序加在这里了 如何传送monthview1中用户选择的日期到其他窗体里 你该怎么做呢 国内什么样的网站托管好?还是选择国外的? 女网友一定要小心 mschart控件问题 赶快来尝试一下吧! 如何在 View 类中编写press any key to continue功能模块 Vc++下应用Matlab数学函数库出错 如何用VB实现自动登录? 赶快来尝试一下吧! ado的问题! 如何传递带“%”的参数? 有全套的ERP源代码为你提供,助你在开发过程中更上一层楼 字符串str=" aaa ",如何变为"aaa" 怎么没有人理俺泥?? 关于dw的问题 如何读入数据库中的HTML格式的正文呢? 一个在阅读<<深入浅出MFC>>中遇到的问题 !!!!急 新手,说找不到mfc42d.dll文件 怎么没有人理俺泥?? 关于dw的问题 FAST.lib 2000 for windows是个什么东东 请问各位一个非常简单的问题 jdk和jvm 笨蛋 大家有什么建议吗? ASP.net如何刷新另一个页面 有一年delphi工作经验的程序员在全国各地的待遇如何?哪个城市有发展前途(钱途)? 100分求解!!!这个问题大家都来看,来者有分!!! 告诉我几个地方,给你几十分,简单吧 :-) 有没有关于VPN的书籍 Interbase源码分析 西瓜是Plmm哎~! 一个字符串替换的小问题。。。 还有一个问题需要问大家。。。特别急。。。 我变成了大家的一员 哪儿有在jbuilder中让三键鼠标可以使用滚动功能的驱程? 我想把ODBC的所有数据源列出来显示,不知道用哪个函数,谁能告诉,多谢了!来就有分 鱼塘亚硝酸盐高怎么办 将等物质的量的Na,Na2O,Na2O2投入大量且相等的水中,所得溶液的质量分数分别为a,b,c(忽略溶液体积变化),其关系是 二氧化碳与氢氧化钙溶液反应生成碳酸钙和水,不用配平. 如何用甲醛法制备三氯甲烷 钠的氧化物有Na2O2和Na2O两种这两种化合物组成混合物,钠与氧的质量比为23:12求Na2O2和Na2O的物质的量之 CO2通入氢氧化钙溶液中,是水和氢氧化钙同时与二氧化碳反应吗? 家庭怎么制三氯甲烷和如何检验? 物质量均为nmolNa,Na2O,Na2O2,同时加入nL水中完全反应后测溶液密度为ag/cm3则所测得溶液的物质的量浓度为? 醋酸氟轻松冰片乳膏的副作用 氯仿如何制甲酸最好有化学反应式 1,在基因型前面加的分数是什么意思?(例如1/3 AaBb )2,分枝法怎么推测子代性状分离比?子一代自交.3,推测基因型和表现型有没有什么诀窍,请举例.加扣扣, 醋酸氟轻松冰片软膏可以使宝宝皮肤白吗 河水中,亚硝酸盐跟氨氮的关系? 下列物质中不能与二氧化碳反应的是 A氧气 B水 C木炭 D氢氧化钙 那么C呢~ 为什么氯化钙的熔点比氯化镁高按影响晶格能的因素,镁离子半径比钙离子小,电荷相同,氯化镁的熔点应该比氯化钙高,查阅数据可知,氯化钙的熔点比氯化镁高,这是为什么? 怎么测污水中的氨氮和亚硝酸盐?有仪器氨氮比色计亚硝酸盐比色计,这个直接测出吸光度是吗?怎么在测出浓度 质遗传的杂交实验,F1的表现型总是和母本一样这句话错在哪 温室下,在氢氧化钙的饱和溶液中加入下列物质,冷却至温室,溶液的PH没有改变的是A,CO2 B ,CaO C ,NaOH D,HCl 冰片怎么溶化 怎样学习我很难理解概念,总觉得很模糊.每个知识点很难联系在一起.我对遗传学比较有兴趣,但是感觉很难.我花了很多时间去了解、记忆, 氢氧化钙溶液中通入或加入下列物质,不能使溶液的PH显著降低的是A、硫酸 B、氯化铜 C、氯化钡 D、二氧化碳 怎样快速去除养殖水体的氨氮,亚硝酸盐? 生物遗传现象简介 在氢氧化钙饱和溶液中加入什么不影响PH值A、通入二氧化碳B、加入大量水C、加入盐酸D、加入石灰石 亚硝酸盐,氨氮都是正常,为什么PH值会过高呢?HP值在9.2虾放里水里面后3-4个小时就全部都死光了,请问这个问题怎么决解,是什么原因呢? Aa与Aa自交生出AA:Aa:aa=1:2:1为什么有时算Aa的概率=2/3为什么有时候概率是1/2什么时候分母4为什么时候分母为3哈 向氢氧化钙的饱和溶液中加入下列物质,不可能使溶液的ph有明显变化的是 A通入CO2 B加入稀H2SO4 C加入氧化钙 D加入Na2CO3溶液 是不是是OH-的浓度决定酸碱度,而不是OH-的数量 氯化钠是熔点是多少?为什么 血液和尿液中同时含有蛋白质是什么原因 氢氧化钙溶液中加入下列哪种物质不能使ph值显著降低?单选 A.硫酸B.氯化铜C.氯化钡D.二氧化碳请说明理由 补分的 我的海水缸no2 no3都偏高,怎么办? 为什么第一题第一个空不是AA呢\?第二题为什么没有AABb?还有,计算怎么算?AA aa AaBb AaBB 20/27 怎样把重铬酸钾中的六价铬还原成三价铬 为什么鱼塘里的水亚硝酸盐的量越来越高如何降底? 海水中的亚硝酸盐含量受温度影响大吗?家里有养殖海参的,在温室里,温度有十八度左右.本来海水亚硝酸盐含量符合标准(海水温度5度左右),可放到温室池子里浓度就超标了,懂化学和水产的 关于基因遗传某女性患红绿色盲,她的下列亲人中肯定携带色盲基因的是A 祖父 B 外祖父 C 外祖母 D 祖母求详解 ETFE塑料介绍? 降低氯化钠熔点怎么降低?还有,电解时生成钠,但钠很活泼,能与空气反应,那在电解时应注意什么,才不会让刚生成的钠又与空气反应? 如果父母双方都有某病,那么无论孩子男女都会患比病,如果父母双方有一个人有此病,那么生出的女孩百分百患病,男孩百分之五十患病,我想问一下这种病是什么遗传病?好久没做过生物遗传题 鱼塘水亚硝酸盐超标,该怎么办?鱼塘亚硝酸盐超标,怎么把亚硝酸盐的含量降下来?换水除外,我主要是问泼洒什么药物? 遗传变异对生物本身的意义是什么?A .能培育出新的品种B.能保持前后代染色体数目恒定C.能把性状传给后代D.既能保持种族的延续,又能使后代适应变化了的环境 1.假定某三体植株自交时,n+1的胚囊全部参与受精,而参与受精的花粉中,n+1的花粉只有10%。那么,该三体植株自交子代群体中,四体、三体和正常二倍体个体数分别是?5%、50%、45%)请问为 氯仿是什么哦?分子式以及它的空间结构 生物遗传特性和变异特性的意义是什么? 【急求解】一道高中生物题,遗传方面的一株纯黄玉米(YY)与一株纯白玉米(yy)相互传粉,两株植株结出的种子的胚和胚乳的基因情况是:A、胚细胞相同、胚乳细胞不同B、胚细胞和胚乳细胞都 冰片则么融化在中药里?有没有不用酒精那些的 因为当时医生只说了在煎好中药之后放进去 生物遗传与变异的意义, 打针时进了空气会不会死?不进血管也会死吗?多久会死? 鱼池水亚硝酸高怎么办? 请问蒸发器的作用是什么? 人的身体进多少空气会死 如何融解冰片 谈谈遗传的生物学意义. 为什么将空气注入静脉会导致人体死亡呢? 鱼塘的亚硝酸盐高怎样才能降低? 冰箱里蒸发器的作用是什么请简明扼要 什么叫往身体注射空气? 怎样把冰片溶解到白凡士林中? x克Na2O和y克的Na2O2分别加入等质量的水中(水足量),结果得到等质量的溶液,则x和y的关系.比大小x克Na2O和y克的Na2O2分别加入等质量的水中(水足量),结果得到等质量分数的溶液,则x和y的关系 为什么打针时要是针管里有空气,住入人体里人就会死呢?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘