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

在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创建Excel报表 用VB读取和控制Windows的中文输入法 用VB将命令行软件Windows化 用VB进行移位操作 用VB开发CAI软件的小经验 用VB开发分布式应用 用VB切换三个特殊键 用VB生成EXE文件后,如何在后面加上参数?这个参数怎样传给VB 用VB实现动态显示操作进度程序 用VB实现双向循环链表 用VB实现用户登录密码的修改 用VB与MS-Draw开发通用作图软件 用VB制作TopMost类型窗口 用VB制作Windows风格安装盘 用Visual Basic 6创建基于MTS的商务组件 用Visual Basic实现Windows的重启动 VB用Windows管理技术做你的应用程序 VB用程序给标识字段(ID)赋值的一种简单实现方法 VB用自己的&#39;PROGRAM&#39;测试自己的电脑 有 BitMap 之Menu -VB资料 运行其他程序,并等待执行完毕 -VB资料 再谈VB程序的加密 在 VB 程序中如何设定 Mouse 光标的位置? 在ActiveX DLL工程中慎用App对象-VB资料 在ActiveX控件工程中设置DataField属性-VB资料 在VB中异步执行程序 在VB编程中有效地组织和利用资源 在VB应用程序中巧用DLL 在VB应用程序中使用INI文件的一点体会 在VB中操纵OLE服务器应用程序 在VB中改变显示器的分辨率 看看我的代码!来者有分! 我的WIN2000换了个Cpu,后来又换回去了,就不能进WIN2000了,如何解决? linux问题! 在线等!立刻给分! 简单的问题,只要解决马上送分 这个问题怎么解决?100分寻求解决方案. 是不是声卡的问题? 如何在dos下申请到当前目录? 字符串转换的的问题. double类型的数组,最大是多大啊? 請問關於dbtree問題? 请教各位一个问题 关于jms的问题 关于VBX,OCX32,VISA的问题 向高手请教鼠标的问题 Linux下自动执行命令的问题,哪位Linux高手帮帮我. 如何在Delphi中调用带参数的存储过程(要返回查询结果的)? 请问:能具体解释什么是流吗? 牛人中的极品(Z) ado连接access2000的极简单问题 [100分]如何让一个帐户同时只允许一个人在线?[100分] SQL语言嵌入C++!!!!! 无法向会话状态服务器发出会话状态请求。请确保已启动 ASP.NET State service,并且客户端和服务器端口保持相同。 鼠标移动到其上,如何显示提示的文字?请各位仁兄指点! 不通过声卡这样发出“嘟...”的响声? VLAN 怎么发电子邮件?? 请问哪里有WideString的定义? 问个关于域名注册的问题 为什么便宜的耳机用一段时间以后,就只有一边发声了?是什么原因?我想自己修,因为手头一大堆这种半报废的耳机 关于属性页的问题,请进 南京上空发现奇异天体 三名飞行员先后紧急报告 我装的weblogic610_win为什么在win2000下运行后打不开http://127.0.0.1:7001/console 有关route add问题 我装的weblogic610_win为什么在win2000下运行后打不开http://127.0.0.1:7001/console VC.NET中是否有支持odbc的类似DBGrid的数据表格控件? 大家推荐一下学习C#的书! htc文件在WEBSPHERE不能正常运行??? 大家在用c编程时,是怎样运用位运算的?(我c学得不好,请大家指教一下) 怎样从一个vlan的客户机访问到另一个vlan上的客户机,急 一个简单问题?关于查询方面的!请指点! htc文件在WEBSPHERE不能正常运行??? 有了Swing,还有必要使用AWT吗? 怎样将richtextbox中的内容存入sql server数据库? 哪位用VC做过拨号程序阿 紧急求援!!!pqmagic在Windows 2000 professional下的安装问题! 如何在PB中通过脚本将文本文件导入数据库中? 一玩3D游戏就退出,一上网就死机,本人用的是小影霸速配3000,何故? 舌尖的热恋(淡月儿) cbuilder5的工程用cbc6打开,编译的时候,出错。为什么?紧急求救!!!!!!!!!! 关于session的问题 如何读取相对路径的文件 i like playing table tennis with my friends.改为否定句 1.我的英语书在哪里?翻译成复数 2.My aunts like tomatoes.改成单数句子.3.Those are book s 改为单数 1、They are() (watch)TV on their next day off .2、He doesn't want ()(go)for a drive3、She ()(sleep )late last day.4、I don't think it‘s ()(fun) 5、We had a lot ()(fun)playing on the beach.6、I’d like i like playing ping pong that with my friends改为否定句 These books are mine and( )(these/those)bookThese books are mine and( )(these/those)books are Mary's. 1dont next to go a l drive on for day off want ma 2 in they yesterday camping rain went the3really was weather the terrible and it boring was .4students had school a the trip terrible.连词成句 急啊 求一个字形容低调? 高中与初中的区别 《紫藤萝瀑布》中“过了这么多年,藤萝又开花了,而且开得这样盛”怎样理解? 形容女性低调的词我不认识是叫什么持.请用拼音回答, 世界上哪国女人最美?不要说中国的,有人说是白俄罗斯的? 紫藤萝瀑布中“从未见过得这样盛的藤萝”中“从未”有何作用?突出紫藤萝的什么特征? 用一个字来形容低调,什么字好呢? 世界上哪个国家美女最美,除了中国 紫藤萝瀑布:觉得这一条紫藤萝瀑布不只在我的眼前,也在我心上缓缓留过,表现了作者什么样的心情? 秦始皇和汉武帝分别采取了哪些巩固国家统一? 形容长相神态的词语例如:恬静 英语翻译如题.1.She________his jacket and at last found the keys.A.went through B.went over C.went away D.went down 2.Maybe there are some things among the girl's papers,like her school reports,old photos and so on.Can you ___them and 秦始皇、汉武帝为实现、维护国家统一分别采取了什么措施? 形容外貌神态的词语 May I take some photos?用some 还是 any 为什么 为什么电器会在没有通电的情况下无故自然? 第2个路口右转的英文第2个路口右转 颌 读音是 具体是指的哪个部位? 用一个字来形容寒冷的风或者说用一个字,意思是寒冷的风 关于全运会的作文,可以是对全运会的畅想, “在第二个交通路口右转” 用英语怎么说 微风、轻微的风 用一个字概括 什么字最恰当啊?帮我想一想 想到什么写什么 直走,在第3个路口右转 英文 牛灭风 用一个字来组词牛,灭,风 求关于全运会的文章!我要写几份手抄报,关于全运会的, 初中课本的内容与高中课本的内容有什么区别或关系? 为什么关了电器的开关后还有电? 初二英语 快快快~~在线等1.There was a big h___in the boat and the water began to come inside.(根据首字母提示写出所缺的单词) 2.Stop____(talk) and I have something funny____ (tell) you.(用所给单词的适当形式填空)3.I 为什么初中课本上的牛顿第一定律的内容和高中课本上的不同? 用开关的电器全部不能用,但是插座有电,怎么回事? 关于2009全运会作文做文明小观众、小助手、小主人. go through 和look through 在表从头到尾看一遍时有什么区别. 秦始皇和汉武帝在经济上采取了什么样的措施初中课程 英语翻译他们每天开车从家到银行约花费半小时. 描写父亲或母亲的外貌.动作.神态.心里,4要有,最好是干家务活时的.150字 秦皇汉武在经济上采取了什么措施 高中的速度和初中的速度怎么区别,有什么不同? I have reached a point in my life where i am supposed to make decisions of my own.为什么要选填where?请详解、 秦始皇和汉武帝为巩固统一,发展经济采取了怎样的措施 欧洲最美丽的国家是 day off,he,dosen’t,his,want,to,next,go,drive,a,for,on连词成句think,I,like,day,busy,off,a,sounds,it连词成句 第十一届全运会在山东省召开,这次全运会( ),运动员们奋力拼搏,勇破亚洲和世界多项纪录填写描写场面的第十一届全运会在山东省召开,这次全运会( ),运动员们奋力拼搏,勇破亚洲和世 欧洲有哪些主要国家,著名城市主要国家? 新叶 哪两个自然段是总述 写给远方亲人的一封信 形容精神旺盛,容貌焕发的词语 新叶阅读答案.问题1用一句话概括2段的内容.2第3段4个比喻句.3第5段围绕哪几句面赞颂了新叶 l like playing with my friends[改为一般疑问句.并作肯定回答 My life would have came to an end when you think of me. 读音为he的汉字有哪些? i like going to the movies with my friends and playing sports.想彻底弄明白为什么go 要加ing 为什么movie要加s 为什么movies前要加the 为什么play要加ing 为什么sport要加S 我真人喜欢追根问底 想学好英语 长大出 those book are about english这句话的主谓宾是什么啊 he is just kidding用汉字写出来发音、
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