delphi基础语法

高中时期,有幸上过2节pascal的课,老师讲了一些英文(实为关键字和变量),介绍了二进制及其计算,然理解不透,遂弃之。
十几年后,因工作需要维护一个上个世纪的 delphi 工程,故学之,但已无甚意义,简记之,供自学用。

技术总结

0、安装IDE。
1、看基础语法(不要求短时间内完全了解)。
2、IDE使用,快捷键。
3、各控件使用、属性等,弹出窗口,多窗口显示,logo,标题,最大/小化。退出程序。对话框弹出。

基础语法

杂项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
变量似乎不区分大小写。
else 前不能有分号`;`。
type定义类型,var声明变量。

delphi中`{$R*.DFM}`的意思是?--》包含同名窗体资源。

赋值::=
相等:= (if (a = 1) then xxx end)
不等:<>

^: 指针 @: 取址 #: 十进制符 $: 十六进制符


`#:ascii字符: const key = #9`
十六进制:$34 ==> 0x34

字符串:string abc
有符号32:integer longint
无符号8:byte,无符号16 word,无符号32 cardinal或longword
有符号8:shortint 有符号16 smallint 有符号64 longint(似乎没有uint64_t)
字符:char(ansichar) widechar(16位,unicode)
布尔:boolean
字符串:string pchar pansichar pwidechar

function和procedure

function 为函数,必须有返回值,返回值固定名称为result。procedure 为过程,无返回值。个人理解中,两者表现形式似乎没有区别。
非主函数中,用exit退出当前函数,相当于“返回”,注意,如果要返回值,在此之前要赋值给result。
过程没有返回值,函数有。似乎没有参数,可以不写()。但写上也没问题,为了区别,写之。
参数如要传出,前加var,类似C++的引用。
多个相同类型参数,可共用一个类型。如a, b:integer,golang似乎参考这种做法。

函数示例:

1
2
3
4
5
6
7
8
9
10
11
12
function foobar(a, b:integer): string;
var
ret:integer;
begin
if (a < 0) then // 此处判断参数合法,非法返回,类似 return语句
begin
result := '';
exit;
end;
result := IntToStr(a+b);
end;
(注:没有括号,相同参数只写一个类型,与golang类似。返回值只用result表示)

指针示例:

1
2
3
4
5
6
7
8
9
10
function test2():integer;
var
i:integer;
p:^integer; // 整型指针

begin
i := 100;
p := @i; // 取地址
result := p^; // 取地址的值
end;

编程小结

界面编程中,dfm文件中的中文,使用unicode(可能其它的,待确认),已不可直接观察。无法搜索关键字。对于多窗口工程,较麻烦。
界面入口为 FormCreate,要设置响应事件,否则不生效的。
生成可执行文件目录配置(release或debug),在IDE中选,保存到dproj文件。

片段

1
2
3
4
5
显示信息对话框:
MessageBox(0 , '是否要退出本系统?' , '提示信息', MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2 + MB_TASKMODAL);

