Delphi 学习笔记 (基础篇)

dephi程序组成

改变delphi程序的logo方法:

project->option->application

单元文件

标志性语句–unit

接口部分–interfaceimplementation直接的部分

implementation之后是实现部分

项目文件

  • 标志性语句–program
  • 说明体部分–usesbegin之间的部分,不包括begin语句
  • 程序体部分–beginend之间的部分

dephi的赋值号位 :=

布尔类型–布尔型是描述True和False数据的类型

保留字: 类似于标准标识符,也是系统预先规定好的、具有特定意义的单词 不同点;保留字一定不能重新定义或作为其他用途

函数:

StrToInt() 把字符串变成数字

定义方法

定义一个符号常量:

1
2
3
4
5
const
常量名1 =常量值1
常量名2 =常量值2
…………………………
变量名通常要大写

定义一个类型常量:

1
2
3
const
常量名1:类型名1 = 常量值1
常量名2:类型名2 = 常量值2

变量声明:

变量声明的位置决定了变量的适用范围

声明格式:

1
2
3
var
变量名1:类型名1
变量名2:类型名2

运算符与表达式

  • /”除法运算符,计算结果为实型数据

  • div”整除运算,所得值为整数 ,只能对两个整数进行除法运算

  • mod”取余(只能对两个整数进行除法运算)

赋值语句:

1
2
【格式一】变量名:=表达式;
【格式二】对象.属性名:=表达式;

数学函数

取绝对值

1
2
Abs(x):Int64;
返回x的值

取整函数

1
2
3
4
5
6
1.Trunc(x):Int64;
返回实行整数的整数部分,类型为int64
2.Round(x):Int64;
四舍五入
3.Int(x);Extended;
返回x整数部分,类型为Extend

取小数函数

1
2
Frac(x):Extended;
返回X的小数部分

平方函数

1
2
Sqr(x):Extended
x为实型数据,返回平方值

平方根函数

1
2
3
4
5
6
7
8
9
10
11
12
sqrt(x):Extended;
返回非负实数的算术平方根
```
### 三角函数 ###
```dpr
sin(x):Extended;
以弧度为单位的X的正xuan值
cos(x):Extended;
ArcTan(x):Extended; =cot()
返回x的反正切函数值

指数函数

1
2
Exp(x):Real;
返回值为e的x次,x为实型数据

自然对数函数

1
2
Ln(x):Real;
返回x的自然对数值,参数X为正实数

随机数函数

1
2
3
Random(x);
返回一个大于等于0小于整数X的随机整数
当X缺省是会返回一个大于等于x的实数

大小写转换函数

[调用格式1]:

1
LowerCase(const s:String): String;

[功能]:把字符串s 中的字符全部转换为小写字母,并作为函数值返回。

例如:

1
2
3
x1:= LowerCase(‘aBc’); // x1 的值为abc
x2:= LowerCase(‘FISHc’); // x2的值为fishc

[调用格式2]:

1
UpperCase(const s:String): String;

[功能]:把字符串s 中的字符全部转换为大写字母,并作为函数值返回。

例如:

1
2
3
x1:= LowerCase(‘bCb’); // x1 的值为BCB
x2:= LowerCase(‘FISHc’); // x2的值为FISHC

比较字符串大小函数

[调用格式1]:

1
CompareStr(const s1,s2:String): Integer;

[功能]:比较两个字符串s1和s2的大小。

[说明]:大小比较的依据是ASCII 码值。根据字符的ASCII 码值,从两字符串的第一个字符开始比较,若前者大于后者,比较终止,返回值大于0;

若小于后者,比较也终止,返回值小于0;若等于后者,将接着继续比较后面的字符。直到遇到不相等的字符或s1或s2的所有字符均比较完毕。若所有位置上的字符都相等,则返回值等于0。

[调用格式2]:

1
CompareText(const s1, s2:String): Integer;

[功能]:比较字符串大小。

[说明]:比较方法同上,区别是本函数不区分大小写。

[例如]:

1
2
3
x1:= CompareStr('Abc','abc'); //x1 的值为-32
x2:= CompareText('Abc','abc'); //x2 的值为0

求字符串长度函数

[调用格式]:

[功能]:返回字符串的长度。

[说明]:参数s 的类型为字符串型。

