Kylix 2程序设计入门教程

附录

Kylix是Borland公司以Windows中最受欢迎的RAD工具──Delphi为基础,特别为Linux操作系统打造的可视化RAD工具,简单地说Kylix就是Delphi For Linux。
使用Kylix,你可以开发基于Linux的GUI、Internet、数据库和服务器应用程序。它包括一个新的高速的用原生代码编写的基于Linux的C/C++/Delphi编译器,还包括一个Linux版的Borland VCL类库。这个Linux版的VCL既能简化Linux应用程序的开发,又便于移植Windows和Linux平台下的Delphi/C++ Builder程序。
本文基于Kylix 2,向你详细讲述Kylix程序开发。

一、安装Kylix

1.系统需求

要保证你所安装的Kylix顺畅运行,必须满足以下要求:
(图1)

图1
图1

2.安装前的准备工作

(1)对Linux的一些需求:
某些版本的Linux的Glibc装载器存在的Bug,会在动态装载或卸载共享对象时,导致数据崩溃。如果你的系统无法通过升级使Glibc达到2.2以上版本,就请使用修补过的2.1.2版本或更高的Glibc。不同版本的Linux对Glibc的称呼也不同,如SuSE就称它为Libc,在安装时需要注意。
Kylix要求Libjpeg的版本最低为6.2。安装盘里提供有Rpm补丁包。
(2)测试操作系统:
Kylix的安装盘提供了“Borpretest”程序检测上述的所有问题。进入“Borpretest”文件夹,使用如下的Shell命令即可对Linux进行检测:
sh testsystem
如果顺利通过测试,会提示:
Looks GOOD !!!
This system should be able to run Borland Kylix!
表明你的Linux操作系统满足安装的要求。
(3)安装和运行:
在对Linux进行检测,解决了可能出现的问题后就可以安装Kylix了。强烈建议安装时不要使用Rpm、Kpachage和Gnorpm等包管理器,使用Borland公司提供的安装与卸载工具。
另外,只要有足够的硬盘空间,任何用户均可安装Kylix。如果你没有超级用户(Root)密码,也可以使用普通用户的身份来安装Kylix。下面是它的详细安装步骤:
如果你要以超级用户身份安装Kylix,则以超级用户的身份登录;如果是在X-Windows下安装,打开一个Shell窗口,首先进入Kylix安装目录,执行Shell命令“sh setup.sh”。
将安装盘放入光驱,加载CD-ROM文件系统。这里假定你的CD-ROM的加载点是Cdrom,则可以执行如下Shell命令“mount/mnt/cdrom”;执行Shell命令“cd/mnt/cdrom”命令,打开CD-ROM文件系统。
执行Shell命令“setup.sh”,即可执行安装程序。如果你的CD-ROM文件系统不支持可执行操作,则执行Shell命令“sh setup.sh”即可。
在出现的许可协议窗口中点击“I Agree”按钮。
在“Global Options”中,“Install Path”是Kylix的安装路径,Kylix默认的安装位置是在安装者的“/Home”下。Kylix不允许被安装在“/Boot”下,此目录对其他用户来说不能正常的访问,也不推荐以超级用户的身份运行Kylix。如果以超级用户的身份安装Kylix,就要指定其他的安装位置,如“/usr/local/kylix”。运行Kylix所必需的所有文件均在此目录下,此目录如果不存在,则安装程序会自动创建。此目录应该是对你是可写的,其他用户可读取的。
“Link path”是链接路径,它将包含Kylix IDE的符号链接、编译器以及使用帮助的阅读器。这个目录必须已存在,并且所有使用Kylix的用户都可读。链接路径与安装路径不能相同。
“Install Option”是安装选项,安装程序允许你对所有的安装选项独立选择。然而,只有主程序文件和帮助文件的选择是相互无关的,如果不选中主程序文件选项,此项没有安装,选择其他的选项将会导致错误产生。
设置完毕,点击“Begin Install”按钮,即开始安装Kylix。安装完毕,点击“Exit”按钮退出。
由于Kylix与Delphi的IDE界面相似,上手相当容易,我们不需要再花笔墨讨论。下面让我们进入本文的主题──Kylix程序设计。

二、Kylix的语法规则

1.字符集合与标识符

