上一节介绍了Lazarus一般的开发操作流程,对于不熟悉pascal语言的朋友可能看的还是不大明白,不知道pascal代码里都应该包含什么或起什么作用,这回就简单地介绍下语法及代码文件的结构。当然,只是描述一下通常会用到的东西,如果想深入了解pascal,请参考本节最后推荐的书。
free pascal的代码文件一般只有两种,.lpr和.pas(或.pp);lpr文件是工程文件,pas或pp是单元文件。一个完整的pascal工程必须包括一个lpr文件。来看一下Lazarus默认创建的工程都包括些什么。打开Lazarus后点击全部保存,选择路径并确定,保存为默认的文件名。
project1.lpr - 工程文件,整个程序的入口,一般情况下不需要手动修改;
project1.res - 工程资源文件,保存版本、字符串等,不需要手动修改;
project1.lpi - 工程管理文件,保存工程的信息,Lazarus靠此文件管理所有的文件为一个工程,不需要手动修改;
project1.lps - IDE环境关闭时的信息,包括各种编辑窗体最后的位置等信息,不需要手动修改;
project1.ico - 图标文件,编译为可执行文件后显示的图标,不需要手动修改;
unit1.pas - 窗体源代码文件,可手动添加代码;
unit1.lfm - 窗体属性代码文件,不需要手动修改;
可以看到,真正需要编写代码的地方只有一个文件,unit1.pas。后面我们就着重分析一下这个文件的结构。
注:unit文件保存的时候也可以选择扩展名为.pp。.pp和.pas文件的关系:.pp就是.pas文件。Delphi默认的源代码文件为.pas,而Lazarus的源代码文件为.pp。Lazarus为了兼容Delphi,可以支持这两种扩展名,所以除了扩展名不同意外它们没有任何区别。
下面是一个pas文件的代码,我做了些注释,可以很清晰地看出各个部分的作用。
pascal的代码文件不分.h或.c,都包含在了.pas文件中,使文件结构更加简洁。需要对外开放的函数或定义,只要写在implementation之上就可以了,代码编辑器在写入.后会自动提示可见的东西,不可见的则不会被显示。
结构说的差不多了,还是来看看pascal的语法吧。语法和C语言大同小异,只是把C里的{、}换成了begin、end,变量定义的名称和类型调换一下位置就算是会pascal了。呵呵,这样说法未免太不负责任,会遭到鄙视的。不过在语法上真的差别不大,差别最大的地方是pascal有类这个东西。而类的说明我希望留在下一节,结合ClassA20的类库来讲解,这样更容易接受。本节还是继续基础的东
西吧。
pascal不区分大小写,以下为本人的习惯写法,仅供参考。
1.数据类型:
C | pascal |
int | Integer |
short | ShortInt |
long | LongInt |
unsigned char | Byte |
unsigned short | Word |
unsigned long | LongWord或DWORD |
float | Single |
double | Double或Real |
Boolean | |
*p | Pointer |
&p | @p或Pointer(p); |
想起来多少写多少,也许有错误,欢迎补充和指正。
2.操作符:
C | pascal |
= | := |
+ | + |
- | - |
* | * |
/ | div |
% | mod |
<< | shl |
>> | shr |
& | and |
| | or |
! | not |
^ | xor |
想起来多少写多少,也许有错误,欢迎补充和指正。
3.循环语句:
c | pascal |
for (i = 0; i < 10; i++) | for i:=0 to 9 do |
while (1) ...; | while (1) do ...; |
do ... while (1); | repeat ... until (1); |
想起来多少写多少,也许有错误,欢迎补充和指正。
4.比较语句:
c | pascal //有没有括号都可以 |
if (A == B) ... ; | if A = B then ... ; |
if (A || B) ... ; | if A or B then ... ; |
if (A && B) ... ; | if A and B then ...; |
switch (A)
{ case 1: break; case 2: break; default: break; } |
case A of
1: ; 2: ; else end; |
想起来多少写多少,也许有错误,欢迎补充和指正。
5.函数定义:
c | pascal |
void fun(); | procedure fun; |
int fun(); | function fun:Integer; |
想起来多少写多少,也许有错误,欢迎补充和指正。
6.着重说一下String:
C中没有字符串这个类型,只有字符数组char[],以‘\0‘结束。
pascal对字符串操作要强大很多,可以定义数组array of Char或array of Byte;
还有一个String类型。String即可以当错数组使用,也可以当成字符串使用,可以随时改变长度SetLength(String, 10),并且不需要手动释放当所在的函数生命周期结束后也就随之自动释放了(结构体中除外)。
数组转字符串:String(Byte数组或Char数组)
字符串转数组:String = @Byte数组[0];
取下标:Char:= String[1]; 或 Byte:= Ord(String[1]);
字符串相加:String:= String1 + String2;
字符串插入:Insert(String, SubString, Index);
字符串删除:Delete(String, Index, Count);
...
所以我一般在程序中都以String类型作为Buffer来进行传输或处理,操作很方便。
想起来多少写多少,也许有错误,欢迎补充和指正。
7.着重说一下异常处理:
C中没有异常处理。
pascal有try,try有两种:
try
//执行的代码部分
except
//异常处理部分
end;
当执行代码部分发生了任何执行失败,使用try可以不至于使整个程序崩溃停止运行,而是可以跳转到异常处理部分进行错误处理,或可以友好地提示用户。
try
//执行代码部分
finally
//强制执行部分
end;
无论在代码执行部分执行任何的打断或退出等语句,finally部分都会被执行到,一般用于释放资源或其他必要的处理。
两者可以结合使用:
try
try
//代码
except
//异常处理
end;
//代码
finally
//强制执行
end;
常用的东西基本上就是这些,下一节开始正式讲解ClassA20类库,敬请期待。
如果想下载ClassA20的封装类库文件,请访问:https://github.com/tjCFeng/ClassA20。