[例如]:x:= Length(‘Fishc'); //x的值为5

查找位置函数

[调用格式]:Pos(s1, s2): Integer;

[功能]:返回子字符串s1在字符串s2中首次出现的位置,若s2中不存在s1,则返回0。

[说明]:若s1s2中,则必须满足s1的所有字符都在s2中,即s1s2的子串。

[例如]:x:= Pos('bc', 'abcd'); //x1 的值为2

合并字符串过程

[调用格式]:

1
AppendStr(var s1; Const s2);

[功能]:相当于执行语句“s1:= s1+s2;”。

[说明]:本过程比语句“s1:= s1+s2;”执行效率高。

截取子字符串函数

调用格式]: Copy(str, m, n): String;

[功能]:在字符串str 中截取从第 m个字符开始长度为n 的子字符串,并作为函数的返回值。

[说明]:若m大于s 的长度,则返回一个空串;若从第m 个字符到s 的结尾不足n 个字符,则返回其间的所有字符。

[例如]:

1
2
3
4
5
6
7
s1:= Copy( ‘IloveFishc!', 6, 5 ); // s1 的值为‘Fishc'
s2:= Copy( ‘小甲鱼爱美眉!’, 4, 5 ); // s2 的值?
s3:= Copy( ‘IloveFishc!’, 1, 1 );
s4:= Copy( ‘IloveFishc!’, 0, 1);

注意:s3 和 s4 其实是一样的!

删除子字符串过程

[调用格式]:Delete( str, m, n );

[功能]:在字符串str 中删除从第m个字符开始长度为n的子字符串。

[说明]:
如果m大于str 的长度,则不删除任何字符;

如果从第m个字符开始到str 的末尾不足n个字符,则删除其间的所有字符;

如果n小于等于0,则不删除任何字符。

插入子字符串过程

[调用格式]:Insert( str1, str, k );

[功能]:将字符串str1插入到字符串str 中的第k个字符处。

数值和字符串相互转换函数

[调用格式1]:

IntToStr( m ): String;

[功能]:将整型数据m转换成字符串并作为函数的返回值。

[调用格式2]:

StrToInt( s ): Integer;

[功能]:将字符串数据s转换成整型数据并作为函数的函数值。

[说明]:s 为数字型字符串。

[调用格式3]:

FloatToStr( f ): String; [功能]:将实型数据f转换成字符串,并为函数的返回值。

[调用格式4]:

StrToFloat( s ): Extended; [功能]:将字符串型数据s 转换成实型数据,并作为函数的返回值。

[说明]:s 为数字型字符串。

关系运算符

  • <> 不等于
  • <= 包含于
  • >=包含
  • in 属于

运算顺序从左到右……括号优先

对大小写区别

逻辑运算符和逻辑表达式

Not And Or Xor(双目运算,当两个表达式值不同结果时True,否则为False)
优先级:Not为第一级(单目),And为第二级,Orxor为第三级

IF语句

格式1: If (条件) Then 语句1;

格式2: If (条件) Then 语句1 Else 语句2;

设置窗口光标API函数

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
LONG SetWindowLong(
HWND hWnd, // handle to window
int nIndex, // offset of value to set
LONG dwNewLong // new value
);
LONG GetWindowLong(
HWND hWnd, // handle to window
int nIndex // offset of value to retrieve
);
SetWindowLong( Edit1.Handle , GWL_STYLE, GetWindowLong //设置Edit文件显示位置(ES_RIGHT =居右)
( Edit1.Handle ,GWL_STYLE) or ES_RIGHT); //设置Edit文件显示位置(ES_LEFT =居左 ES_CENTER =居中)
Edit1.Refresh ; //经上面设置后要更新下Edit设置 Refresh =更新Edit设置
Edit1.ReadOnly := True; //把Edit设置为只读,让键盘不能输入,避免输入数字外的字符
BOOL SetWindowPos( HWND hWnd, // handle to window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position int cx, // width
int cy, // height
UINT uFlags // window-positioning options
);
SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE+SWP_NOMOVE);
将进程置顶……

多分支case语句

格式:

1
2
3
4
5
6
7
Case (表达式) of
1:语句1
2:语句2
Else
语句3
end;

注意:表达式必须是整型,字符型,布尔型,子界型和枚举型

写复合语句时可以用begin end;来充当{}

循环结构

while语句

格式 while (循环语句) do 循环体;

break语句,continue语句 用法同C语言

强制退出语句

Repeat语句

格式

1
2
Repeat 循环体;
Until(循环条件);