(1)字符集合:
Kylix的基本字符集由基本字符(字母、数字)和专用字符组成,它们均属于ASCII字符集中的字符。
字母:英文大写字母A~Z,小写字母a~z。
十进制数字:阿拉伯数字0~9。
十六进制数字:阿拉伯数字0~9,英文符号A~F(或a~f)。
专用字符:+、-、*、/、=、[、]、.、,、(、)、:、;、<、>、$、@、#、{、}、^。
下列符号均是两个专用符号组成,也是专用符号:
:=、<>、>=、<=、..、(*、*)、(.、.)。
此外,常用到的字符还有空格、单引号字符、下划线字符以及ASCII控制符等。
(2) 标识符:
标识符用以标记名字。程序中需要用到许多名字,有些名字在Kylix中具有特定的含义,称为保留字。而有些名字也是由Kylix规定的,用来标识预定义的类型、常量、函数、单元等,称之为标准标识符。其余的由是程序员根据程序要求选定的名字。Kylix在使用标识符时,必须先说明。
在Kylix中,标识符的形成规则是,由一个英文字母或下划线开头,后面可跟英文字母、数字和下划线的组合。标识符不能和保留字相同,在默认状态下,Kylix中只有前255个字符是有效的,而且它不区分英文字母的大小写。如Tform2和Tform_Show_978是合法的标识符。
Kylix的保留字:
(图2)

图2
图2

Kylix的标准标识符:
(图3)
图3
图3

另外,Kylix中还有一些预定义的标识符,这些标识符分布在Kylix系统中的各个库单元中,例如Sql、Trunc等标准的数学函数都在相应的库单元中定义,程序员在使用与这些预定义标识符同名的标识符定义变量、函数等时并不违背Kylix的语法。
通常,我们并不需要记忆这么多的保留字和标准标识符。默认情况下,Kylix的代码编辑器将用粗体显示保留字和标准标识符,这可以通过选择Kylix的菜单项“Tool→Editor options”,在出现的对话框中选择“General”选项卡,然后选择“Use syntax highlight”选项,点击“OK”按钮即可。

2.表达式

Kylix的表达式(Expresstions)是由运算符(Operator)及操作符(Operand)构成的。
(1)算术运算符(Arithmeric Operator):
算术运算符可分为一元运算符及二元运算符。其中一元运算符分为-(负号)、+(正号)等运算符,而二元运算符分为+(加)、-(减)、*(乘)、/(除)、Div(取模)、Mod(取余)等。
(图4)

图4
图4

(2)布尔运算符(Boolean Operators):
Kylix所提供的布尔运算符包括Not、And、Or、Xor等。
(图5)
图5
图5

(3)逻辑运算符(Logical Operators):
Kylix中较为常用的逻辑运算符除上面介绍的四个以外,还有Shl、Shr等,但你必须明白,这里的逻辑运算符与上面的运算符是针对不同对象的,前者的对象的布尔值,而这里的运算符针对的对象为整数。
(图6)
图6
图6

(4)字符串运算符(String Operators):
Kylix提供的字符串运算符比较简单。
(图7)
图7
图7

(5)集合运算符(Set Operators):
(图8)
图8
图8

(6)关系运算符(Relational Operators):
(图9)
图9
图9

3.变量和常量

(1)变量:
变量是在程序运行中可以改变数值的标识符。声明变量的语法结构如下:
var
变量名1:类型1;
变量名2:类型2;
……
变量名n:类型n;
(2)常量:
常量是程序运行中不能改变的数值。其语法结构如下:
Const
常量名1=常量表达式1;
常量名2=常量表达式2;
……
常量名n=常量表达式n;
(3)数据类型:
序数类型:序数类型也叫离散数据类型,它包括整数类型、字符类型、布尔类型、枚举类型和子界类型。前三者为系统预定义的数据类型,而枚举和子界类型需要用户自己定义。
(图10)

图10
图10

整数数据类型:
(图11)
图11
图11

字符数据类型:Kylix提供的字符数据类型包括Char、AnsiChar、WideChar等。
(图12)
图12
图12

布尔数据类型:程序的流程判断中,布尔数据使用率最高,在判断中,布尔数据的取值只可能是“真”和“假”,即是“Yes”和“No”。在Kylix中,布尔类型有以下几种:
(图13)
图13
图13