简单版本:
ShowMessage('这是换行测试,' + #13 +'可以吗?' + #13 + '能不?');
1
2
数字转字符:IntToStr(100)
字符转数字:StrToInt('123')
1
2
3
4
5
  STR := Format('111111111111111111'+
'bbbb: %s\r\n', [currentVs]);

string转PAnsiChar:
Edit1.SetTextBuf(PAnsiChar(AnsiString(myStr)));

枚举:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 枚举和数组示例
// 通过枚举值索引数组
function test3():string;
type
EWEEK = (MON, TUE, WED, THU, FRI, SAT, SUN);
EColors = (RED, GREEN, BLUE);
Tb = array of integer;

var
myColor: EColors;
myWeek: EWEEK;
a: array[0..3] of integer;

// 错误
//cWeek: array[0..6] of PWideChar = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');

begin
myColor := BLUE;
myWeek := FRI;
a[0] := 1;
A[1] := 2;
a[2] := 100;
result := format('%d %d', [ord(RED), b[2]]);
//result := cWeek[ord(THU)];

end;

自定义类方法

1、新建单元,保存,在工程中添加单元。
2、定义类:

1
2
3
4
5
type
CFoo = class
public
function FooTest(value: integer): integer;
end;

实现方法:

1
2
3
4
5
6
7
function CFoo.FooTest(value: integer): integer;
var
i:integer;
begin
i := 100;
result := i + value;
end;

3、使用。在uses中引入单元名。定义类,调用类方法: a := myFoo.FooTest(100);

字符串操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
如果要使用LeftStr,RightStr,MidStr必需引用系统单元StrUtils;

声明变量Str:string;

Str:=HelloWorld;

1,LeftStr(Str,2)=He;//从Str字符串变量的最左边(第一个字符包括第一个字符)开始截取2个字符;

2,RightStr(Str,2)=ld;//从Str字符串变量的最右边(第一个字符包括第一个字符)开始截取2个字符;

3,MidStr(Str,2,2)=el;//从Str字符串变量的中第2个字符开始取长度为2个字符的字符串;

另外有一个函数Copy

4,Copy(Str,2,2)=el;//从Str字符串变量的中第2个字符开始取长度为2个字符的字符串;(类似于MidStr);

控件及其它缩写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
控件类名及解释 缩写
TActionList, TAction表示动作的列表项 act
TButton, TSpeedButton, TBitBtn等所有的按钮类 btn
TCheckBox, TDBCheckBox等所有的检查框 chk
TRadioButton单选按钮类 rdo
TToolBar工具条 tb
TMainMenu所有的主菜单类 mm
TMainMenuItem所有的菜单项类 mi
TPopupMenu所有的弹出式菜单类 pm
TPopupMenuItem所有的弹出式菜单项类 pmi
TLabel, TStaticText等所有用来显示的标签类 lbl
TPanel等所有的面板类 pnl
TPageControl等所有的页式控件类 pgc
TEdit, TMaskEdit等所有的单行编辑框类 edt
TMemo, TRichEdit等所有的多行编辑框类 mmo
TDrawGrid, TStringGrid等所有的网格类 grd
TAnimate等所有的动画类 ani
TImageList等所有的图片列表类 il
TImage等图片类 img
TChart图表类 cht
TComboBox, TDBComboBox等所有的下拉式列表框类 cbo
TListBox, TDBList等所有的列表框类 lst
TTreeView tv
TListView lv
THotKey hk
TSplitter等所有的分隔符类 spt
TOpenDialog等所有的对话框元件类 dlg
TTable等所有的数据表类 tbl
TQuery等所有的SQL查询类元件 qry
TClientDataSet所有的客户数据集元件 cds
TDataSource ds
TDatabase db
TSockConnection,TDCOMConnection等连接元件类 con
TQuickRep, TFastReport等所有的报表元件类 rpt
TDDEClientConv,TDDEClientItem等所有的DDE元件类 dde
TMonthCalendar等所有的日历类 cal
TGroupBox等控件类 grp

Frm Form
Mnu MainMenu, PopupMenu, MenuItem
Lbl Label, DBLabel
Edt Edit, Memo, DBEdit, DBMemo, MaskEdit
Rtf RichEdit
Btn Button (BitBtn, SpeedButton)
Chk CheckBox, DBCheckBox
Opt RadioButton
Lst ListBoxes (e.g. TListBox)
Cbx ComboBoxes (e.g. TComboBox)
Sbr ScrollBar
Grp GroupBox, RadioGroup, DBRadioGroup
Pnl Panel

Tvw TreeView
Lvw ListView
Iml ImageList
Pge PageControl
Trk TrackBar, RzTrackBar
Pbr ProgressBar, RzProgressBar
Sts StatusBar, RzStatusXxx
Key HotKey

Sbx ScrollBox
Tab TabSet, TabControl
Nbk Notebook
Tbk TabbedNotebook
Out Outline
Grd StringGrid, DrawGrid, DBGrid, ColorGrid, DBCtrlGrid
Img Image, DBImage
Pbx PaintBox
Shp Shape
Bvl Bevel
Hdr Header, HeaderControl
Med MediaPlayer

Dbs Database
Tbl Table
Qry Query
Stp StoredProc
Ses Session
Sql UpdateSQL
Src DataSource
Bat BatchMove
Rpt Report
Nav DBNavigator

Dlg Dialog Boxes (e.g. OpenDialog)
Tmr Timer
Ole OleContainer
Dde DDE Controls (e.g. DdeClientConv)
Vbx VBX Controls
Ocx OCX Controls
Gge Guage
Spn SpinButton, UpDown
Cal Calendar

窗体:frm

注:有时文本编辑框缩写为txt,此为个人MFC、Qt编程之习惯。