For语句

1
2
For 循环变量 :=初值 To (DownTo) 终值 Do //To表示递增,Down表示递减
循环体;

数组类型

1
2
Type
数组名 = Array[下标类型] of 基类性

for example:

1
2
3
number =Array[1..10] of Integer;
var
Number_One:number;

更简单的方法:

1
2
var
Number_One:Array[1..10] of Integer;

有多少个 Array of 就有多少维数

SetLength来设置动态数组大小

SetLength(数组名,大小……)

trim() 作用

去掉整个字符前后的空格,通常用来检查字符

冒泡排序的经验

  1. 动态数组必须设置其大小!!!!
  2. 字符串可以按照数组方式进行索引单个字符(字符从一开始索引)
  3. 空格的ASCII码是#32,而且在判断一个字符是否为空格时,必须使用ASCII码

ctrl+alt+L查看本地变量

delphi 过程与函数

用户自定义过程
定义格式:

1
2
3
4
5
6
procedure 过程名 ([形参列表]) //参数可选
var
//声明常量、变量或另一个过程或函数等
begin
语句;
end;
  • 形式参数列表中如果有多个参数,则用分号分隔, 而函数或过程调用中,实参用逗号分隔
  • 还要在Type下‘注册’
  • 形参前不加任何标识符表示值传递
  • 在形参前加var表示地址传递,会改变原函数中所传值的值 在改变时,定义说明部分和函数部分都得改
  • 若在形参前加const时,函数部分不能改变所传参数的值,一旦改变 立刻报错!