枚举数据类型:枚举数据类型定义了一个有序值的集合,这些值是通过枚举描述性标识符的方法来指示的,称为枚举直接量。枚举类型定义的一般形式是:
Type
类型标识符=(标识符1……标识符n);
例如:
Type
TmyDay(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
Var
Form1:Tfrom1;
MyDay:TmyDay;
子界数据类型:子界数据类型是一种数据类型,它由已定义(包括系统预定义和用户预定义)的离散类型中衍生出来,成为该类型的一个子域。子界数据类型对原数据类型的取值范围进行约束,但是保持了原数据的其他所有特性。子界数据类型本身也属于离散数据类型。子界数据类型定义的一般形式是:
Type
类型标识符=常数1..常数2;
例如:
Type
MyNumber:-127..128;
实数数据类型:一个实型数据用来存放实数。Kylix支持7种定义实数数据类型,它们是Real48、Single、Double、Extended、Comp、Currency以及Real。每一种类型规定了相应的取值范围,其所占内存字节数以及所能达到的精度(即有效数字位数)。
(图14)
图14
图14

三、Kylix的控制语句

1.循环语句

(1)Repeat循环:
Repeat循环可重复执行某些特定的程序代码,直到判断条件为True才结束,通常用于至少执行一次的循环,其语法结构是:
Repeat
语句1;
……
语句n;
Until 布尔表达式(结束条件)
例如:
Procedure TForm1.Button1Click(Sender : TObject);
Var
Temp:integer;
Begin
Repeat
   Temp:=Temp+1;
Until Temp = 100
End;
(2)While循环:
While循环可重复执行某些特定的程序代码,每次进入While循环都会进行条件判断,只有判断条件为True才进入循环。通常用于执行不确定的循环。其语法结构是:
While 判断条件 = true Do
Begin
语句1;
……
  语句n;
End;
例如:
Procedure TForm1.Button1Click(Sender: TObject);
Var
x:integer;
Begin
x:=99;
While x>0 Do
x:=x-1;
End;
(3)For循环:
For循环可重复某些特定的程序代码,它可以指定循环变量的上、下及重复次数,因此它通常用于执行次数特定的循环,其语法结构是:
For 循环变量:= 初值 to 结束值 do
Begin
语句1;
……
语句n;
End;
例如:
Procedure TForm1.Button1Click(Sender: TObject);
Var
x,sum:integer;
Begin
sum:=0;
for x:=1 to 100 do
sum:=sum+x;
End;

2.控制语句

(1)If判断语句:
If判断语句,可以判断结果,分别执行各个不同的程序代码。如果语句只有一条,则不需要Begin...end,其中Else可以根据需要而决定是否套用。其语法结构是:
If 判断条件 then
  Begin
  语句1;
  ……
  语句n;
  End
Else
  Begin
  语句1;
  ……
  语句n;
  End
例如:
Procedure TForm1.Button1Click(Sender: TObject);
Var
Number:integer;
Begin
Number:=1;
if Number = 1 then Number:=Number+1
else if Number = 2 then Number:=Number -1
else Number:=9;
End;
(2)Case判断语句:
简单地说,Case语句是多个If语句的简化,可以判断结果,分别执行各个不同的程序代码。如果语句只有一句,则不需要Begin...end,其使用的数据类型仅限于Integer Type、Char Type、Enumerated Type及Subrange Type等。其语法结构是:
Case 判断条件 of
结果1:表达式1;
……
结果n:表达式n;
else
表达式
End;
例如:
Var
Number:integer;
Begin
Case Number of
100 : ShowMessage('Your score excellent!');
80..90 : ShowMessage('Fine');
70..80 : ShowMessage('Well');
60..70 : ShowMessage('Pass');
else
ShowMessage('Sorry,you failed!');
End;
End;

3.其他容错语句

(1)With语句:
With语句可让程序变得更简短、更易维护,其语法结构是:
With 组件1、组件2 do
Begin
语句1;
……
语句n;
End
例如:
Procedure TForm1.FormCreate(Sender: TObject);
Begin
With Label1,Memo1 do
Begin
Enabled:=true;
Align:=alNone;
End;
End;
(2)容错语句:
写一个程序,如果针对每一种状况加以判断,程序可能会很冗长,而且非常乱。而采用异常容错处理判断,就能很好地解决这个问题。
Try...Except异常处理结构如下:
Try
<表达式列表>
Except
<接受错误>
End;
而Try...Finally语句也是异常容错处理的一种,它通常用于执行一些必要的程序代码,如果动态建立一个组件,当用户不再使用这个组件时,就可以用它来释放。这可以说是一种资源保护的好方式。其语法结构是:
Try
<表达式列表1>;
Finally
<表达式列表2>;
End;

四、Kylix的过程和函数

1.过程和函数

让我们首先来认识过程。一个过程是一段程序代码,它在被调用时能执行某种特定功能并能够返回到调用它的地方。过程定义如下:
Procedure procedureName(parameterList);directives;
LocalDeclarations;
Begin
Statements
End;
其中ProcedureName是过程名,为一个有效的标识符。ParameterList为参数列表,需要指明参数的个数及其数据类型。Directives是一些关于函数的指令字,可以一次设置多个,使用分号隔开。Localdeclarations中定义了该函数中需要使用的一些临时变量,通常也叫做本地变量。在Begin和End之间是在函数调用时实现特定功能的一系列语句。上面的ParameterList、Directives、LocalDeclarations和Statements等为可选部分。
函数和过程类似,不同的是函数在返回到被调用的地方时要返回一个值。具体的形式如下:
Function functionName(ParameterList):returnType;Directives;
LocalDeclarations;
Begin
Statements
End;
可以将函数要返回的数值赋给Result。如函数体中存在着一些由于判断而产生的分支语句时,要在每一个分支中设置返回值。通常要根据函数的返回值来确定下一步的操作。

2.传递参数

Pascal通过值或引用对函数和过程传递参数。传递的参数可以是基本类型、用户自定义类型或开放数组。如果变量在过程和函数中不改变它的值,也可以是常量。
首先让我们来认识值参数。将参数以值的形式传递是默认的传递方式,一个参数以值的形式传递,可以为创建这个变量的本地副本、过程和函数对副本进行运算。看下面的范例:
Procedure Eg (s:string);
当用这种方法调用一个过程时,一个字符串的副本就被创建,Eg()将对副本“s”进行运算,这表示对这个副本的任何修改都不会影响到原来的值。
Pascal允许通过引用把变量传递给函数和过程。通过引用传递的参数有时又被称为变量参数,通过引用传递参数意味着接收变量的函数和过程能够改变变量的值。为了通过引用传递变量,在过程或函数的参数表中用关键字Var。
Procedure google(var x:Longint);
Begin
X:=3;
End;
这里的关键字Var把变量的地址复制,因此变量值就能被直接接受。
如果不想使传递给函数或过程的参数被改变,就用Const关键字来声明它,即使用常量参数。关键字Const不仅保护了变量的值不被修改,而且对于传递给函数或过程的字符串和记录来说能产生更优化的代码。
procedure google(Const s:string);
开放数组参数能对过程和函数传递不确定数组,既可以传递相同类型的开放数组,也可以传递不同类型的常量数组,下面代码声明了一个函数,这个函数接受一个类型是Integer的开放数组参数:
Var I,Rez:integer;
Const j=27;
Begin
I:=9;
Rez:=AddEmup([I,50,J,86]);
End;
为了在函数和过程中使用开放数组,应用High()、Low()、SizeOf()等函数来获得关于开放数组的信息。下面是AddEmup()函数的代码,它返回传递给参数A的所有元素的总和。
Function AddEmUp(A:Array of Integer):integer;
Var
I:integer;
Begin
Result:=0;
For I:=Low(A) to High(A) do
Inc(Result,A[i]);
End;
Object Pascal还支持常量数组(Array of const)。这样,能把不同类型的数据放在一个数组中传递给函数和过程。下面是语法结构:
Procedure GotArray (A:Array of const);
可以用下面的代码调用上述函数
GotArray([′table′,90,33,@GotArray,true,′st′]);

五、调试Kylix程序代码

无论多么精巧的代码,都有可能出现错误(Bug),去除这些错误,就需要用到调试器。Kylix集成了调试器,使用它可以迅速地帮助你了解程序运行的情况,找出程序设计运行中的错误。

(一)警告与错误

警告通常是针对一些不会引起程序错误,但是违反编译器内部规范的语句。警告不会导致程序崩溃,只有一小部分需要注意。
1.语法错误
语法错误又称为编译错误。Kylix的代码编辑器提供了Code Insight功能,其中包括代码完成(Code Completion)功能,可以大大降低书写错误代码的产生概率。但此功能只是在代码设计时有效,运行时无效。
发生语法错误时,代码编辑器的下方会出现一个信息提示器,提示出错,而且编译器会自动停止在发生错误的最前面一行代码,并以咖啡色显示。同时,如果你用鼠标双击信息提示器中的错误或警告行,代码编辑器会在对应代码的发生错误的地方以咖啡色显示。
导致语法错误的主要原因有:关键字错误、语句末尾丢失分号、变量未定义、变量赋值类型错误、参数传递错误等。
语法错误,一般在程序运行前或编译前就可以查出。所以,这类型错误称为静态错误。
2.运行错误
运行错误指的是应用程序在运行期间,一个语句企图强制执行一个不能执行的操作所产生的错误。例如下面的语句:
Procedure Getnum;
Var
i,j:integer;
sum:integer;
Begin
i:=9;
j:=0;
sum:=i/j;
End;
上面的语句中,本身没有错误,编译也可以通过,但变量j的值是0,除法就无法进行有效操作,这就产生了异常。这种错误从静态的代码是看不出来的,只有在运行时,才会被检测出来。对于这种错误,如果要针对每一种情况进行判断,就会使代码变得非常的长,而且非常乱。为此,我们可以在程序中加入异常检查语句。若检查出异常,则可在程序代码中显示出错信息,从而可以保证程序运行正常。这里用到我们前面所讲的几种异常处理的方法:
(1)Try...Except语句:
将前面代码改写如下:
Try
sum:=i/j;
Except
on EzeroDivide do HandleZeroDivide;
End;
这里,就对被0整除的异常进行了处理。
(2)Try...Finally语句:
下面是一段强制执行关闭文件操作的程序代码:
Try
{对文件F的操作过程}
Finally
closeFile(F);
End;
这段代码就确保了关闭文件操作的执行。
3.逻辑错误
逻辑错误,指应用程序编写时,由于考虑不周详或算法设计有误,导致逻辑上有误。这类型错误从语法角度来看,应用程序的代码可以是有效的,在运行时也没有执行无效的操作,但产生的结果与预计的结果不同。这种类型的错误一般很难用观察源代码的方法找出来,需要进行调试。只有根据程序的运行结果与设计思路结合分析,才能检测出错误。
通常一个调试程序最少应该具备四种职能。即跟踪、断点、查看变量、更改变量。
调试一个程序最重要的就是跟踪程序。跟踪程序使程序员在运行程序时,能够看到执行指针在原代码中的实际位置。在Kylix中,程序员可以采取多种方式来进行跟踪,对代码逐行跟踪,直到找到结果。

(二)使用断点

大多数程序通过使用断点中止执行程序。在Kylix中运行程序时,它是全速运行的,只在设置断点的地点停止。断点就是让调试器暂停执行程序的标志。
1.断点类型
(1)代码断点:设定在代码中第几行的断点,程序运行时就停在那里。代码断点又可分为简单断点、条件断点和记数断点。
简单断点在断点位置停止执行程序。在代码编辑器上的装订线上单击鼠标或点击“Run→Add Breakpoint→Source Breakpoint”菜单命令,在打开的“Add Source Breakpoint”对话框中添加断点的默认选项都是简单断点。
条件断点则需要在“Add Source Breakpoint”对话框的“Condition”框中输入相应的条件表达式。程序运行时,每次遇到断点都计算这个条件表达式。如果条件表达式求值为True,则程序暂停,否则忽略这个断点。
记数断点是程序检查该断点的经过次数,程序只在经过次数到达一定值时才暂停。为了指定经过记数断点,编辑断点并在“Add Source Breakpoint”对话框的“Pass Count”框中输入一个数。
注意:条件断点和记数断点会减慢程序的正常执行,这是它们的不足之处。
(2)地址断点:可以设定断点是在一个机器指令运行时,CPU窗口显示程序停止到那个地址的指令。地址断点同样可分为简单断点、条件断点和记数断点,它与代码断点颇为相似,这里就不再多说了。
(3)数据断点:可以在一个特定的地址设定断点,运行程序停止到那里。对此中断的操作需要对内存管理与地址分布非常熟悉,这里就不再深入讨论。
(4)模块载入断点:设定此种断点后,当内存载入此模块时,程序停住。这里的模块可以是so文件、sa文件或者其他类型的文件。设定模块载入断点时,在“Add Module”对话框中写上模块的名字或者浏览模块所在位置都可以。
在这四种断点中,地址断点和数据断点在调试时才可以设置,而代码断点和模块载入断点在设计与调试时都可以设置。
2.设置和清除断点
(1)红色小圈:为了设置断点,点击编辑器窗口中要暂停程序执行的行左边装订线处(装订线是代码编辑器窗口左边的灰色边线)。装订线上即出现断点图标(红色小圈),整行语句显示亮红色。如果要清除断点,只要点击断点图标,断点就被删除了。也可以按下F5键或选择代码编辑器弹出菜单的“Toggle Breakpoint”切换设置或清除断点。断点只能在产生实际代码的行上设置。空行或者说明语句或声明语句上的断点无效。虽然这些语句也可以设置断点,但调试器会发出警告。开始调试以后,有效断点上有一个“√”,无效断点仍然是红色。断点上的“√”表示断点经过检查,被确定为有效断点。
(2)蓝色小点:经过运行或者编译以后,代码编辑器某些语句的装订线上会有一些蓝色小点。这些蓝色小点表示源代码中实际产生汇编代码的语句。
注意:小点只在某些语句旁边有,没有小点的语句是不产生汇编代码的语句。
(3)绿色箭头:程序在调试器中运行时,它一切正常,直到遇到断点时,出现代码编辑器,单步执行代码时执行点的行出现绿色箭头。随着绿色箭头的移动,单步执行所在的代码行的同时,我们可以清楚地看到程序所发生的变化。
(4)灰色小圈:断点上的右键弹出菜单,或是断点列表上的右键菜单均可执行Enable、Disable操作。
Enable:触发断点。在一个断点被屏蔽以后,可以对它再次进行触发,使它能够工作。
Disable:屏蔽断点。屏蔽断点时,断点并没有被清除,而是被隐藏起来,不让它起作用,程序在遇到它时不会停止。断点被屏蔽以后,原来的小红圈变成灰白圈,代码也由红色变为绿色。
在断点停止时,可以单步执行代码、浏览变量、浏览调用堆栈或浏览符号。检查变量和对象后,可以点击“Run”按钮或按下F9键恢复正常程序执行。应用程序将再次执行,直到遇到下一个断点。
我们经常要在断点上停止后检查代码中所发生的错误。如果在调试过程中修改源代码,然后选择“Run”恢复程序执行,则IDE会提示一个消息框,询问是否重新编译。选择“Yes”即可。
在《电脑报2002年合订本附赠光盘》中,我们给出了Kylix的开发实例,读者可以参看相应文章。

六、开发实例

下面我们将例举一个小例子--编一个跑表程序。
首先在Standard控件板上选取Button控件(按钮控件),在窗体中点一下,这个控件就放在了窗体中,同样,再放两个Button到窗体中。在Additional控件板中选取一个LCDNumber控件(液晶数字效果的显示控件)和一个Timer控件(定时器控件)放到窗体中。然后把各个控件在窗体中排列一下((图15))。

图15
图15

然后设置各个控件的属性。把Button1的caption属性(按钮上的显示)设为start,Button2的caption属性设为stop,Button3的caption属性设为0。Timer1的Interval属性(Timer发生事件的时间间隔)设为10(毫秒),Enabled属性设为false。LCDNumber的value属性设为0。至于Form1的caption属性,就叫My Kylix program吧。
然后是写事件的响应代码。我们需要设置一个变量作为计数器。要Button1在按下时开始计数,Button3在按下时停止计数,Button2按下时,计数器清0。并在Timer发生响应时计数器自加,并把计数器的值通过LCDNumber显示出来。由于鼠标按下Button、Timer产生响应都是该控件的默认事件,所以直接双击该控件就会自动跳出代码编辑窗,添加代码即可。
以下是该程序的源代码:
unit Unit1;
interface
uses
SysUtils, Types, Classes, Variants, QGraphics, QControls,
QForms, QDialogs, QStdCtrls, QTypes, QExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
LCDNumber1: TLCDNumber;
Timer1: TTimer;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:word; //定义计数器变量
implementation
{ *.xfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true; //开始计数
Button3.Enabled:=false //禁止清0
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
i:=0; //计数器清0
LCDNumber1.Value:='0'
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=false; //停止计数
Button3.Enabled:=true //允许清0
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(i); //计数器自加
LCDNumber1.Value:=inttostr(i)
//计数的显示,这里只是简单地把数值显示了出来,单位是百分之一秒
//如果要做得更像跑表,应该进行时/分/秒的换算
end;
end.
好了,程序写完了,按F9运行该程序,试试看吧。