第一篇:delphi 日常语法总结
Delphi总结
目录
Delphi总结.......................................................................................................................................1
1:控件只能输入数字................................................................................................................1 2:下拉框赋值............................................................................................................................1 3:初始化Cell.............................................................................................................................2 4:注册Cell.................................................................................................................................2 5:华表居中 华表增加,删除某一行......................................................................................2 6:设置增删改查按钮状态........................................................................................................2 7:主键获取方法........................................................................................................................3 8:获取多条,返回容器............................................................................................................3 9:保存
修改
删除
方法....................................................................................................4 10:遍历下拉框的值..................................................................................................................5 11: TDBGridEh增加,修改后定位到某个..............................................................................5 12::json封装,解析.................................................................................................................5 12:导出Excel文件(TsaveDialog控件).....................................................................................7 13:判断奇偶数分别插入不同位置..........................................................................................7
14:从一个目录复制文件到另一个目录,删除文件......................................................8
15:从下拉框多个值获取ID.....................................................................................................8
16:Delphi 格式化日期.....................................................................................................8 17:华表某一列求和..........................................................................................................8
1:控件只能输入数字
if not(key in ['0'..'9', #8])then key := #0;2:下拉框赋值
procedure TSickDistrtionsFrm.SetDoct();var
obj: TDoctInfoClass;
DoctInfo: THis_DoctInfo;
idx: Integer;begin
inherited;
obj := TDoctInfoClass.Create;
obj.GetAllDoctDB();
for idx := 0 to obj.iteminfo.Count1, cl1.Rows1, cl1.Rows1 do
begin
DoctInfo := THis_DoctInfo(cbbzgys.Items.Objects[idx]);
if DoctInfo.sDoct_ID + '.' + DoctInfo.sDoct_Name = BedDistrtion.sDirectorDoct then
begin
cbbzgys.ItemIndex := idx;
end;
end;11: TDBGridEh增加,修改后定位到某个
adors.Locate('sMlbm', CatalogueInfo.sMlbm, [loCaseInsensitive]);
12::json封装,解析
Var
jo, jo1, jt, jfields: ISuperObject;//封装明细
jo := SO();jt := SA([]);for idw := 0 to TJXMBInfo.iteminfo.Count1 do
begin
TJXMBInfo := TB_TJXMBInfo.Create;
TJXMBInfo.sbz := tt.O[i].s['sbz'];
TJXMBInfo.sxmmc := tt.O[i].S['mc'];
TJXMBInfo.sxmbh := tt.O[i].S['bh'];
TJXMBInfo.sKebh := tt.O[i].S['sKebh'];//
TJXMBInfo.sxmmx:= tt.O[i].S['sxmmx'];
TJXMBInfo.nxmjg := tt.O[i].d['XMJG'];
iteminfo.Add(TJXMBInfo);
end;
end
else
begin
TJXMBInfo := TB_TJXMBInfo.Create;
TJXMBInfo.sbz := jo.O['list'].s['sbz'];
TJXMBInfo.sxmmc := jo.O['list'].S['mc'];
TJXMBInfo.sxmbh := jo.O['list'].S['bh'];//
TJXMBInfo.sxmmx := jo.O['list'].S['sxmmx'];
TJXMBInfo.sKebh := jo.O['list'].S['sKebh'];
TJXMBInfo.nxmjg := jo.O['list'].d['XMJG'];
iteminfo.Add(TJXMBInfo);
end;
end;end;12:导出Excel文件(TsaveDialog控件)
{导出Excel }
if SaveDialog1.Execute then
begin
{命令执行}
{获取文件名}
Cell1.DoExportExcelFile(SaveDialog1.FileName);
end;13:判断奇偶数分别插入不同位置
for idx := 0 to PhyData.iteminfo.Count-1 do
begin
TJXMBjson := TB_TJXMBInfo(PhyData.iteminfo.Items[idx]);
if idx mod 2 = 0 then
//偶数
begin
row1 := row1 + 1;
cl1.DoSetCellData(0, row1, '□' + TJXMBjson.sxmmc);
cl1.DoSetCellTextStyle(0, row1, 1);
cl1.DoSetRowHeight(row1, cl1.DoGetRowBestHeight(row1)+ 15);
end
else if idx mod 2 = 1 then
//奇数
判断列增加
begin
cl1.DoSetCellData(2, row1, '□' + TJXMBjson.sxmmc);
cl1.DoSetCellTextStyle(2, row1, 1);
cl1.DoSetRowHeight(row1, cl1.DoGetRowBestHeight(row1)+ 15);
end;
for idxC := 0 to 4 do
begin
cl1.DoSetCellAlignment(idxC, row1, 32);//居中显示
end;
end;,14:从一个目录复制文件到另一个目录,删除文件
CopyFile(PChar('D:A***920001X.xml'), PChar('D:B***920001X.xml'), false);
DeleteFile('D:B***920001X.xml');
15:从下拉框多个值获取ID aInfo.sOpid :=THis_UserInfo(cbbczy.Items.Objects[cbbczy.ItemIndex]).sUser_ID;
16:Delphi 格式化日期
formatdatetime('yyyy-mm-dd',now);17:华表某一列求和
cl1.DoSetFormula(1, fpirow, 'sum(B' + IntToStr(3)+ ':B' + IntToStr(fpirow)+ ')');
第二篇:delphi复习资料
题型:
填空题20×1 简答题5×6 程序填空题11×2 编程题2×14 资料整理的不是完全完整,结合这些重点可以在书上再仔细复习。希望好好复习,大家都能通过!
第一章Delphi简介
1.1delphi概念 Delphi的主要特点: Borland公司的Pascal编译器 Delphi以object Pascal为编程语言 Delphi充分发挥了windows的强大功能 Delphi提供了丰富的32位可视组件库
Delphi在数据库和网络处理功能方面是同类产品中最强的
1.2delphi7集成开发环境
主窗口:包括菜单栏,工具栏及组件栏; 对象游览器:包括属性页和事件页; 对象树性列表; 窗体设计器; 代码编辑器;
1.3delphi程序的基本结构
扩展名为dpr的是项目文件;扩展名为pas的单元文件;扩展名为dfm的是窗体文件
单元文件的格式如下:
单元头:该单元指定单元的名称
接口部分:该部分从保留字interfact开始,到保留字implementation之前结束。接口部分可以有uses语句,还可以用来声明常量,数据类型,变量,过程和函数等。其中uses语句必须紧跟在保留字interfact之后。在整个程序中都可以被访问
实现部分:这些声明可以在本单元中被访问,不可以在其他单元中被访问,类的方法必须在实现部分实现
初始化部分:从保留字implementation开始,到保留字finalization之前结束。一个单元中可以没有该部分。
结束部分:一个单元中只有出现了初始化部分,才可以有结束部分
第二章Object Pascal语言基础 2.1词法符号 保留字
标识符:1标识符由字母,数字或下划线组成 2标示符的第一个字符必须是字母或下划线 3标识符的长度不应超过255个字符 4不能将保留字用作标识符 5标识符不区分大,小写
标准标识符是可以重新定义的,而保留字却不允许重新定义
因system单元是自动应用的,不必也不允许在引用部分列出system单元 Absolute指令字用于指示相同类型的另一标识符存放在同一段内存区域中 2.2常量和变量
布尔常量是指false和true这两个值 用#引导一个整数,整数表示该字符的ASCII码 用‘’‘’表示单引号字符 2.3简单数据类型
数据类型分为简单数据类型,字符串类型,结构类型,指针类型,过程与函数类型和可变类型等是一种常见的分类方法
有序数据类型特点:
1、数据的分布是离散的;
2、除了第一个元素外,其他任何元素都有一个前驱元素;
3、除了最后一个元素外,其他任何元素都有一个后继元素
关系运算符号:=,<>,>≡,>,<≡,< 整型数的逻辑运算符:not,and,or,xor 左,右移位运算符:shl,shr 基本字型有ansichar和widechar Pascal语言提供的自变量为实型的标准函数由: 1绝对值函数abs(x):函数值为x的绝对值 2平方函数sqr(x):函数值为x的平方
3正弦函数sin(X):函数值为x的正弦,其中x的单位为弧度 4余弦函数cos(x):函数值为x的余弦,其中x的单位为弧度 5反正切函数arctan(x):函数值为x的正反切,函数值的单位为弧度 6指数函数exp(x):函数值为指数e 的x次方 7对数函数in(x):函数值为x的自然对数 8平方根函数sqrt(x):函数值为x的平方根
9舍入函数round(x):对实数x作四舍五入,结果为整数 10截尾取整函数trunc(x):截去实数x的小数部分,结果为整数 object pascal提供了丰富的日期时间处理函数,常用的有: 1date0:函数返回系统当前日期,无参数,返回数据是tdate time型 2time0:函数返回系统当前时间,无参数,返回数据是tdate time型 3now0:函数返回系统当前日期和时间,无参数,返回数据是tdate time型 4strtodte(日期字符串):字符串转换为日期时间函数,返回数据是tdate time型
2.4结构类型 结构数据: —集合类型(set)—数组类型(arry)—记录类型(record)—文件类型(file)—类类型(class)
—类引用类型(class reference)—接口类型(interfact)
object pascal中规定了基类型只能是不超过265个有序值的集合,集合元素的叙数值必须介于0~~255之间
集合运算有交(*),并(+),差(—),运算对象是两个相同类型的集合,运算结果也是集合。例如,若有为[1,3,5],y为[3,4,5],则x*y为[3,5],x+y为[1,3,4,5],x-y为[1] 数组的定义:Type arry [indextype。。,indextypen] of basetype ①对于通用字符串类型string,指定其最大长度(0------255)。此时string型被视为shortstring型
②shortstring型不是以null(空字符#0)作为字符串的结果标志,而是将长度保存在字符串数组下标为0的储存单元中 ③ansistring以full结束
记录的定义: Type 记录类型标识符=record 域1:类型1 域2:类型2。。。。域n:类型n 2.6语句流程 语法形式: 输入语言
Read([文件变量]变量列表)
Readln([文本文件变量]变量列表)有回车 省略文本变量参数表示从键盘输入中读取数据 输出语言
Write([文件变量]输出项表)
Writeln([文本文件变量]输出项表)有回车
注释和编译指令 //单行注释内容 {注释内容}(*注释内容*)
Case语句的语法格式: Case选择表达式of 常量1:语句1 常量2:语句2。。。。
常量n-1:语句n-1 [else语句n;] End;
保留字case后的选择表达式,其值必须是有序类型,如整型,字符型,布尔型,枚举型或子界型 P45页程序
While语句的执行过程是:先计算布尔表达式的值,当值为true时,执行循环体中的语句序列,然后重新计算布尔表达式的值,若仍为true则再执行一遍循环体
While语句的特点是先判断条件,当条件为true才执行。当第一次条件为false时,循环次数为0
Repeat语句的执行过程是:先执行repeat到until之间的语句,然后计算布尔表达式的值,若为false,则再执行repeat到until之间的语句,若为true则推出循环体
Break过程,可使程序的执行流程立即退出该层循环 Continue过程将使程序直接转入下一次循环 2.7过程与函数
Procedure过程名(参数表)
Function函数名(参数表):返回数据类型 过程由过程首部、局部声明部分和过程体组成。函数由函数首部、局部声明部分和函数体组成。
参数的传递如下:
1值参数声明时,形参前面无任何修饰
2变量参数声明时 变参传递的是一个变量的地址,即实参把地址传递的是一个变量的地址,即实参把地址传递给变参,变参和实参指向的是同一地址空间。在过程和函数中对变参的修改直接影响实参 3常量参数声明时,形参的前面用保留字const修饰
过程和函数重裁是指定义多个名称相同,而参数列表不同的过程和函数。编译器根据调用时实参表中的参数个数和类型,自动匹配一个重裁的过程或函数。重裁过程或函数使用默认参数可能会导致二义性错误 2.8程序与单元的结构 单元结构: 1单元首部
2接口部分:定义的这些标识符可以被引用该单元的程序访问 3实现部分:在实现部分定义的标志符不能被其他单位或程序访问 4初始部分 5终结部分
2.9标识符的作用域
标识符的作用域是指其在程序中起作用的范围。
单元中接口部分定义的标识符包括数据类型,类,常数,变量,过程和函数导等 他们在引用该单元的程序(项目文件,其他单元)中都可以被访问
第三章 Delphi中的面向对象 3.1面向对象程序设计概述
将具有相同属性和行为的对象抽象为类,每个对象都属于某个类。通过继承关系构成类的层次结构,子类可以直接继承父类的性质和功能。3.2类与对象
类是具有相同或相似属性和行为的一组对象的共同描述,是对相似对象建立的模板。
对象由属性和方法构成。属性是描述对象静态特征的一组数据想:方法描述了该类对象动态特征的一个操作序列,体现对象的行为特征或功能。定义类:type 类名=class 数据成员
成员函数或过程 End;
注意:在函数或过程名前必须带有类名。Procedure Circle.Draw; 声明对象一般形式为:var 对象名:类名; 访问对象成员:对象名.成员
构造函数和析构函数的定义,作用和特点:
构造函数是专用的创建对象和初始化对象的成员函数。定义时用保留字constructor,函数名通常为create。在定义的构造函数中,不仅可以为类对象分配内存空间,而且可以打开文件或数据库读取数据或控制设备复位。析构函数是专用的删除对象和为对象进行善后处理的成员函数。定义时用保留字destructor,函数名通常为Destroy。在析构函数中,不仅可以释放相应的内存资源,还可以保存数据信息,关闭文件或者数据库,控制设备复位并关机。3.3类成员的访问权限
封装是把一组数据和与这组数据有关的操作集合组装在一起,形成一个能动的实体,也就是对象。
访问权限分为:private:私有数据成员、成员函数、过程。不能被类所在单元以外的程序访问,但本单元是可见的。
Protected:保护„„。被该类及该类的所有派生类访问,并成为派生类的私有成员。
Public:共有„„。被该类以外的类访问。
Published:公布„„。在设计期间的对象观察器窗口中可见。
Automated:自动„„。用于响应对象链接与嵌入自动化类型信息的公共接口。3.4继承
继承的实质是在既有类的基础上构造新的类,即新类从一个或者多个已有类中继承数据和方法,同时增加或重新定义数据和方法,由此构造出一个新的类型,称为派生类。已有的类称为基类。继承的主要目的是实现代码的重用。派生类的定义:type 派生类=class(基类){派生类新增或改写部分} End;
派生类的构造和析构函数:在派生类构造函数的开始部分,使用inherited保留字来调用基类的构造函数,首先初始化基类的成员,然后构造派生类的特有成员。在派生类的析构函数的结尾部分,使用inherited保留字来调用基类的析构函数,最后释放基类的成员部分。
构造函数越上层越早被调用,析构函数越下层越早被调用。3.5多态性
多态性是指同一的操作,在不同的对象中具体实现过程不同。Object Pascal 支持两种多态性和运行时的多态性。编译时的多态性通过重载来实现,运行时的多态性用虚方法来实现。
重载函数或者过程用保留字overload来说明。例如:Function max(x:integer):integer;integer; 虚方法的定义如p79 虚方法与动态方法的区别:在运行时才能确定对象方法的调用地址,这种调用方法为动态联编。虚方法与动态方法在功能上是等价的,不同在于虚方法额调用速度比较快,动态方法的代码比较少。
抽象类与抽象方法:使用指令字abstract说明,则该方法称为抽象方法,包含抽象方法的类称为抽象类。定义:procedure 过程名;virtual;abstract;
第四章
4.1 VCL基础
四种基本的组件类型:标准组件,自定义组件,图形组件,非可视组件。图形组件与标准组件的的区别在于:①标准组件可以获得输入焦点,即可用Tab键依次获得焦点;图形组件不能获得输入焦点。②标准组件可以包含其他组件,即可以是其他组件的父类;图形组件不能包含其他组件。③标准组件具有一个WINDOWS句柄,图形组件没有WINDOWS句柄。
4.2窗体设计
窗体组件的属性值设置为 组件名.属性:=属性值。重点看一下caption、visible、hint。
窗体的方法和事件详见P91.4.3常用VCL组件
对于memo组件的编程填空要注意。列表框组件(listbox)的常用属性见P104 4.4菜单设计
对菜单项可以指定其加速键,方法是在菜单项的Caption属性中,在要作为加速键的字母前添加符号“&”,则运行时该字母带有下划线,按下Alt+加速字母键就执行此菜单项。
4.6对话框的使用
Showmessage过程:调用Showmessage过程会弹出一个简单的对话框,对话框上显示提示信息及“确定”按钮,单击该按钮,就关闭对话框。
Inputbox函数:调用Inputbox函数显示一个能够接受哟娜防护输入数据的对话框,并返回用户输入的数据值。
Inputquery函数:与Inputbox函数最大的不同是他的返回值是一个逻辑值。
第五章 5.1程序调试
错误的种类及处理方式:
1、语法错误:没有遵守语言的语法规则而产生。
2、运行错误:程序在执行过程中发生了错误。程序试图打开一个不存在的文件或试图修改一个只读文件,程序运行过程中出现除零错误或用户输入了非法数据等。
3、逻辑错误:运行的结果与设想的结果不同。
解决逻辑错误可以从三步骤来解决:猜测出程序可能出错的地方,并在此设置断点。让程序执行到断点停止运行,观察所有中间变量及对象内容。让程序单步运行,同时观察每一个变量及对象内容的变化。
事件变量和相关数据的值:提示文本,watch list窗口,evaluate 窗口。5.2异常保护和处理
1、异常保护与try„finally„end;语句 Try „ //被保护的代码块 Finally „ //处理语句 End;
2、响应异常和try„except„end;语句 Try //以下为保护代码块 „
If <异常条件> raise<异常对象> Except //以下为异常处理快
On <异常类1> do <处理过程1或语句1> On <异常类2> do <处理过程2或语句2> On „
Else <其他处理过程或语句> End;
通过继承类exception可以自定义新的异常类。
第6章 Delphi7与数据库
6.1数据库简介 数据库可以长期存储、有组织、可共享的数据集合。
数据库系统(database system,DBS)是指具有数据管理功能的计算机系统。它一般由数据库、数据库管理系统和应用系统构成。
数据库系统根据的组织方式主要分为层次数据库系统、网状数据库系统、关系型数据库系统很面向对象数据库系统等几类
Delphi支持关系型数据库,关系型数据库由表组成。标的定义了事物的一组属性数据,称为记录。表的列定义了事物的某种属性,称为字段。6.2 Delphi7的数据库访问机制
Borland推出了一个数据库引擎(borland database engine,BDE)BDE管理器(BDE Administrator)是设置和管理BDE的工具,它可以用来管理BDE中的数据库别名和驱动器。Datebase Desktop的使用:
1、定义数据库别名
2、设置工作目录及私有目录
3、建立数据表结构
4、保存数据表文件
5、建立索引(1)建立主索引(2)建立次索引
6、设置有效性检查
7、设置口令
8、设置参照完整性
9、输入部分数据
数据库游览器可用于定义数据库别名、查询或编辑数据库中的各类信息,如数据库的参数设置、各类据表文件的结构及数据,也可以使用SQL语句进行查询 6.3数据库组件
使用TTable组件连接并显示数据表的一般步骤
1、把一个TTable组件放到窗体上
2、TableName属性指定要访问的表
3、TDataSource组件放到窗体上,设置DataSet属性指向该TTable组件
4、把数据控制组放到窗体上,设置TDataSource属性指向该TDataSource组件
5、把TTable组件的Active属性设为True Tablel.Fields[0].AsString:=Editl Edit.Text Editl.Text= Tablel Fields [0].AsString Editl.Text:= Tablel.FieldByName(‘Name’).AsString 当表结构改变引起字段索引号改变时,就要修改相应的程序,所以使用第二种方法比较好。
DataSet属性:表明于当 前数据源组件相联系的数据集组件对象的名字
Enabled属性:如果Enabled属性值为True(默认值),数据控制组件将显示数据:如果Enabled属性值为False,则所有与此数据源组件相连的数据控制组件都将不显示任何数据。
Columna属性用于指定TDBGrid对象中各栏目的特征 6.4 TField对象的使用
动态字段对象与永久字段对象的概念,区别,使用场合:Delphi会为数据中的每一个字段自动生成一个动态的字段对象。数据集的结构和其他信息改变,当应用程序重新打开这个数据集时,就会基于最近的结构和信息重建所有的字段对象。当数据集关闭时,这些对象也跟着取消。
动态对象的最大特点是适应性强,缺点是要想改变字段的显示属性、数据格式就要编写代码,不能把某些字段暂时隐去,也不能增加新的字段。
永久字段最大的好处是可以在设计时设置它的属性。可以选择部分字段,增加新的字段。再永久字段对象列表中删除某些需要保护的字段,避免用户访问这些字段;在数据库查询或特定数据表的字段基础上定义新的字段,代替现存的字段;改变原有的字段的显示和编辑属性。6.5 数据集的操作 数据集的打开与关闭:
1、设置Active属性 Table.Active:=True;//打开数据集,数据集组件对数据表进行读写操作。Table.Active:=False;//关闭数据集,数据集组件不能对数据表进行读写操作。
2、调用Open和Close方法 Table1.Opene//打开数据集和 Table1.Close//关闭数据集。移动记录指针:
1、Bof属性:如果Bof为True,表明当前记录指针所处的位置为数据集的第一条记录;反之,则不是第一条记录。
2、Eof属性:如果Eof为True,表明当前记录指针所处的位置为数据集的最后一天记录;反之,则不为最后一条记录。
3、First方法:将记录指针移至数据集的第一条记录处,并使之成为当前记录,同时将Bof属性值设置为True。
4、Last方法:将记录指针移至数据集最后一条记录处,并使之成为当前记录,同时将Bof属性设置为True。
5、Next方法:将记录指针后移一条记录,并使之成为当前记录。如果记录指针指向了数据集的最后一条记录,将Eof属性设置为True。
6、Prior方法:将记录指针前移一条记录,并使之成为当前记录。如果记录指针指向了数据集的第一条记录,将Bof属性设置为True。
7、MoveBy方法:将记录指针从当前记录开始向后或向前移动若干条记录。格式如下:function MoveBy(Distance:Integer):Integer;
限制记录集:
1、SetRangeStart方法和SetRangeEnd方法可以过滤记录。SetRangeStart方法用来限制记录集的开始,SetRangeEnd方法用来限制记录集的结束,调用ApplyRange方法使限制生效,调用CancelRange方法取消为数据表设定的限制范围。
2、使用数据集的Filter属性
Filter属性值是一个用来指明数据表过滤标准的字符串,Filter属性决定了过滤器是否起作用。
查找记录:
1、使用FindKey方法。使用Table的FindKey方法或FindNearest方法。
2、搜索特定记录(Locate)。FindKey或FindNearest方法只能在TTable组件中使用,如果使用的是TQuery或TStoreProc组件,就要使用Locate方法来查找记录。Locate函数适合于所有数据集组件,也适合于TTable组件。AppendRecord方法与InsertRecord方法:这里两个方法分别与Append方法与Insert方法相似,都是用于在表中插入一条新纪录,但AppendRecord方法与InsertRecord方法比Append方法与Inser t方法更简单、更方便一些,不需要调用Post方法。过程形式如下:Procedure AppendRecord(Const Values:Array of Const);
Procedure InsertRecord(Const Values:Array of Const);
建立数据表的主从关系:设置表之间的主从关系是通过设置从表的MasterSource属性和MasterField属性来实现的,且从表必须按MasterField属性中指定的字段建立了索引。
6.6TQuery组件
TQuery组件和TTable组件的比较:同属于数据集组件。
不同之处为:TQuery组件主要功能是用来支持SQL语言访问本地或远程数据库;TQuery组件允许用户同时访问多个表,而TTable组件一次只能访问一个表格;TQuery组件访问的是表格中的特定数据内容,而TTable组件只有在提供过滤或限定检索范围时才能访问表格中的特定数据内容,否则访问的将是表格中的全部数据。掌握P193 BDE综合实例。
6.8 ADO技术
通过ADO不仅能够访问基于SQL Server的所有数据库,而且可以通过ODBC访问所有支持ODBC的数据库。
ODBC是一种采用开放式结构进行数据库链接的接口标准,是一种开放的独立于厂商的API应用程序接口。掌握P208 ADO应用实例
第七章 Windows编程基础
7.1动态链接库(DLL)
Windows允许同时运行的多个程序共享一组函数的单一备份,于是引入了动态链接方式,将可共享的程序代码以及各种数据资源编译成单独的模块。
一般项目的格式如下: Program 程序标识符; Uses 单元列表; Begin 程序体; End.DLL项目文件的格式如下: Library 程序标识符号; Uses 单元列表;
Exports 过程和函数标识符列表; Begin 程序体; End.两者的区别的原因在于:Delphi编译器是一句项目文件头的保留字是Program还是Library来决定编译生成的是EXE文件还是DLL文件。若DLL 要输出共其他应用程序调用的函数或过程,则需要在其项目文件的保留字exports之后一一列出,这些DLL函数或过程将被编译成远程地址调用。
Window系统自身包含三个DLL,分别是Kernel,User,GD1。DLL调用必须使用标准方式,其一是静态引用,其二是动态引用。静态引入:
加载引用的DLL文件是,库文件的查找顺序是:
1、当前路径;
2、Windows系统的安装目录;
3、Windows的系统目录system和system32;
4、列在环境变量PATH中的路径。
引入方法:
1、最简单的是名字引入;
2、使用索引引入;
3、若名字引入会引起标识符冲突,可以使用换名引入。
第三篇:Delphi之动态数组使用总结
Delphi之动态数组使用总结
传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数。专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存。
Delphi 4中增加了非常简单的动态数组实现方法,实现过程效仿我前面讲过的动态长字符串。与长字符串一样,动态数组的内存动态分配并且引用记数,不过动态数组不支持 copy-on-write 技术。这不是个大问题,因为你可以把变量值设置为nil释放数组内存。
这样你就可以声明一个不指定元素个数的数组,并用SetLength 过程给数组分配一个特定大小的内存,SetLength 过程还可以改变数组大小而不影响其内容,除此外还有一些字符串过程也可用于数组,如Copy 函数。
以下摘录的代码突出了一点,这就是:定义数组后必须先为它分配内存,然后才能开始使用:
procedure TForm1.Button1Click(Sender: TObject);var Array1: array of Integer;begin Array1 [1] := 100;// error SetLength(Array1, 100);Array1 [99] := 100;// OK...end;如果你只定义一个数组元素个数,那么索引总是从0开始。Pascal 中的普通数组既能用不为零的下标,也能用非整数的下标,但动态数组均不支持这两种下标。象普通数组一样,你可以通过Length、High和Low 函数了解到动态数组的状况,不过对于动态数组,Low 函数返回值总是0,High函数返回数组大小减1,这意味着空的动态数组其函数High返回值是-1,这是一个很怪的值,因为它比Low的返回值还小。
图 8.1: 例 DynArr 窗体
以上作了简短的介绍,现在举个简例,例名DynArr,见图8.1。例子实在是很简单,其实动态数组没有什么特别复杂地方。我想通过该例说明几个程序员可能犯的错误。程序中声明了两个全程数组并在OnCreate 事件中初始化了第一个数组:
var Array1, Array2: array of Integer;procedure TForm1.FormCreate(Sender: TObject);begin // allocate SetLength(Array1, 100);end;这样就把数组所有值设置为0。完成这段代码你马上就能读写数组元素的值,而不用害怕内存出错,当然条件是你没有试图访问超过数组上界的元素。为了更好地初始化,程序中添加了一个按钮,执行数组元素赋值操作: procedure TForm1.btnFillClick(Sender: TObject);var I: Integer;begin for I := Low(Array1)to High(Array1)do
Array1 [I] := I;end;Grow 按钮用于修改数组大小,但并不影响数组内容。单击Grow 按钮后,你可以用Get value按钮进行检验:
procedure TForm1.btnGrowClick(Sender: TObject);begin // grow keeping existing values SetLength(Array1, 200);end;procedure TForm1.btnGetClick(Sender: TObject);begin // extract Caption := IntToStr(Array1 [99]);end;Alias 按钮的OnClick 事件代码稍复杂些,程序通过 := 算子把一个数组拷贝给另一个数组,从而有效地创建了一个别名(一个新变量,但引用内存中同一数组)。从中可见,如果你改变了其中一个数组,那么另一个同样也会改变,因为它们指向同一个内存区:
procedure TForm1.btnAliasClick(Sender: TObject);
begin // alias Array2 := Array1;// change one(both change)Array2 [99] := 1000;// show the other Caption := IntToStr(Array1 [99]);
在btnAliasClick 事件中增加了两部分操作内容。第一部分是数组等同测试,不过并不是测试实际的数组元素,而是测试数组所引用的内存区,检测变量是不是内存中同一数组的两个别名:
procedure TForm1.btnAliasClick(Sender: TObject);begin...if Array1 = Array2 then
Beep;// truncate first array Array1 := Copy(Array2, 0, 10);end;btnAliasClick 事件的第二部分内容是调用Copy 函数。该函数不仅把数据从一个数组移到另一个数组,而且用函数创建的新数组取代第一个数组,结果变量Array1 所引用的是11个元素的数组,因此,按Get value 和Set value 按钮将产生一个内存错误,并且触发一个异常(除非你把范围检查range-checking 选项关掉,这种情况下,错误仍在但屏幕上不会显示异常)。虽然如此,Fill 按钮仍能正常工作,因为需要修改的数组元素由数组当前的下标范围确定。
自从有了动态数组,链表除了在教科书里出现外,已经很少在实际编程中被使用了,事实也是如此,数组的确比传统链表快得多,而且也方便的多。
从 Delphi4起,开始了内建各种类型的动态数组支持。但是,对我们来说动态数组支持似乎做的不够彻底,因为Delphi竟然连删除、插入、移动连续元素的函数都没有提供,让人使用起来总觉得不够爽!!J。作为一名程序员,我们当然要有自己解决问题的能力,下面就让我们简单介绍一下Delphi 下的动态数组。
在Delphi中,数组类型有静态数组(a : array[0..1024] of integer)、动态数组(var a : array of integer)、指针数组(即指向静态数组的指针)和开放数组(仅用于参数传递)。静态数组、指针数组有速度快的好处,动态数组有大小可变的优势,权衡之下就有了折衷的办法,那就是定义的动态数组在必要时转换为指针。
动态数组声明之后,只有下面几个函数可┎僮鳎?o:p>
1.设置数组大小,可以任意缩减或增加数组大小
Procedure SetLength(var S;NewLength : integer);
2.取出连续元素,复制给另一个数组变量
Function Copy(s;Index,Count : integer): array;
3.取得数组大小及上下限
Function Length(s):integer;
Function High(x):integer;
Function Low(x):integer;
值得注意的是,不加const或var修饰的动态数组会被作为形参传递,而动态数组用const修饰并不意味着你不能修改数组里的元素(不信你可以字自己在程序中试试。还有一点是High函数调用了Length 函数,所以我们在获取数组上限时最好直接用 Length(s)函数。
动态数组在内存空间中占用4个字节.动态数组在内存中的分配表如下:
偏移量
内容
32-bit 引用计数
32-bit 数组长度
0..数组长度 *(元素尺寸)4)^;// 变量的长度,偏移量-4
if index >= len then //要删除的位置超出范围,退出
Exit;
MaxDelete := len-index;// 最多删除的数量
Count := Min(Count, MaxDelete);// 取得一个较小值
if Count = 0 then // 不要求删除
Exit;
Dec(len, Count);// 移动到要删除的位置
MoveMemory(PChar(P)+index*elSize , PChar(P)+(index + Count)*elSize ,(len-index)*elSize);//移动内存
Dec(P);//移出 “数组长度”位置
Dec(P);//移出“引用计数” 位置
//重新再分配调整内存,len 新的长度.Sizeof(Longint)* 2 = 2*Dec(P)
ReallocMem(P, len * elSize + Sizeof(Longint)* 2);
Inc(P);// 指向数组长度
P^ := len;// new length
Inc(P);// 指向数组元素,开始的位置
PLongint(A):= P;end;
对上面的例子,我们需要注意的是 elSize 参数,它必须是 SizeOf(DyArray_Name),表示元素所占用的字节数。
相信看了上面的例子后,对于动态数组的拷贝,移动想必也可以自己实现了吧 J
后续:
其实,Delphi 对许多类型的内存分配都很相似,比如 string 类型,其实它和动态数组是很相似的,我们完全可以把它拿来当成动态数组。实质上 string 是 Pchar 的简易版本。不管怎么说,了解一些内存的分配对我们这些开发人员来说还是有一些好处的。
第四篇:Delphi实习报告
实习报 告 书 专 用 纸
实习报 告 书
引言
题
目: Delphi 学
院:
专
业: 地理信息系统 班
级:
姓
名: 学
号:
2013年
6月日
实习报 告 书 专 用 纸
娱乐场所信息查询软件,软件界面设计简洁,美观,其人性化的软件流程,可以让一般人方便的查询娱乐场所,上手极易,不用打开多个窗口可重复查询。系统需求分析
根据用户的需求,对本系统做整体的需求分析,这是保证系统有效性和实用性的前提。
2.1 功能需求分析
在设计本系统之前,作者与相关工作人员进行了交流,并对此进行了归纳提炼,得出建立一个娱乐场所信息查询应具备如下功能:
(1)娱乐场所信息查询。可以对任何一个娱乐场所的详细信息进行查询,其中包括名称、所处路名、ID等。
(2)娱乐场所所在地区的地图显示。(3)最短路径的分析。(4)地图打印。
2.2 数据需求
根据功能需求的要求,需要有一系列的数据来支撑,本系统需要的数据包括所处地区的地图模板、道路信息、娱乐场所信息等 系统设计
为确保系统顺利的实施,本系统遵循软件工程原理和方法,对系统进行总体设计和详细设计;其次,应满足先进性原则,依照国际标准,借鉴主流系统的体系结构,保证系统具有较长的生命力和扩展能力;此外,还应满足成熟性原则、实用性原则、高可靠性原则等。根据需求分析的结果,本着以上原则展开对本系统的设计。
3.1 界面设计
为了界面设计,增强系统的美观性、灵活性,使系统易于操作,采用了很多优秀的
实习报 告 书 专 用 纸
3.1.1 登录界面
该系统需要输入用户名、密码才可运用,具有较好的保护性
3.1.2 关于界面
3.2 技术路线
本系统采用Embarcadero Delphi XE3作为开发工具。Delphi,是Windows平台下著名的快速应用程序开发工具,最早的版本由美国Borland(宝兰)公司于1995年开发。
实习报 告 书 专 用 纸
Delphi是一个集成开发环境(IDE),使用的核心是由传统Pascal语言发展而来的Object Pascal,以图形用户界面为开发环境,通过集成开发环境、VCL工具与编译器,配合连结数据库的功能,构成一个以面向对象程序设计为中心的应用程序开发工具。
“真正的程序员用C,聪明的程序员用Delphi”,这句话是对Delphi最经典、最实在的描述。Delphi最大的特点是简单易学、执行高效而且功能强大。和Microsoft Visual Studio C++ 相比,Delphi更易于掌握,学习周期也比较短,而在功能上却丝毫不逊色;而与Visual Basic相比,Delphi功能更强大、更实用,尤其在开发数据库方面,它的特点更是体现得淋漓尽致。这正是作者选用Delphi作为开发工具的原因。
Delphi发展至今,从Delphi 1到现在的Delphi XE2,不断添加和改进各种特性,功能越来越强大。Delphi 2010内置了Direct 2D模块及开发库,其新加的功能包括:○1○1支持64位Windows操作系统的开发;○2○2称为FireMonkey的新的跨平台框架;○3○3在Windows上开发,用来编译Max OS X的交叉编译器;④FireMonkey支持iOS(Apple iPad及iPhone)的开发;⑤LiveBindings的新的数据绑定功能,允许你将任何可视对象绑定到任何使用表达式的源对象。系统实现
4.1 概述
在完成了需求分析、系统设计和技术路线的选定后,按照前期工作的思路,逐步的实现商品管理系统。本系统以Delphi XE3为开发环境,实现了连云港娱乐场所信息查询功能。
4.2 功能模块实现
4.2.1 登录模块
实习报 告 书 专 用 纸
操作部分核心代码如下所示:
procedure TForm2.Button1Click(Sender: TObject);begin
ClientDataSet1.Close;ClientDataSet1
.CommandText
:='select
*
from
Table01
where name='''+edit1.Text+''' and “PASSWORDs” ='''+edit2.text+'''';ClientDataSet1.Open;if ClientDataSet1.RecordCount=0 then begin ShowMessage('口令错误');end else begin ModalResult:=mrOk;end;end;4.2.2 图层管理
实习报 告 书 专 用 纸
操作部分核心代码如下所示:
procedure TForm1.FormCreate(Sender: TObject);var denglu: TForm2;begin pShpLayer := TGIS_LayerSHP.Create;pShpLayer.path := 'D:delphi连云港.shp';ttkViewer1.Add(pShpLayer);pShpLayer := TGIS_LayerSHP.Create;pShpLayer.path := 'D:delphi道路.shp';ttkViewer1.Add(pShpLayer);pShpLayer := TGIS_LayerSHP.Create;pShpLayer.path := 'D:delphi娱乐.shp';pShpLayer.Params.Labels.Field := '名称';pShpLayer.Params.Labels.color := clred;ttkViewer1.Add(pShpLayer);ttkViewer1.FullExtent;pShpLayer1 := ttkViewer1.items[0] as TGIS_LayerVector;pShpLayer2 := ttkViewer1.items[1] as TGIS_LayerVector;pShpLayer3 := ttkViewer1.items[2] as TGIS_LayerVector;denglu := TForm2.Create(Self);denglu.showmodal;
实习报 告 书 专 用 纸
denglu.Free;end;4.2.3 图层的放大缩小(1)点击缩放
操作部分核心代码如下所示
procedure TForm1.Button2Click(Sender: TObject);begin ttkViewer1.mode := giszoomex;end;
(2)点击暂停缩放
操作部分核心代码如下所示:
procedure TForm1.Button3Click(Sender: TObject);begin ttkViewer1.mode := gisSelect;end;4.2.4点击地图平移
实习报 告 书 专 用 纸
操作部分核心代码如下所示:
procedure TForm1.Button5Click(Sender: TObject);begin ttkViewer1.mode := gisdrag;end;4.2.5点击属性查询
实习报 告 书 专 用 纸
操作部分核心代码如下所示:
procedure TForm1.Button4Click(Sender: TObject);begin ttkViewer1.mode := gisSelect;end;4.2.6路名显示 点击路名显示
操作部分核心代码如下所示:
procedure TForm1.Button8Click(Sender: TObject);begin pShpLayer1.Params.Labels.Visible := false;pShpLayer3.Params.Labels.Field := '名称';pShpLayer2.Params.Labels.Field := '路名';ttkViewer1.FullExtent;end;4.2.7最短路径分析 点击最短路径查询
实习报 告 书 专 用 纸
操作部分核心代码如下所示:
procedure TForm1.Button6Click(Sender: TObject);var ii, jj: Integer;I: Integer;aa, bb: string;begin presultlayer := TGIS_LayerVector.Create;presultlayer.CS := ttkViewer1.CS;presultlayer.Params.Line.color := clred;presultlayer.Params.Line.Width := 40;presultlayer.HideFromLegend := True;ttkViewer1.Add(presultlayer);
proadlayer := ttkViewer1.Items[1] as TGIS_LayerVector;
pgeocoding := tgis_geocoding.Create(proadlayer);pgeocoding.RoadName := 'GIS_UID';(ttkViewer1.Get('TGIS_Geocoding')
as
实习报 告 书 专 用 纸
TGIS_LayerVector).HideFromLegend := True;
pshortespath := TGIS_ShortestPath.Create(ttkViewer1);pshortespath.LoadTheData(proadlayer);pshortespath.RoadName := 'GIS_UID ';pshortespath.UpdateTheData;pshape := proadlayer.FindFirst(proadlayer.Extent, '路名=''' + Edit1.Text + '''');aa := pshape.GetField('gis_uid');ii := pgeocoding.Parse(aa);if ii > 0 then begin pstartpoint := pgeocoding.Point[0];Edit1.Text := pgeocoding.Query[0];pgeocoding.AddPoint(pstartpoint, 3 / ttkViewer1.Zoom, nil);end else begin ShowMessage(Edit1.Text + ' 是无效地名');Exit;end;
pshape := proadlayer.FindFirst(proadlayer.Extent, '路名=''' + Edit2.Text + '''');bb := pshape.GetField('gis_uid');jj := pgeocoding.Parse(bb);if jj > 0 then begin pstoppoint := pgeocoding.Point[0];Edit2.Text := pgeocoding.Query[0];pgeocoding.AddPoint(pstoppoint, 3 / ttkViewer1.Zoom, nil);end else
实习报 告 书 专 用 纸
begin ShowMessage(Edit2.Text + ' 是无效地名');Exit;end;
pshortespath.UpdateTheData;if pshortespath.Find(pstartpoint, pstoppoint)then begin presultlayer.RevertAll;for I := 0 to pshortespath.ItemsCount-1 do begin pshape pshortespath.Items[I].Layer.GetShape(pshortespath.Items[I].Uid);if pshape <> nil then presultlayer.AddShape(pshape);end;ttkViewer1.VisibleExtent := presultlayer.Extent;ttkViewer1.Zoom := ttkViewer1.Zoom * 0.8;ttkViewer1.Update;end else begin ShowMessage(' 此路不通 ');end;end;4.2.8打印 点击打印
:=
实习报 告 书 专 用 纸
操作部分核心代码如下所示:
procedure TForm1.Button9Click(Sender: TObject);begin ttksimple.preview;end;4.2.9定点查询 点击定点查询
操作部分核心代码如下所示:
procedure TForm1.Button1Click(Sender: TObject);var pshape: TGIS_Shape;
实习报 告 书 专 用 纸
pLayer: TGIS_LayerVector;begin pLayer := ttkViewer1.items[2] as TGIS_LayerVector;pshape := pLayer.FindFirst(pLayer.Extent, '名称=''' + Edit3.Text + '''');if pshape <> nil then begin ttkViewer1.Center := pshape.Centroid;pshape := pshape.MakeEditable;pshape.IsSelected := true;ttkattrib.ShowShape(pshape);ttkattrib.Visible := true;ttkViewer1.Update;end;end;4.2.9关于模板
4.3 系统功能及效率分析
经过测试,系统总体的执行效率比较高。能够满足用户的基本要求。总结
本论文主要是探讨娱乐场所信息查询服务的设计与实现问题。在系统设计之初,尽管作者做了调查,但依然缺少足够的管理方面的经验,在结构和功能方面尚有考虑不到的地方。
第五篇:JSP语法总结
JSP语法(1)——HTML注释
HTML 注释 在客户端显示一个注释.JSP 语法 例子 1 在客户端的HTML源代码中产生和上面一样的数据: 例子 2 在客户端的HTML源代码中显示为: 描述 这种注释和HTML中很像,也就是它可以在“查看源代码”中看到。唯一有些不同的就是,你可以在这个注释中用表达式(例子2所示)。这个表达示是不定的,由页面不同而不同,你能够使用各种表达式,只要是合法的就行。
JSP语法(2)——隐藏注释
隐藏注释 写在JSP程序中,但不是发给客户。JSP 语法 <%--comment--%> 例子: <%@ page language=“java” %>
A Test of Comments
<%--This comment will not be visible in the page source--%>