可视化程序设计入门之乱谈控件
很多以前做DOS程序设计的朋友,刚转到Windows下可视化程序设计时,会对“控件”这东西搞不清楚,觉得很神奇,随便把一个按钮拖到窗口就可以了,不用写一句代码就可以生成一个可执行文件(当然,这个程序只有一个窗口和一个按钮,什么也做不了)。编程变得就像搭积木一样简单。确实,可视化程序设计的出现,大大减轻了程序员的负担,以前搞一个程序,70%的时间用来写界面,30%的时间设计代码。现在则恰恰相反。可视化程序设计环境的出现,使程序员可以花更多时间来调试程序。当前比较流行的可视化程序语言有VB、DELPHI、VC等。严格来说,VB的控件才是真正的控件,VC的MFC类库是土生土长的SDK产物,而DELPHI吸收了VB和VC的精华,它的控件叫VCL组件。INPRISE(英博师,即以前的BORLANDE)的设计师称我们进入了“组件时代”。
要真正把控件说明白,就要从面向对象程序设计讲起,重点介绍类的封装、继承等等东西,下面我想避开这些概念,从另外一个角度来解释。正不正确请大家指正。要想真正了解控件的本质,请另行查找资料。希望本文不会误人子弟,则足已!
相信搞过程序设计的人都会有这样的经历:在一个程序中用过的代码,有时侯会在设计别的程序时用到,早期用机器语言时代,一般的做法是把这段代码记录下来,以后用到时就把它再敲一遍。高级语言的出现,使程序员可以设计自己的函数和过程,于是就变成了把常用的代码写成函数或过程,或子程序,如C语言中可以定义为自己的头函数。(顺便说一句,即使是现在,这个方法还有很多人用,把一些常用的函数和过程做成一个单元---当然,在DELPHI中也可以把它变成自己的控件)。
什么是函数?例如UDP协议中可以指定一个IP地址来进行通讯,也可以进行网络广播(即一次可以把信息发给同一个IP段)。我们知道,1~126.XXX.XXX.XXX (A类网)、128~191.XXX.XXX.XXX(B类网)、192~254.XXX.XXX.XXX(C类网)的广播地址分别为1~126.255.255.255 (A类网)、128~191.XXX.255.255(B类网)、192~254..XXX.XXX.255.(127开头的IP属于保留地址,如127.0.0.1是自己的地址)。比如说IP地址192.168.0.45属于C类网,那么它的广播地址就是192.168.0.255.又比如说IP地址125.161.0.45属于C类网,那么它的广播地址就是125.255.255.255.如果你经常要用到这个的话,这时候我们就可以写一个以下的函数:
Function Trun_ip(S:string):string;
var s1,s2,s3,ss,sss,Head:string;
n,m:integer;
begin
//s:=192.168.0.23
sss:=S;
n:=pos('.',s);
s1:=copy(s,1,n);//192.
m:=length(s1);
delete(s,1,m);
Head:=copy(s1,1,(length(s1)-1));
n:=pos('.',s);
s2:=copy(s,1,n);//168.
m:=length(s2);
delete(s,1,m);
n:=pos('.',s);
s3:=copy(s,1,n);//0.
m:=length(s3);
delete(s,1,m);
ss:=sss;//127.XXX.XXX.XXX
if strtoint(Head) in [1..126] then ss:=s1+'255.255.255'; //1~126.255.255.255 (A类网)
if strtoint(Head) in [128..191] then ss:=s1+s2+'255.255';//128~191.XXX.255.255(B类网)
if strtoint(Head) in [192..254] then ss:=s1+s2+s3+'255'; //192~254.XXX.XXX.255(C类网)
Result:=ss; ////192.168.0.255
end;
使用这个函数时只要把一个有效的IP地址送进去,就会返回该IP地址的广播地址。如Trun_ip(192.168.0.45)就会返回192.168.0.255.
有了上面的基础,我们再来设想一下:Windows下经常要用到窗口、按钮、菜单,如果也能做成一个函数,给出窗口的大小坐标等就得到(返回)一个相应的窗口,那就好了,于是,(在可视化程序设计出现之前)有人就把这个想法实现了---如C中的类库,可以看成是很多函数过程的集合,即另一种形式的函数。但这个做法有一个明显的缺点,就是无法在设计时刻看到相应的结果,必须把文件编译为可执行文件后,发现不够理想的地方回到代码中再修改。后来,面向对象的出现,类等新概念的出现,产生了升华,导致程序设计产生了质的飞跃,那个想法就变成了现在的控件,比如说VB、DELPHI中,在属性栏改变控件的属性(相当于把一个值给一个函数),就可以立刻看到相应的结果(函数返回的值),跟上面的IP地址转换函数一样,只不过控件是由很多子函数组成的。
当然,不能说控件就是函数,因为,以前的语言设计语言机制是面向过程的。(通俗来说,DOS程序像一条线(DOS操作系统除外),从第一条语句开始一直执行到最后一句,然后结束。如果中间有要求用户输入,则停顿一下,等待输入然后继续往下执行到结束,退出。而Windows下的程序更像一个圆,它采用消息驱动机制,程序运行后就处于等待状态,执行完语句后又返回等待状态,接收到退出的消息后才退出程序。消息驱动机制使同时执行多个程序变成可能,系统会自动在几个线程间调度。程序是静态的,线程才是活的。另外,Windows采用了虚拟机的概念(这也是很多汇编程序语言在Windows下运行不了的原因)....唉,离题了,Sorry......)要明白是怎么回事,还是请大家自己回去翻书吧。
说了半天,不知道大家明白了没有,我可是累死了。就先说到这里吧,下次再来乱谈一下。:)
最后附上我大一当学校计算机系简报主编时写的一编小东西,对知道什么是面向对象程序设计的了解可能有帮助。