第一篇:Delphi 字符串类型浅析
Delphi 字符串类型浅析 收藏
参考资料《Delphi 5开发人员指南》“第2章Object Pascal语言” 《PASCAL精要》“第7章 字符串操作” “Delphi中String类型和Char类型的比较” “Object Pascal中String类型的内幕探讨”
基本知识字符串类型
•AnsiString这是Pascal缺省的字符串类型,它由AnsiChar字符组成,其长度没有限制,同时与null结束的字符串相兼容。
•ShortString保留该类型是为了向后兼容Delphi1.0,它的长度限制在255个字符内。
•WideString功能上类似于AnsiString,但它是由WideChar字符(UniCode字符集)组成的。引入这种类型,主要是为了支持OLE编程。
•PChar指向null结束的Char字符串的指针,类似于C的char*或lpstr类型。
•PAnsiChar指向null结束的AnsiChar字符串的指针。
•PWideChar指向null结束的WideChar字符串的指针。
字符类型
•AnsiChar,以 8 位表示(共有 256 个不同的符号)。
•WideChar,以 16 位表示(共有 64,000 个不同的符号)。
String类型
注意:以下是指Delphi2007以前的编译器(包括Delphi2007)。
1、缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString字符串: var
S:string;//编译器认为S的类型是AnsiString
2、编译开关$H
“$H编译开关”的值用来决定当变量声明为string时,它是被当作AnsiString类型还是被当作ShortString类型。当“$H”值为负时,string变量是ShortString类型;当“$H”值为正时(缺省情况),string变量是AnsiString类型。下面的代码演示了这种情况: var
{$H-}
S1:string;//S1是ShortString类型 {$H+}
S2:string;//S2是AnsiString类型
使用$H规则的一个例外是,如果在定义时特地指定了长度(最大在255个字符内),那么总是ShortString。var
S:string[63];//63个字符的ShortString字符串
Char类型
1、Delphi2007以前的编译器(包括Delphi2007)缺省情况下认为Char是AnsiChar类型,PChar是PAnsiChar类型。
2、Delphi2009的编译器缺省情况下认为Char是WideChar类型,PChar是PWideChar类型。请注意,没有任何方法可变更这个新的编译器预设设定。对于字符串类型而言,会以固定的硬式编码方式将 Char 类型对应到特定的数据类型。
AnsiString类型
1、AnsiString是生存期自管理类型。
2、AnsiString字符串总是以null字符结束的,这使得AnsiString字符串能与Win32API中的字符串兼容。
3、AnsiString类型是一个指向在堆栈中的字符串结构的指针。可以使用Sizeof去读取AnsiString类型的大小,不论字符串的实际长度是多少,Sizeof(AString)永远是4。
4、AnsiString字符串在内存中分配的情况 注意:
在Delphi2.0以后版本中,不能再通过字符串的第0个元素来设置或得到字符串的长度,只能通过Length()函数来得到字符串的长度,通过SetLength()过程来设置字符串的长度。Borland并不保证String的内存结构在以后的Delphi版本中会保持不变。
(1)、Delphi5内存结构如下:
(2)、Delphi7内存结构如下:
AnsiString指向一块内存起始偏移8字节处,前面8字节依次为引用计数和长度计数两个整数。(3)、Delphi2009内存结构如下:-12-10-8-4
最后一位
字码页
字符大小
引用计数
字串长度
字串内容
0
除了字串长度及引用计数外,新的AnsiString格式包括字符大小及字码页。字符大小可用来区分 AnsiString 及UnicodeString,而字码页特别适用于 AnsiString 类型(可用于 Delphi 2009),UnicodeString 类型的字码页则固定为 1200,字码包括UTF-
8、GBK等,例如“$03A8就是936,查MSDN 936sizeof(StrRec));
showmessage(Format('分配大小:%d 引用计数:%d 字串长度:%d', [P.allocSiz,P.refCnt,P.length]));end;
示例:delphi7字符串内存结构
代码:
procedure TForm1.Button1Click(Sender: TObject);type
PStrRec = ^StrRec;
StrRec = packed record
refCnt: Longint;
length: Longint;
end;var
str: string;
P: PStrRec;
begin
str:='123';
P := Pointer(Integer(str)sizeof(StrRec));
showmessage(Format('字码页:%d 字符大小:%d 引用计数:%d [P.codePage,P.elemSize,P.refCnt,P.length]));end;
示例:widestring的长度
代码:
字串长度:%d', procedure TForm1.Button1Click(Sender: TObject);
//---
function _WStrLen1(const S: WideString): Integer;
begin
if Pointer(S)= nil then
Result := 0
else
Result := PInteger(Integer(S)-4)^ div sizeof(WideChar);
end;var
str: widestring;
begin
str := '测试123';
showmessage(Format('字串长度:%d', [_WStrLen1(str)]));end;
本文来自CSDN博客,转载请标http://blog.csdn.net/starsky2006/archive/2010/07/31/5778729.aspx
出处明:
第二篇: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 学
院:
专
业: 地理信息系统 班
级:
姓
名: 学
号:
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 系统功能及效率分析
经过测试,系统总体的执行效率比较高。能够满足用户的基本要求。总结
本论文主要是探讨娱乐场所信息查询服务的设计与实现问题。在系统设计之初,尽管作者做了调查,但依然缺少足够的管理方面的经验,在结构和功能方面尚有考虑不到的地方。
第四篇:字符串输出格式
printf的格式控制的完整格式:
%-0m.nl或h格式字符
下面对组成格式说明的各项加以说明:
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。
n指精度,用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。
格式小结:
(1)最常用的格式是%d,含义是以10进制形式打印一个整数。
如果输出的整数是负数,则输出的第一个字符就是-号。
%d:按整型数据的实际长度输出。
%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
%ld:输出长整型数据。
(2)%u格式与%d格式类似,只不过要求打印无符号10进制整数。
以无符号十进制形式输出整数。
对长整型可以用“%lu”格式输出。同样也可以指定字段宽度用“%mu”格式输出。
(3)%o格式请求输出8进制整数,以无符号八进制形式输出整数。
对长整型可以用“%lo”格式输出。同样也可以指定字段宽度用“%mo”格式输出。
(4)%x和%X格式请求输出16进制整数。
%x格式中用小写字母a,b,c,d,e,f来表示10到15之间的数,以无符号十六进制形式输出整数。
对长整型可以用“%lx”格式输出。同样也可以指定字段宽度用“%mx”格式输出。%X格式中用大写字母A,B,C,D,E,F来表示10到15之间的数
共同点:8进制和16进制整数总是作为无符号数处理的。
(5)%s格式用于打印字符串,与之对应的参数应该是一个字符指针,待输出的字符始于该指针所指向的地址,直到出现一个空字符(' ')才终止。%s:例如:printf(“%s”, “CHINA”)输出“CHINA”字符串(不包括双引号)。%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
(6)%c格式用于打印单个字符:例如:
printf(“%c”,c);等价于 putchar(c);
(7)%g,%f和%e这三个格式用于打印浮点值。
%g格式用于打印那些不需要按列对齐的浮点数特别有用。其作用有二: 一,去掉该数尾多余的零(没有达到六位的数)
二,保留六位有效数字(多余六位的)
%e格式用于打印浮点数时,一律显示地使用指数形式:例如:输出圆周率时是:
3.141593e+00
两者的区别:
%g格式打印出的数是总共6位有效数字
%e格式打印出小数点后的6位有效数字
%f禁止使用指数形式来表示浮点数。因此圆周率输出为:3.141593
(但注意它的精度要求:也是小数点后6位有效数字)
(8)%%格式用于打印一个%字符。
(9)%E和%G只是在输出时用大写字母(E)代替了小写字母(e)
⑦f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
%f:不指定宽度,整数部分全部输出并输出6位小数。
%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。⑧e格式:以指数形式输出实数。可用以下形式:
%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
%m.ne和%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
⑨g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。/*******************************************************************/ unsigned int i=295;
printf(“%dn”,i);
295
Press any key to continue
(1).可以在“%”和字母之间插进数字表示最大场宽。
例如: %2d 表示输出3位整型数, 不够2位右对齐。
例如: %5d 表示输出3位整型数, 不够5位右对齐。
例如: %10d 表示输出3位整型数, 不够10位右对齐。
unsigned int i=295;
printf(“%2dn”,i);
printf(“%5dn”,i);
printf(“%10dn”,i);
295
295
295
Press any key to continue
(2).补0或者其它
例如: %02d 表示输出3位整型数, 不够2位右对齐,补0。
例如: %05d 表示输出3位整型数, 不够5位右对齐,补0。
例如: %010d 表示输出3位整型数, 不够10位右对齐,补0。
unsigned int i=295;
printf(“%02dn”,i);
printf(“%05dn”,i);
printf(“%010dn”,i);
295
00295
0000000295
Press any key to continue
(3).负数
int i=-295;
printf(“%02dn”,i);
printf(“%05dn”,i);
printf(“%010dn”,i);
-295
-0295
-000000295
Press any key to continue
(4).可以控制输出左对齐或右对齐, 即在“%”和字母之间加入一个“-” 号可 说明输出为左对齐, 否则为右对齐。
unsigned int i=295;
printf(“%-02dn”,i);
printf(“%-05dn”,i);
printf(“%-010dn”,i);
295
295
295
Press any key to continue
(5).可以在“%”和字母之间加小写字母l, 表示输出的是长型数。
例如: %ld 表示输出long整数
%lf 表示输出double浮点数
(6).%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。
例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除./*
unsigned int i=295;
printf(“%dn”,i);
printf(“%1dn”,i);
printf(“%09dn”,i);
printf(“%09dn”,(unsigned char)i);
printf(“%9dn”,(unsigned char)i);
printf(“%-9dn”,(unsigned char)i);
*/
/*
295
295
000000295
000000039
Press any key to continue
*/
/*******************************************************************/ 对于m.n的格式还可以用如下方法表示(例)
int m=10,n=5;
char ch[]=“abcdefghijklmnopqrst”;
printf(“%*.*sn”,m,n,ch);//输出为abcde
前边的*定义的是总的宽度,后边的定义的是输出的个数,分别对应外面的参数m和n。
我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式 /*******************************************************************/ “%08lxn”,4byte
“%04xn”,2byte
“%-2.2BX”,1byte
第五篇: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)+ ')');