用户自定义函数(functiion不需要注册
##
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
定义格式
```dpr
Function 函数名(形参表) :返回值类型
局部声明
begin
语句;
end;
```
- 返回值可以通过给函数名赋值或给预定义
的隐含变量Result赋值来实现
- 函数调用格式 =》变量 :=函数(参数表)
`actionlist` 添加动作,改变`Action` (很方便的,相同代码只需要显示一次)
每个窗口都能定制属于自己的右键菜单(popumenu)
各种事件及常用属性查询地点:[http://fishc.com/a/shipin/Delphishipinjiaocheng/Delphi7/2011/1020/1088_2.html](http://fishc.com/a/shipin/Delphishipinjiaocheng/Delphi7/2011/1020/1088_2.html)
label的transpent属性可以使其背景透明
## TabControl 组件 ##
是一个容器,它本身可以包容其他的组件。
## Button ##
bitbutton的kind属性…………自己看
BitBtn、SpeedButton 的几个属性:Layout、Margin、Spacing:图片与边框的距离 图片与文字之间的距离
RadioButton 或 CheckBox(可被多选)
共有的 Checked 属性
CheckBox 的 State属性( cbUnChecked 未选中、cbChecked 选中或 cbGrayed 变灰选中)
## MaskEdit组件 ##
对话框左上角的【Input Mask】文本框用于输入掩码格式。掩
码格式可以分为3 个部分,每个部分之间用分号“;”分开。
如“`!99/99/00;1;_`”,下面我们将解释各输入格式符的意义。
- 【第一部分】输入格式的第一部分是掩码本身,也就是数据输入格式。在这一部分用一些特殊的格式符来表示应输入的字符类型及格式。
- 【第二部分】在输入格式中的第二部分只有 0 和 1 两种选择。如为 1,则掩码中非用户输入数据和标准分隔符等其他各种字符会作为数据的一部分保存;为 0 则不保存。
- 【第三部分】用于表示数据中的空位用哪个字符代替显示。
至于第一部分嘛,各种格式控制符请自觉查表哦!!
## Memo组件 ##
- Lines 表示一个字符串数组
- Modified 确定文本是否被改动
- ScrollBars 决定MEMO是否有滚动条
- WordWrap  设置该组件是否可以换行
- WantReturns  设置该组件编辑时是否可以回车换行
- WantTabs  设置该组件编辑时是否能使用TAB键
### 关于 Lines 属性的使用 ###
```dpr
Memo.Lines.Add('增加一个新行。');
    // 在Memo 最后一行添加一个新行的文本
Memo.Lines.Delete(5);
    // 删除第六行
Memo.Lines.Insert(3,'');
    // 在第四行插入一个新行的文本
Memo.Lines.Move(2,4);
    // 将第三行移至第五行
Memo.Lines.Clear;
    // 清除文本框中的所有内容
Count
    // 计算字节数
LoadFromFile(‘test.txt’)
    // 从指定文件加载文本
SaveToFile(‘test2.txt’)
    // 将文本保存到指定的文件中
```
## RichEdit组件 ##
RichEdit 组件和Memo 组件非常相似,但是RichEdit 组件
功能更强大,能够对文字进行格式化,如设置字体、颜色等,
可以插入OLE 文档,支持鼠标拖放,还可以对文本进行搜索和打印
但其保存的文档格式为RTF格式
memo.SelText 可表示选中的字符: `undo` `copy` `cut` `paste` `clearsel` `selectall`
```dpr
with 组件名 do
begin
属性1;
属性2;
end;
```
## ListBox(列表框)组件 ##
Items 该属性指出在列表框中的显示的所有列表项(以0为始)
```dpr
with ListBox.Item do
Clear
Add
Delete
Insert(插入)
```
- Multiselect 该属性决定是否可以多选
- ItemIndex 该属性指出列表框中被选中的那个项目的索引号
- Selected 该属性用于检测在列表框中特定的项目是否被选中
- Stored 还属性决定是否为用户自动按字母进行排序
## ComboBox组件 ##
- ItemIndex 该属性指定组合框中被选择的项目
- DropDownCount 该属性控制下拉组合框时弹出的项目条数
- Style 组合框类型
- csDropDown(可以输入,也可以选择)
- csSimple(只能输入)
- csDropDownList(只能选择)
## 滑块型组件 ##
- Scrollbar组件
- TracBar组件
AlphaBlendValue 设置窗口的透明度~~~~~

Panel组件

  • Align 用于设置面板组件在窗体中放置的位置
  • BevelInner 用于设置面板的内部斜面样式(bvNone,bvLowered,bvRiased)
  • BevelWidth 面板斜面宽度
  • BevelOuter 用于设置斜面形式
  • BorderStyle 面板边框样式
  • BorderWidth 面板的边框宽度
  • Enabled 设置面板中的所有子组件是否被允许使用
  • ControlCount 返回面板子组件的数目

GroupBox组件 RadioGroup组件 ScollBox组件

工具栏组件和状态栏组件

ToolBar 组件

相当于panel组件和speedbutton组件的合体

添加新按钮和空格是可以点击鼠标右键哦

添加图片需要使用imagelist进行添加,按钮图标~~imageindex

状态栏

StatusBar 主要作用是说明当前应用程序的一些状态

用户自定义类型

有序数据类型常用函数

函数 参数 返回值
Dec 有序数据类型变量 变量-1后的值
Inc 有序数据类型变量 变量+1后的值
Pred 有序表达式 表达式前驱的值(有序数据嘛 )
Suce 有序表达式 表达式后继的值
Ord 有序表达式 有序表达式的值
Odd 有序表达式 判断是否为奇数
Low 有序类型标识符或有序类型变量 该类型最小值
High 有序类型标识符或有序类型变量 该类型最大值

枚举类型的定义和使用

【定义格式】

1
2
3
Type
类型标识符 = (标识符1,标识符2,……,标识符n);
第一个元素对应序数为0

case语句

1
2
3
4
case 条件 of
条件值:语句;
………………
end;//必须的

子界类型

【定义格式】

1
2
type
类型标识符 = 常量1..常量2;

常量1为下界 常量2为上界
两种声明变量的方法

1.

1
2
3
4
Type
Num = 1..10;
var
n1,n2:Num;

2.

1
2
var
n1,n2:1..10;

集合类型的定义和使用

【格式】

1
2
Type
类型标识符 = Set of 基类型;

for example:

1
2
3
4
5
Type
Colors = (Red,Blue,Green,Yellow);
Color = Set of Colors;
Char1 = set of 'a'..'z';

集合类型的元素个数不能超过256,即一个字节数 序数值也必须在0~255之内

集合表示形式为:如 [‘a’,‘q’,‘w’] 即为Char1的一个值

  • [A][B] 表示集合A和集合B相交,记作 AB
  • [A]+[B] 表示集合A和集合B相并, 记作 A+B
  • [A]-[B] 表示集合A和集合B相减,记作A-B,求属于A但不属于B的组成集合
  • 集合的各种关系运算,等于=,不等于<>,包含>=,被包含<=,运算及数据与集合之间的运算: 属于 In

记录类型的定义和使用

【定义格式】

1
2
3
4
5
6
7
Type
记录类型标识符 = Record
字段1:类型1;
字段2:类型2;
………………
字段n:类型n;
end;

访问记录变量的字段:

  1. 【限定访问记录字段】 记录变量名.字段名
  2. 【使用With语句访问记录字段】
1
2
3
4
5
6
7
with 记录变量名 do
begin
name:'小甲鱼';
rdate:20111224;
Sex:‘m’;
hobby:Programming;
ends

delphi 文件系统

文件->内存
内存<-文件

对文件操作必须的两个步骤 open & close

磁盘文件打开后,将会产生一个文件指针,它指向下一次要读写数据的位置 ,即文件指针 文件指针有自动移动的功能

delphi7中有两种文件类型 :
TextFile(文本文件) & File(二进制文件)

文本文件变量的定义

1
2
var
文本文件变量名:TextFile;

文本文件的打开

  • 把文件变量与实际的文本文件关联起来
  • 打开相应的文本文件 关联文本文件变量与文本文件
  • 可通过AssignFile过程来关联文件变量与实际的磁盘文件

【格式】

1
procedure AssignFile(var F;FileName:String);

打开文本文件

方式

  1. Reset 以只读方式打开 procedure Reset(var F [:File;RecSize:Word]);[]中用来定义无类型文件的尺寸大小
  2. Rewrite 以只写的方式创建与打开 procedure Rewrite(var F [:File;RecSize:Word]);
  3. Append 以添加方式打开(文件指针指向文件末尾) procedure Appen(var F:Text);

文件关闭过程

1
procedure CloseFile(var F);

【成对出现】

1
2
3
AssignFile(FishcFile,'Fishc.txt');
……
CloseFile(FishcFile);

写操作

  • Write 只是把指定数据写到文本文件中去
  • Writeln 不仅……,而且还要在写入的数据后加上换行符

Write过程的格式和功能:

1
procedure Write([var F:Text]P1[,P2,Pn]);

功能:向文件型变量F关联的文件中写入P1,P2,……,Pn等值的表达式
在p1后加冒号添加数字可为其设置域宽

小数位的指定方法是在域宽数字后加“:””在加上表示小数点位数的整数

文本文件的读操作

  • Read读取数据(用空格隔开:Integer)
  • Readln读取后自动插入一个回车符,直接读取下一行内容

行尾与文件尾的判断

可通过EolnEof函数来实现

【Eoln】

1
function Eoln[(var F:Text)]:Boolean;

用于判断与文件型变量F相关联的文件的文件指针是否处于行尾,如果处于行尾, 则返回值为True,否则返回值为False

【Eof】

1
function Eof[(var F:Text)]:Boolean;

用于判断与文件型变量F相关联的文件的文件指针是否处于文件尾(最后一个字符的后面) 如果文件为空,Eof函数的返回值也是True

记录型文件变量的定义

Step1

定义记录类型

1
2
3
4
5
6
Type
Fishcoil = Record
name:String[];//需要加上长度,不可是未知
radata:Integer;
sex:char;
end;

Step2

定义记录文件类型变量

1
2
3
var
记录文件类型变量名:记录文件类型;
VFFishcOil:File of FishcOil

注意:不能用Append过程来打开一个记录型文件,它仅限于文本文件

GetDir(0,String);//返回本程序所在的路经

FileExists(文件路径名);//用来测试该文件是否存在

记录文件的记录数

  • 记录文件的记录是顺序排列的每条都有一个编号,记录编号从0开始
  • 如果想知道文件中有多少记录,可调用FileSize(),该函数用来返回记录数
1
function FileSize(var F):Integer;

移动与检测记录文件的文件指针

记录的随机存取是通过Seek过程和FilePos函数来实现的

Seek过程作用:
是把文件指针移动到文件中的指定位置记录

FilePos函数:
是返回文件指针当前所指的记录的记录号

【Seek】

1
2
procedure Seek(var F;N:Longint);
记录型文件变量F关联的文件的文件指针移到编号为N的记录处

【FilePos】

1
2
function FilePos(var F):Longint;
返回与记录型文件变量F关联的文件的文件指针所处的位置

读取并修改记录

  1. 定位
  2. 读取

example:

1
2
3
Seek(VFFishcOil,4);
Read(VFFishcOil,v1);//要读取与VFFishcOil文件型变量相关联的文件的
第五条记录

treeview

ListView组件

多窗口程序设计

  • SDI 单文档窗口应用程序
  • MDI 多文档应用程序

abort;//忽略

MDI

建立步骤 ### 设置父窗口 ### 将Form1的属性中FormStyle改作fsMDIForm

设置子窗口

将Form2的FormStyle设置为fsMDIchild

创建应用程序菜单和菜单融合

  • 一般如果子窗口和父窗口都有菜单,则程序运行时 当子窗口获得焦点时,子窗口的菜单项将与父窗口菜单融合
  • 为进行菜单融合,需要设置窗体的Menu属性和菜单项的GroupIndex属性
  • 菜单的融合只针对活动菜单进行,若窗体有多个菜单组件,运行时可以通过代码选择当 前使用的菜单组件:Form1.Menu:=菜单组件名
  • GroupIndex属性决定出现在菜单条中各菜单项的位置。 在菜单融合中,GroupIndex属性将决定子菜单是插入还是替换主窗口 菜单条中的菜单

GroupIndex的值及其意义:

  • 默认值为0
  • 数值越小,菜单的位置越靠左。
  • 若需要替换主菜单中的某一菜单项,则将子菜单相应的菜单项的GroupIndex 的值设为与之相等的值
  • 将同一窗体的多个菜单项的GroupIndex设为相同的值,原有的排列顺序在菜单 融合时将保持不变
  • 若要在菜单融合时插入菜单项,则需要在主菜单中预留GroupIndex的数值位置

运行时子窗口的创建和关闭

  • 通常在设计时要创建子窗口的末班,在程序执行时通过子窗体的Creat方法来创建子窗体
  • 要关闭子窗体,可使子窗体的Close方法,此时将产生子窗体的FormClose 事件,在改事件中给Action参数赋值caFree,如:
1
2
3
4
procedure TForm1.FormClose(Sender:Tohject;var Action:TcloseAction);
begin
actiion := cafree;
end;

Action

  • caNone 窗口不允许关闭,因此什么都没发生
  • caHide 窗口隐藏,并没有被关闭
  • caMinimize 窗口被最小化,而不是关闭
  • cafree ……

与MDI应用程序有关的一些属性和方法

  • Mdichildcount 属性:用来记录当前共有多少个MDI子窗体
  • Mdichildren 数组属性:该属性用来引用MDI子窗体,它的每一个元素对应一个子窗体如关闭所有子窗体方法:
1
2
for i:=mdichildcount-1 downto 0 do
mdichildren[i].close;
  • Tile方法:该方法的作用是以平铺的方式排列所有的子窗体
  • Cascade方法:该方法的作用是以层叠的方式排列所有子窗体

DLL篇

  1. 完成一般功能的DLL
  2. 用于数据交换的DLL
  3. 用于窗体重用的DLL

在DLL中,如果导出过程或函数的参数为字符串或动态数组,或者函数的返回值为字符串或动态数组,则在uses语句中应该包含ShareMem单元,要将ShareMem单元放在最前面
ShareMem是共享的内存管理器Borlandmm.dll的接口单元,Borlandmm.dll必须一起发布

另外一种解决办法就是利用PChar或ShortString类型来传递字符串信息,可以不用在uses语句中包含ShareMem单元

建立过程和函数

注意:定义函数时使用“stdcall”是一种调用约定,如果程序员希望自己的DLL库函数能够 被其他程序设计语言的程序调用,应使用stdcall调用约定

DLL的过程和函数想要在外部被使用,要用exports语句声明供其他应用程序调用的函数和过程

可以利用标准指示name Index resident以方便和加速过程、函数的调用

name

name后面接一个字符串变量,作为该过程或函数的输出名,如

1
2
exports
InStr name 'MyInstr';

其他应用程序将用新名字调用该函数或过程,不可用原来的名字了

Index

Index指示为过程或函数分配一个顺序

resident

使用resident,则当DLLS装入时特定的输出信息始终保存在内存中

这样当其他应用程序调用该过程时,,可以此利用名字扫描DLL入口以降低时间开销

1
2
exports
inStr name 'MyInStr' resident

注意:

  1. exports语句可以出现在程序的声明部分,也可以出现在单元文件的interface或implementation中的任意位置,出现次数也没有限制
  2. 当要输出重载的函数或过程时,必须要在exports语句中起别名和指明参数列表,例如:
1
2
exports
Max(x,y,z:Real) name 'maxreal';

热评文章