delphi编程,DELPHI基础教程:Delphi拖放编程[1]
delphi编程,DELPHI基础教程:Delphi拖放编程[1]详细介绍
本文目录一览: 怎样提高delphi编程效率
由Borland公司推出的Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了MicrosoftWindows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-OrientedLanguage)、当今世界上最快的编辑器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。
Delphi是Borland公司研制的新一代可视化开发工具,可在Windows3.x、Windows95、WindowsNT等环境下使用。当前,DELPHI也可以为LINUX平台上开发应用,其在LINUX上的对应产品Kylix。
DELPHI拥有一个可视化的集成开发环境(IDE),采用面向对象的编程语言和基于部件的开发结构框架。Delphi它提供了500多个可供使用的构件,利用这些部件,开发人员可以快速地构造出应用系统。开发人员也可以根据自己的需要修改部件或用Delphi本身编写自己的部件。主要特点如下:
(1)直接编译生成可执行代码,编译速度快。由于Delphi编译器采用了条件编译和选择链接技术,使用它生成的执行文件更加精炼,运行速度更快。在处理速度和存取服务器方面,Delphi的性能远远高于其他同类产品。
(2)支持将存取规则分别交给客户机或服务器处理的两种方案,而且允许开发人员建立一个简单的部件或部件集合,封装起所有的规则,并独立于服务器和客户机,所有的数据转移通过这些部件来完成。这样,大大减少了对服务器的请求和网络上的数据传输量,提高了应用处理的速度。
(3)提供了许多快速方便的开发方法,使开发人员能用尽可能少的重复性工作完成各种不同的应用。利用项目模板和专家生成器可以很快建立项目的构架,然后根据用户的实际需要逐步完善。
(4)具有可重用性和可扩展性。开发人员不必再对诸如标签、按钮及对话框等Windows的常见部件进行编程。Delphi包含许多可以重复使用的部件,允许用户控制Windows的开发效果。
(5)具有强大的数据存取功能。它的数据处理工具BDE()是一个标准的中介软件层,可以用来处理当前流行的数据格式,如xBase、Paradox等,也可以通过BDE的SQLLink直接与Sybase、SQLServer、Informix、Oracle等大型数据库连接。Delphi既可用于开发系统软件,也适合于应用软件的开发。
(6)拥有强大的网络开发能力,能够快速的开发B/S应用,它内置的IntraWeb和ExpressWeb使得对于网络的开发效率超过了其他任何的开发工具。
(7)Delphi使用独特的VCL类库,使得编写出的程序显得条理清晰,VCL是现在最优秀的类库,它使得Delphi在软件开发行业处于一个绝对领先的地位。用户可以按自己的需要,任意的构建、扩充、甚至是删减VCL,以满足不同的需要。
(8)从Delphi8开始Delphi也支持.Net框架下程序开发。
当前DELPHI已经成为一个品牌,而不仅仅是一个开发平台或开发语言的名称。当前DELPHI产品已经由CodeGear公司继续发展,该公司是BORLAND公司的全资子公司。当前,CodeGear为广大开发者提供了DELPHIFORPHP,以高度可视化的方式全面支持面向对象的PHP网站开发,大大提高了PHP开发网站的代码复用程度,成为WEB应用开发的新利器。
Delphi语言主要用于哪些编程?
桌面程序,串口通信应用,C/S数据库开发,硬件控制,网络通讯,图形图像,基本上除了操作系统以外它都能胜任。
从现在的发展趋势来看,常用的编程语言主要有:C、C++、Python,Java、VisualBasic、PHP、Perl、C#、JavaScript、Delphi、SAS、Ruby、PL/SQL、D、ABAP、Lisp/Scheme、COBOL、Ada、Pascal、VisualFoxPro等。
而且,学编程在精不在于多。只要学会、并熟练掌握了一种高级语言(可以选择C、C++、Python,Java、PHP、JavaScript其中的一个),那么即使再学习新的语言,也是比较容易的。
至于都是谁发明的,我就不多说了。这么多,你还是自己查去吧,哈哈。
Delphi面向对象的编程方法(三)
跳转语句
Object Pascal的跳转语句有if和case两个 语句
if语句会计算一个表达式 并根据计算结果决定程序流程 在上文的例程中 根据ColorDialog Execute的返回值 决定窗体的背景颜色 if保留字后跟随一个生成Boolean值True或False的表达式 一般用 = 作为关系运算符 比较产生一个布尔型值 当表达式为True时 执行then后的语句 否则执行else后的代码 if语句也可以不含else部分 表达式为False时自动跳到下一行程序
if语句可以嵌套 当使用复合语句表达时 复合语句前后需加上begin…end else保留字前不能加 而且 编译器会将else语句视为属于最靠近的if语句 必要时 须使用begin…end保留字来强迫else部分属于某一级的if语句
case语句
case语句适用于被判断的变量或属性是整形 字符型 枚举型或子界型时(LongInt除外) 用case语句进行逻辑跳转比编写复杂的if语句容易阅读 而且程序代码整形较快
下面的例程显示一个使用case语句的窗体
建立如下的事件处理过程
procedure TForm Button Click(Sender: TObject); var Number : Integer; begin Number := StrToInt(Edit Text); case Number of : Label Caption := 奇数 ; : Label Caption := 偶数 ; : begin Label Caption := 在 到 之间 ; Form Color := clBlue; end; else Label Caption := 大于 或为负数 ; end; end;
执行程序 当Edit 部件接受到一个值 并按动 OK 按钮触发程序后 Number便被赋值为用户输入的数值 case语句根据Number的值判断该执行哪一条语句 象if语句一样 case语句也有可选择的else部分 case语句以end结尾 循环语句
Object Pascal的循环语句有三种 repeat while和for语句
repeat语句
repeat语句会重复执行一行或一段语句直到某一状态为真 语句以repeat开始 以until结束 其后跟随被判断的布尔表达式 参阅以下的例程
i := ; repeat i := i+ ; Writen(i); until i= ;
当此语句被执行时 窗体的下方会出现 到 的数字 布尔表达式 i= (注意 与其他语言不同的是 = 是关系运算符 而不能进行赋值操作)直到repeat until程序段的结尾才会被计算 这意味着repeat语句至少会被执行一次
while语句
while语句和repeat语句的不同之处是 它的布尔表达式在循环的开头进行判断 while保留字后面必须跟一个布尔表达式 如果该表达式的结果为真 循环被执行 否则会退出循环 执行while语句后面的程序
下面的例程达到和上面的repeat例程达到同样的效果
i := ; while i< do begin i := i+ ; writeln(i); end;
for语句
for语句的程序代码会执行一定的次数 它需要一个循环变量来控制循环次数 您需要说明一个变量 它的类型可以是整形 布尔型 字符型 枚举型或子界型
下面的程序段会显示 到 的数字 i为控制变量
var i : integer; for i := to do writeln(i);
以上介绍了三种循环语句 如果您知道循环要执行多少次的话 可以使用for语句 for循环执行速度快 效率比较高 如果您不知道循环要执行多少次 但至少会执行一次的话 选用repeat until语句比较合适 当您认为程序可能一次都不执行的话 最好选用while do语句 程序模块
程序模块在Object Pascal中是很重要的概念 它们提供了应用程序的结构 决定了变量 属性值的范围及程序执行的过程 它由两个部分组成 可选择的说明部分和语句部分 如果有说明部分 则必在语句部分之前 说明部分包括变量说明 常量说明 类型说明 标号说明 程序 函数 方法的说明等 语句部分叙述了可执行的逻辑行动
在Delphi中 最常见的程序模块便是事件处理过程中的程序模块 下面的事件处理过程是含有变量说明部分的程序模块
procedure TForm Button Click(Sender Tobject); var {程序模块的说明部分} Name : string; begin {程序模块的语句部分} Name := Edit Text; Edit Text := Wele to Delphi +Name; end; {程序模块结束}
库单元也是程序模块 库单元的interface部分含有库函数 类型 私有 公有域的说明 也可以含有常量 变量的说明 这一部分可以作为程序模块的说明部分 在库单元的implementation部分中通常含有各种事件处理过程 它们可以视为模块的语句部分 是事件处理模块 库单元模块结束于库单元结束的end 处
程序模块中可以包含其他的程序模块 上文库单元模块中含有事件处理模块 而库单元模块实际是在工程程序模块中
所有的Delphi应用程序都有相同的基本结构 当程序逐渐复杂时 在程序中加入模块即可 例如在库单元模块中加入事件处理模块 向工程中加入库单元模块等 模块化编程使得程序结构良好 并且对数据具有保护作用
关于作用范围
标识符的作用范围
一个变量 常量 方法 类型或其他标识符的范围定义了这个标识符的活动区域 对于说明这个标识符的最小程序模块而言 此标识符是局部的 当您的应用程序在说明一个标识符的程序模块外执行时 该标识符就不在此范围内 这意味着此时执行的程序无法访问这个标识符 只有当程序再度进入说明这个标识符的程序模块时 才可以访问它
下面的示意图表示一个含有两个库单元的工程 每个库单元中又各有三个过程或事件处理过程
访问其他程序模块中的说明
您可以在当前的程序模块中访问其他程序模块中的说明 例如您在库单元中编写一个事件处理过程来计算利率 则其他的库单元可以访问这个事件处理过程 要访问不在当前库单元中的说明 应在这个说明之前加上其他应用程序的名称和一个点号( ) 例如 在库单元Unit 中有事件处理过程CalculateInterest过程 现在您想在库单元Unit 中调用这一过程 则可以在Unit 的uses子句中加入Unit 并使用下面的说明
Unit CalculateInterest(PrincipalInterestRate : Double)
lishixinzhi/Article/program/Delphi/201311/8504
Delphi面向对象的编程方法(六)
字符串类型
字符串类型事实上是一个一维的字符数组 当您说明一个字符串型的变量时 您应当指明这个字符串的大小 下面是说明字符串类型的例子
type MyString: string[ ]; var MyName: MyString;
则变量MyName被说明成为最多可以包含 个字符 如果您没有说明字符串的大小 Delphi会认为字符串包含最大值 个字符 给字符串赋值可以直接使用单引号括起的字串赋值
MyName := Frank Smith ;或MyName := 张明
因为MyName是一个可以包含 个字符的MyString型变量 上文的两个的变量都是有效的 一个汉字可以视作两个字符 当您给字符串型变量赋的值多于定义数值时 例如将MyName赋为 FrankSmith Franklin 则Delphi只会接受前 个字符 FrankSmith Fran 在内存中 字符串通常占用比所说明的大小多一个字节的空间 因为第一个位置是一个包含这个数组大小的字节 您可以使用索引值来访问字符串的字符 MyName[ ]可以得到MyName的第一个字符 F
您可以使用Delphi丰富的运算符 过程和函数来处理字符串型的变量和属性 下面介绍几个常用的运算符和Delphi过程或函数
Concat和(+)功能相同 都可以将多个字符串组合在一起 建立一个较大的字符串 Copy会返回一个字符串中的子字符串 Delete在一个字符串中从一个指定位置起删除一定数目的字符 Insert在一个字符串中插入一个字符串 Length返回字符串的长度 Pos返回一个子字符串在一个字符串中的位置 即索引值
集合类型
集合类型是一群相同类型元素的组合 这些类型必须是有限类型如整形 布尔型 字符型 枚举型和子界型 在检查一个值是否属于一个特定集合时 集合类型非常有用 下面的例程可以说明集合类型的用法
在窗体上加入一个编辑框和一个按钮 清除编辑框中的文字 在其上加上Caption为 输入元音 的标签Label 并在编辑框的下方加入一个空的标签 将按钮的Default属性改为True 建立按钮的事件处理过程如下
procedure TForm Button Click(Sender:TObject); type Tvowels=set of Char; var Vowels:TVowels; begin Vowels := [ a e i o u ]; if Edit Text[ ] in Vowels then Lable Caption := 是元音 ; else Lable Caption := 请再试 ; end;
执行这个程序 在编辑框中输入字母 表达式Edit Text[ ] in Vowels的结果是布尔型的 in是运算符 用来判断字母是否存在于集合中 输入的判别结果会显示在编辑框的下方 以上就用到了集合类型TVowels
记录类型
记录是您的程序可以成组访问的一群数据的集合 下面的例程说明了一个记录类型的用法
type TEmployee=record Name : string[ ]; YearHired: ; Salsry: Double; Position: string[ ]; end;
记录包含可以保存数据的域 每一个域有一个数据类型 上文的记录TEmployee类型就含有四个域 您可以用以下的方式说明记录型的变量
var NewEmployee PromotedEmployee:TEmployee;
用如下的方法可以访问记录的单域
NewEmployee Salary := ;
编写如下的语句可以给整个记录赋值
with PromotedEmployee do begin Name := ; YearHired := ; Salary := Position := editor ; end;
您的程序可以将记录当成单一实体来操作
PromptEmployee := NewEmployee;
以上介绍了用户常用的自定义类型 在Delphi的编程中 对象是非常重要的用户自定义数据类型 象记录一样 对象是结构化的数据类型 它包含数据的域(Field) 也包含作为方法的过程和函数 在Delphi中 当您向窗体中加入一个部件 也就是向窗体对象中加入了一个域 每一个部件也是对象 每当您建立一个事件处理过程使得部件可以响应一个事件时 您即自动地在窗体中加入了一个方法 在本章第 节中 将详细讲述Delphi面向对象编程的方法和技巧
Object Pascal的库单元Unit
Units是常量 变量 数据类型 过程和函数的集合 而且能够被多个应用程序所共享 Delphi已经拥有许多预定义的程序库单元可供您建立您的程序库单元使用 Delphi的Visual Component Library由多个程序库单元组成 它们说明了对象 部件以供您的应用程序用来设计用户界面 例如 当您在窗体中加入一个Check Box时 Delphi自动在您的程序库单元中加入了Stdctrls库单元 因为TCheckBox部件是在StdCtrls库单元中说明的
当您设计您的窗体时 Delphi自动建立一个和您的窗体有关的库单元 您的库单元不必都和窗体有关 也可以使用预定义的只包含数学运算函数的库单元 或是自行编写数学函数库单元 在一个库单元中所有的说明都相互有关系 例如 CDialogs程序库单元包含了在您的应用程序中使用的普通对话框的所有说明 Object Pascal程序库单元的结构
不管一个库单元是否和一个窗体有关 库单元的结构都是相同的 其结构如下
unit
interface uses
{公有说明} implementation uses
在implementation部分的uses子句中指定的库单元 只供给本库单元的程序使用其interface中说明的程序 其他使用本库单元的库单元 不能访问这些在implementation的udes子句中库单元的说明 因为在implementation后进行的库单元包含是私有的 所以上例中 如果C出现在B的implementation部分 则A不能使用C的公有部分 除非C出现在A的uses子句中 在implementation中出现的循环访问是Delphi所允许的 如果A的implemetation的uses子句中出现B 则B的implementation部分也可以出现A
程序库单元的初始化部分
初始化当前库单元所使用的数据 或是通过interface部分将数据提供给其他应用程序 库单元使用时 您可以在库单元中加入一个initialization部分 在库单元的end前加上您的初始化语句 当一个应用程序使用一个库单元时 在库单元中的initialization部分会先于其他的代码执行 如果一个应用程序使用了多个库单元 则每一个库单元的初始化部分都会在所有的程序代码前执行
使用Delphi的可视化部件及其库单元
当您在窗体中加入可视化部件时 如果该部件在可视化部件库中 Delphi会在您的库单元的interface部分的uses子句中自动加上需要使用的库单元名称 但有些对象在Delphi的环境中并没有可视化部件存在 例如 您想在库单元中加入一个预定义的信息框 则您必须把MsgDlg库单元加入您的uses子句中 如果您要使用TPrinter对象的话 必须将Printer库单元加入uses子句中 在在线帮助中可以查到对象所属的预定义库单元 要使用在其他库单元中说明的函数 应在函数的前面加上这一库单元的名称 并用 号隔开 例如 要在Unit 中使用Unit 中说明的Calculate函数 应使用下面的方法
Number := Unit Calculate( );
您可以在任何标识符如属性 常量 变量 数据类型 函数等之前加上库单元的名称 您可以在自由地在任何Delphi库单元中加入程序代码 但不要改变由Delphi生成的程序
建立与窗体无关的新库单元
如果您想在工程中建立一个和任何窗体无关的新库单元 可以现选用File|New Unit 这时一个新的库单元加入了工程 新库单元的代码如下
unit Unit ; interface implementation end
Delphi将根据您的工程中的文件数目为您的库单元选择名称 您可以在程序骨架间加入您的程序代码
当编译您的工程时 这个新加入的库单元会被编译为一个具有 DCU后缀的文件 这个新生成的文件是链接到工程的可执行文件上的机器代码
{私有说明} {过程和函数的执行部分} initialization {选择性的} {选择性的初始化程序} end
程序库单元的接口部分
interface是库单元的接口部分 它决定了本库单元对其他任何库单元或程序的可见(可访问)部分 您可以在接口部分说明变量 常量 数据类型 过程和函数等等 Delphi在您设计窗体的库单元中 将窗体数据类型 窗体变量和事件处理过程都说明在这一部分
interface标志库单元接口部分的开始 在interface中的说明对要使用这些说明的其他库单元或应用程序是可见的 一个库单元可以使用其他Unit的说明 只需要在uses子句中指明那些库单元即可 例如 您在库单元A中编写程序代码 且您想调用UnitB于interface部分说明的程序 您可以把库单元B的名称加入到A的interface部分的uses子句中 则任何A中的程序都可以调用B中说明的程序 而且 如果B中interface部分的uses子句中出现C库单元 尽管A中未曾出现C A同样可以调用B C库单元在interface中说明的程序 但如果B出现在A的interface部分的uses子句中 那么库单元A便不能出现在B的interface的uses子句中 因为这样会产生对库单元的循环访问 当试图编译时 会产生出现错误信息
程序库单元的实现部分
lishixinzhi/Article/program/Delphi/201311/8489
选择性的库单元列表>
选择性的库单元列表>
库单元名称>
Delphi面向对象的编程方法(一)
Delphi的编程语言是以Pascal为基础的 Pascal语言具有可读性好 编写容易的特点 这使得它很适合作为基础的开发语言 同时 使用编译器创建的应用程序只生成单个可执行文件( EXE) 正是这种结合 使得Pascal成为Delphi这种先进开发环境的编程语言
本章中 我们将讨论Object Pascal的主要特点 并讲解如何在事件处理过程和其他应用程序中 使用它来编制程序代码 本章将讲解Delphi应用程序中最常用的Object Pascal语法 而不是Pascal语言的一切细节 如果您完全不熟悉Pascal编程 请参阅一些基础的Pascal教程 如果您具有编程经验 并能熟练地使用其他流行程序语言 您将在本章的Object Pascal中发现一些相同的概念 如果您已经熟悉了Borland Pascal 就可以快速浏览或跳过本章
编写Object Pascal程序代码
在本章中 我们将从熟悉Pascal编程的角度 配合实例 讲解Object Pascal编程的基本方法
在编写自己的Object Pascal程序时 要注意程序的可读性 Pascal语言是英式结构语言 在程序中选择合适的缩排 大小写风格 并在需要时将程序代码分行 会使得程序代码能够很容易地被自己和他人读懂 一般的程序员都有这样的体验 如果不给程序加上适当的注解 一段时间后 自己也难以理清程序的流程 给程序及时地加上注释是良好的编程习惯 Delphi的注释需要加注在{}之间 编辑器会把它们处理成为空白 Delphi保留了Borland Pascal编辑器的风格 关键字采用黑体字 被注释的部分会变暗 这使得编程风格良好 易读易写
编写赋值语句
在事件处理过程中 最常用到的工作就是把一个新值赋给一个属性或变量 在设计用户界面时 可以使用Object Inspector(Object Inspector)来改变其属性 但有时需要在程序执行时改变属性的值 而且有些属性只能在执行时改变 这些属性在Delphi的在线帮助的 Proprety 主题中被标为执行期属性 进行这种改变 就必须使用赋值语句
下文的赋值语句表征一个OnClick事件 当按钮按动后 将编辑框部件Edit 的Color属性置为clRed: procedure TForm Button Click(Sender: TObject); begin Edit Color := clRed; end;
当按动按钮后赋值语句被执行 编辑框变成红色
在语句中 部件的名称在属性前 中间用 表示属性的所属关系 这样就准确地指定了要将clRed值赋给哪一部件的哪一属性 赋值号为 := 不论给属性还是给变量赋值 都是将右边的值赋给左边的属性或变量
当将一个属性值 变量 常量或文本数据赋给属性或变量时 所赋值的类型和接受此值的属性或变量的类型应相同或兼容 一个属性或变量的类型定义了此属性或变量的可能值集合 也定义了程序代码可以执行的运算 在前边的例程中 编辑框部件的Color属性和clRed的类型都是TColor 可以在在线帮助中找到一个属性的类型 另外一种方法是在Object Inspector中选定该属性值段 并按下F 键 则类型将在属性说明的结尾处列出 例如Color属性列出下边的语句
Property Color : TColor;
有些属性是只读(Read Only)的 它们只能被读取 不能被改变 请查阅在线帮助 在Delphi中这些只读属性都有注解
标识符的说明与使用
标识符是Delphi应用程序中一些量的名称 这些量包括变量(var) 常量(const) 类型(type) 过程(procedure) 方法(Method)及其他 Object Pascal 在应用标识符时 必须首先说明它们 Object Pascal是强类型语言 它的编译器可以检查确保赋给变量或属性的值是正确的类型 以便于您改正错误 因为Object Pascal是编译语言 所以Delphi的执行速度要比使用解释语言快得多 在使用标识符前说明它们 可以减少程序错误并增加代码的效率
变量
变量是程序代码中代表一个内存地址的标识符 而此地址的内存内容在程序代码执行时可以被改变 在使用变量前必须对它进行说明 即对它进行命名 并说明它的类型 在所有变量说明以前加上保留字var 变量说明左边是变量的名称 右边则是该变量的类型 中间用(:)隔开
var Value Sum : Integer; Line : String;
在窗体中加入一个名称为Edit 的编辑框 再加入一个名称(属性Name)为Add的按钮部件 并建立如下的事件处理过程
procedure TForm addClick(Sender: TObject); var X Y: Integer; begin X := ; Y := ; Edit Text := IntToStr(X + Y); end;
在本例中 当按动ADD按钮时 编辑框中显示值 在Object Pascal中 必须确保变量或属性被赋予类型相同或兼容的值 您可以尝试将赋给X的值改为 或去掉IntToStr函数 在编译时会出现类型不匹配的错误 这也说明了Object Pascal强类型语言的特点 Object Pascal有多个预定义的数据类型 您可以说明任何这些类型的变量
整形 Integer的范围是 到 占 字节的内存 Shortint从 到 占 字节内存 Longint从 到 占 字节内存 Byte从 到 占 字节 Word从 到 占 字节内存 它们都是没有小数部分的数字
实型 Single可以包含 到 位有效小数部分 占用 字节的内存 Double类可以包含 到 位有效小数部分 占用 字节的内存 Extended类型包含 到 位有效小数部分 占用 字节内存 Comp可以包含 到 位有效小数部分 占用 字节内存 以上实数类型只有在 / 选项[N+]打开才可以使用 Real可以包含 到 位有效小数部分 占用 字节内存 它只有在和以前Borland Pascal兼容的情况下才使用 否则应使用Double或Extended
布尔型 Boolean 只包含true或False两个值 占用 字节内存
字符型 Char 一个ASCII字符 字符串类型String一串最长可达 个ASCII字符
指针型 Pointer 可以指向任何特定类型
字符串型 PChar 是一个指向以零结尾的字符串的指针
除了预定义类型外 Delphi还有自行定义的类型 上述例程的TColor就是这种类型 此外 用户还可以定义自己的数据类型 这部分内容将在下文中详细讲述
整型类别和实型类别都各有五种类型 同一类别中 所有的类型与其他同类别的都相容 您可以将一种类型的值赋给相同类别中不同类型的变量或属性 而只需要这个值的范围在被赋值的变量或属性的可能值范围内 例如 对于一个Shortint型的变量 可以接受在 到 范围内的任意整数 例如Shortint类型的 您不能将 赋给它 因为 已经超出了Shortint的范围了 将范围检查功能打开(选用Options|Project 并在Compiler Options Page中选择Range Checking) 将会检查出一个范围错误 如果Range Checking没有被打开 那么程序代码将可以执行 但被赋值的值将不是您期望的值
在一些情况下 您可以进行不同类型的变量或属性的赋值 一般来说 可以将一个较小范围的值赋给一个较大范围的值 例如 您可以将整型值 赋给一个接受实型值的Double属性而使得值成为 但如果将一个Double类型的值赋给整形变量 则会出现类型错误 如果您不清楚类型的兼容性 可以参阅Delphi的在线帮助中 Type Compatibility and Assignment Compatibility 主题
常量
常量在说明时就被赋予了一个值 在程序执行过程中是不可改变的 下面的例子说明了三个常量
const Pi = ; Answer = ; ProductName = Delphi ;
象变量一样 常量也有类型 不同的是 常量假设其类型就是常量说明中其所代表的值的类型 上文的三个常量的类型分别是real型 整形 字符串型 常量用 = 表示两边的值是相等的
过程与函数
lishixinzhi/Article/program/Delphi/201311/8549
Delphi面向对象的编程方法(七)
程序库单元的初始化部分
初始化当前库单元所使用的数据 或是通过interface部分将数据提供给其他应用程序 库单元使用时 您可以在库单元中加入一个initialization部分 在库单元的end前加上您的初始化语句 当一个应用程序使用一个库单元时 在库单元中的initialization部分会先于其他的代码执行 如果一个应用程序使用了多个库单元 则每一个库单元的初始化部分都会在所有的程序代码前执行
使用Delphi的可视化部件及其库单元
当您在窗体中加入可视化部件时 如果该部件在可视化部件库中 Delphi会在您的库单元的interface部分的uses子句中自动加上需要使用的库单元名称 但有些对象在Delphi的环境中并没有可视化部件存在 例如 您想在库单元中加入一个预定义的信息框 则您必须把MsgDlg库单元加入您的uses子句中 如果您要使用TPrinter对象的话 必须将Printer库单元加入uses子句中 在在线帮助中可以查到对象所属的预定义库单元
要使用在其他库单元中说明的函数 应在函数的前面加上这一库单元的名称 并用 号隔开 例如 要在Unit 中使用Unit 中说明的Calculate函数 应使用下面的方法
Number := Unit Calculate( );
您可以在任何标识符如属性 常量 变量 数据类型 函数等之前加上库单元的名称 您可以在自由地在任何Delphi库单元中加入程序代码 但不要改变由Delphi生成的程序
建立与窗体无关的新库单元
如果您想在工程中建立一个和任何窗体无关的新库单元 可以现选用File|New Unit 这时一个新的库单元加入了工程 新库单元的代码如下
unit Unit ; interface implementation end
Delphi将根据您的工程中的文件数目为您的库单元选择名称 您可以在程序骨架间加入您的程序代码
当编译您的工程时 这个新加入的库单元会被编译为一个具有 DCU后缀的文件 这个新生成的文件是链接到工程的可执行文件上的机器代码 将库单元加入工程
将库单元加入工程是比较简单的 无论是您自己建立的库单元还是Delphi建立的与窗体有关的库单元 如果已经完成 则先打开您想加入库单元的工程(可以用Open Project打开工程) 再选用File|Open File 然后选择您想加入的源程序( PAS文件) 并选择OK即可 则库单元被加入到应用程序中
用Delphi的对象进行编程
Delphi是基于面向对象编程的先进开发环境 面向对象的程序设计(OOP)是结构化语言的自然延伸 OOP的先进编程方法 会产生一个清晰而又容易扩展及维护的程序 一旦您为您的程序建立了一个对象 您和其他的程序员可以在其他的程序中使用这个对象 完全不必重新编制繁复的代码 对象的重复使用可以大大地节省开发时间 切实地提高您和其他人的工作效率
什么是对象
一个对象是一个数据类型 对象就象记录一样 是一种数据结构 按最简单的理解 我们可以将对象理解成一个记录 但实际上 对象是一种定义不确切的术语 它常用来定义抽象的事务 是构成应用程序的项目 其内涵远比记录要丰富 在本书中 对象可被理解为可视化部件如按钮 标签 表等
了解对象 最关键的是掌握对象的特性 一个对象 其最突出的特征有三个 封装性 继承性 多态性
对象的封装性
对对象最基本的理解是把数据和代码组合在同一个结构中 这就是对象的封装特性 将对象的数据域封闭在对象的内部 使得外部程序必需而且只能使用正确的方法才能对要读写的数据域进行访问 封装性意味着数据和代码一起出现在同一结构中 如果需要的话 可以在数据周围砌上 围墙 只有用对象类的方法才能在 围墙 上打开缺口
对象的继承性
继承性的含义直接而且显然 它是指把一个新的对象定义成为已存在对象的后代 新对象继承了旧类的一切东西 在往新对象中添加任何新内容以前 父类的每一个字段和方法都已存在于子类中 父类是创建子类的基石
对象的多态性
多态性是在对象体系中把设想和实现分开的手段 如果说继承性是系统的布局手段 多态性就是其功能实现的方法 多态性意味着某种概括的动作可以由特定的方式来实现 这取决于执行该动作的对象 多态性允许以类似的方式处理类体系中类似的对象 根据特定的任务 一个应用程序被分解成许多对象 多态性把高级设计处理的设想如新对象的创建 对象在屏幕上的重显 程序运行的其它抽象描述等 留给知道该如何完美的处理它们的对象去实现
通过Delphi实例了解对象
让我们结合Delphi的实例讨论对象的概念:
当您要建立一个新工程时 Delphi 将显示一个窗体作为设计的基础 在程序编辑器中 Delphi将这个窗体说明为一个新的对象类型 并同时在与窗体相关联的库单元中生成了创建这个新窗体对象的程序代码
unit Unit ; interface uses SysUtils Windows Messages Classes Graphics Controls Forms Dialogs; type TForm = class(TForm) {窗体的类型说明开始} private{ Private declarations } public{ Public declarations } end; {窗体的类型说明结束} var Form : TForm ; {说明一个窗体变量} implementation {$R * DFM} end
新的窗体类型是TForm 它是从TForm继承下来的一个对象 它具有对象的特征 含有域或方法 由于您未给窗体加入任何部件 所以它只有从TForm类中继承的域和方法 在窗体对象的类型说明中 您是看不到任何域 方法的说明的 Form 称为TForm 类型的实例(instance) 您可以说明多个对象类型的实例 例如在多文档界面(MDI)中管理多个子窗口时就要进行这样的说明 每一个实例都有自己的说明 但所有的实例却共用相同的代码
假设您向窗体中加入了一个按钮部件 并对这个按钮建立了一个OnClick事件处理过程 再查看Unit 的源程序 会发现TForm 的类型说明部分如下
type TForm = class(TForm) Button : TButton; procedure Button Click(Sender: TObject); private{ Private declarations } public{ Public declarations } end;
现在TForm 对象有了一个名为Button 的域 它是您在窗体中加入的按钮 TButton是一个对象类型 Button 是Tbutton的一个实例 它被TForm 对象所包含 作为它的数据域 每当您在窗体中加入一个部件时 部件的名称就会作为TFom 的域加入到类型说明中来 在Delphi中 您所编写的事件处理过程都是窗体对象的方法 每当您建立一个事件处理过程 就会在窗体的对象类型中说明一个方法
当您使用Object Inspector来改变对象(部件)的名称时 这个名称的改变会反映到程序中 例如 在Object Inspector中将Form 的Name属性命名为ColorBox 您会发现在类型说明部分 会将前文的TForm 改为
TColorBox=class(TForm);
并且在变量说明部分 会说明ColorBox为TColorBox类型的变量 由Delphi自动产生的事件处理过程名称会自动改为TColorBox Button Click 但您自行编写的实现部分的代码却不会被自动修改 因此 如果您在改变Name属性前编写了程序 则您必须将事件处理过程中的对象名称进行改变 所以 原先的Form Color要改为ColorBox Color
从一个对象中继承数据和方法
前面的TForm 类型是很简单的 因为它只含有域Button 和方法Button Click 但是在这个窗体上 您可以改变窗体的大小 加入或删除窗体的最大最小化按钮 或设置这个窗体为MDI界面 对于一个只包含一个域和方法的对象来讲 您并没有看到显式的支持程序 在窗体上单击鼠标或用Object Inspector的上端的Object Selector选中Form 对象 按动F 查阅它的在线帮助 您会在Properties和Method中找到它的继承到的全部属性和方法 这些是在TForm类型中说明的 TForm 是TForm的子类 直接继承了它所有的域 方法 属性和事件 例如窗体的颜色属性Color就是在TForm中说明的 当您在工程中加入一个新窗体时 就等于加入了一个基本模型 通过不断地在窗体中加入部件 您就自行定义了一个新的窗体 要自定义任何对象 您都将从已经存在的对象中继承域和方法 建立一个该种对象的子类 例如对象TForm 就被说明为对象TForm的子类 拥有一个窗体部件的基本属性或方法 只有当您在窗体中加入了部件或编写了事件处理过程时 Form 才成为您自己的类型
一个比较特殊的对象是从一个范围较广或较一般的对象中继承下来的 它是这个特别对象的祖先 这个对象则称为祖先的后代 一个对象只能有一个直接的祖先 但是它可以有许多后代 TForm是TForm 类型的祖先 所有的窗体对象都是TForm的后代
用F 查阅窗体的在线帮助时 您会发现TForm被称为ponent(部件) 这是因为所有的部件都是对象
在这个结构中所有的部件都是对象 部件类型TComponent从TObject类型中继承数据和程序代码 并具有额外的可以用作特殊用途的属性 方法 事件 所以部件可以直接和用户打交道 记录它的状态并存贮到文件中等等 控制类型TControl从TComponent中继承而来 又增加了新的功能 如它可以显示一个对象 在上图中 虽然TCheckBox不是直接由TObject继承来的 但是它仍然有任何对象所拥有的属性 因为在VCL结构中 TCheckBox终究还是从TObject 中继承了所有功能的特殊对象 但它还有些自行定义的独到的功能 如可以选择记录状态等
对象的范围
关于对象的范围
一个对象的范围决定了它的数据域 属性值 方法的活动范围和访问范围 在一个对象的说明部分说明的数据域 属性值 方法都只是在这个对象的范围中 而且只有这个对象和它的后代才能拥有它们 虽然这些方法的实际程序代码可能是在这个对象之外的程序库单元中 但这些方法仍然在这个对象的范围内 因为它们是在这个对象的说明部分中说明的
当您在一个对象的事件处理过程中编写程序代码来访问这个对象的属性值 方法或域时 您不需要在这些标识符之前加上这个对象变量的名称 例如 如果您在一个新窗体上加入一个按钮和一个编辑框 并为这个按钮编写OnClick事件处理过程
procedure TForm Button Click(Sender:Tobject); begin Color :=clFuchsia; Edit Color :=clLime; end;
其中的第一行语句是为整个窗体Form 着色 您也可以编写如下 Form Color :=clFuchsia;
但您可以不必加上Form 因为Button Click方法是在TForm 对象的范围里 当您在一个对象的范围中时 您可以省略所有这个对象中的属性值 方法 域之前的对象标识符 但是当您编写第二个语句改变编辑框的底色时 因为此时您想访问的是TEdit 对象的Color属性 而不是TForm 类型的 所以您需要通过在属性前面加上编辑框的名称来指明Color属性值的范围 如果不指明 Delphi会象第一个语句一样 将窗体的颜色变成绿色 因为Edit 部件是在窗体中的 它是窗体的一个数据域 所以您同样不必指明其从属关系
如果Edit 是在其他窗体中 那么您需要在编辑框之前加上这个船体对象的名称了 例如 如果Edit 是在Form 之中 那它是Form 说明的一个数据域 并位于Form 的范围中 那么您需要将第二句改为
Form Edit Color := clLime;
而且需要把Unit 加入Unit 的uses子句中
lishixinzhi/Article/program/Delphi/201311/24965
DELPHI基础教程:Delphi图形图像编程(一)[1]
在Delphi中 专门定义了一组对象和部件用以绘制图形 完成一些简单的图像功能 利用这些对象 部件的方法 可以方便地绘制各种常用图形 通过设置它们的属性 能得到不同风格的图形 另外 通过对鼠标事件的定义 可以方便的设计图形绘制程序
本章将介绍以下内容
TCanvas TPen TBrush TColor对象的方法及属性
绘图功能的实现
TImage TPicture TBitBtn TBitmap部件的方法及属性
图像观测及处理
Graphex dpr是一个简单的图形图像应用程序 是对以上这些对象和组件的具体应用 本章将结合此程序进行讲述
图形对象概述
TCanvas Object(画布对象)
TCanvas对象是一个用于绘图的表面 在这个区域上 程序可实现各种绘图功能 很多部件(如TIMage TMemo)的Canvas属性就是TCanvas对象 在部件上绘制图形就是在部件的画布上绘制 TCanvas的Brush Pen Font属性分别是TBrush TPen TFont对象 它们用于定义绘制图形的风格 关于TBrush TPen对象 下节中将详细介绍
画布的笔的位置定义在PenPos属性中 可用MoveTo方法来移动笔 如果要在画布上输出文本 可用Textout方法
TCanvas有对象很多方法 可完成常用的绘图功能 现将方法及功能简介
Arc Arc(x y x y x y x y : Integer)
Arc方法在椭圆上画一段弧 椭圆由(x y ) (x y ) 两点所确定的椭圆所决定 弧的起点是椭圆圆周和椭圆中心与(x y )连线的交点 弧矩形终点是椭圆圆周和椭圆中心与(x y )连线的交点 以逆时针方向画弧
Chord Chord(x y x yx x y x y : Integer)
Chord方法连接椭圆上的两点 椭圆由(x y ) (x y ) 两点所确定的矩形决定 (x y )是始点 (x y )是终点
Brushcopy Brushcopy(const Dest : TRect;Bitmap : TBitmap;const Source TRect;Color : TColor)
Brushcopy方法把位图的一部分复制到画布的某个矩形区域 并用画笔的当前颜色替换位图的颜色 参数Dest定义画布的一个矩形区域 该矩形用以填充位图 Bitmap定义位图 Source定义位图中的矩形区域 该区域上的位图将被复制 Color定义画笔中 用以替换位图的颜色
CopyRect CopyRect(Dest : TRect;Canvas : TCanvas; Source TRect)
此方法从另一个画布对象上复制部分图像到该画布 Canvas表示源画布 Source是源画布上要复制的图像区域 Dest表示目标画布上将接受复制图像的矩形区域
Draw Draw(x y : Integer;Graphic : TGraphic)
此方法在画布给定的象素点坐标(x y)处画Graphic所给的图像 该图像可以是位图 图标或元位图
Ellips Ellips(x y x y : Integer)
Ellips方法在画布指定的矩形边界上画一个椭圆 (x y )是矩形左上角的象素坐标 x y 是矩形右下角的象素坐标 如果矩形形成一个区域 将出现一个椭圆
LineTo LineTo(x y : Integer)
LineTo从当前位置画一条线至(x y)所指定的位置 并把笔的位置移至(x y)
MoveTo MoveTo(x y : Integer)
MoveTo 将笔的当前位置设置到点(x y)处 笔的当前位置在PenPos属性中 改变笔的当前位置使用MoveTo方法 不要设法改变PenPos的值
Die Die(x y x y x y x y : Longint)
Die方法绘制椭圆的一部分 椭圆由点(x y ) (x y )所指定的矩形所决定 制的那部分由椭圆中心到(x y ) (x y )两点的两条辐射线所决定
Polygon Polygon(Points : array of TPrint)
Polygon方法在画布上绘制一系列的点 各点依次连成线 最后将首尾两点相接形成一个区域 并用当前笔刷填充此区域
Polyline Polyline(Ports : array of TPort)
Polyline方法在画布上用当前画笔绘制一系列的点 各点依次连成线
StretchDraw StretchDraw(Const Rect : TRcct : Graphic : TGraphic)
此方法在Rect参数指定的矩形内画一图像 图像延伸改变大小以适应矩形
Rectangle Rectangle(X y x y : Integer)
Rectangle方法在画布上用当前画刷绘制矩形 (x y )是矩形的左上角 (x y )是矩形的右下角
RomlRect RomlRect((x y x y x y : Integer)
DrawFocuseRect
DrawFocusRect(Const Rect : TRect)
此方法绘制一矩形以指示此矩形获得焦点 此方法是异或(XOR)函数 第二次调用时原有矩形将消失 DrawFocuseRect绘制的矩形不能滚动 要实现滚动功能则先调用此方法使矩形消失 待滚动过后重新绘制
lishixinzhi/Article/program/Delphi/201311/25247
在Delphi编程中使用C语言代码[2]
三:在Delphi中直接链接C语言的OBJ文件
这种方法的好处在于最终EXE不用带任何外部文件 也不用对C语言过于熟悉
我们都知道 代码在编译成可执行文件(或DLL OCX文件 下同)之前 都必须得先生成OBJ文件(DELPHI一般是DCU文件 但也可以通过编辑编译选项生成OBJ文件) 然后把OBJ文件和资源文件(* RES)链接成最终的可执行文件 利用这个方法 我们可以直接把OBJ文件链接到我们的程序里面
不过需要注意的是 编译器不同 生成的OBJ文件也不一样 Microsoft的编译器生成的OBJ文件是COFF格式 而Borland的C++Builder生成的是OMF格式 因为我们需要在Delphi中链接 所以必须使用CBC 或者Borland官方站点带的免费编译工具 下面我们通过一个简单的例子来说明具体操作步骤:
这个例子是简单的提供一个函数 用来判断一个文件是否为Dat格式的VCD文件 头文件声明如下:
以下是引用片段 /* 文件名称:DatFormat h */ #ifndef DatFormat_H #define DatFormat_H #include #pragma pack(push )//这个与下面的配对 一般用到记录类型的时候需要定义 这里实际不用 #ifdef __cplusplus extern C { #endif extern BOOL CheckIsDatFile(const char * FileName BOOL *IsDatFile); #ifdef __cplusplus } #endif #pragma pack(pop) #endif // DatFormat_H 具体实现代码DatFormat c如下: #include DatFormat h BOOL CheckIsDatFile(const char * FileName BOOL *IsDatFile) /* 函数说明:该函数用于判断一个文件是否为Dat文件(即VCD文件)格式 参数: IN: FileName:欲判断的文件名称 IN OUT: IsDatFile:是否为Dat格式文件 OUT: 读文件失败返回FALSE 否则返回TRUE 作者:陈经韬 // soft lovejingtao@ cn */ { HANDLE hFile; DWORD dwBytesRead; BOOL re; char MyBuf[ ]; *IsDatFile=FALSE; //建立读文件句柄 hFile = CreateFile(FileName GENERIC_READ FILE_SHARE_READ NULL OPEN_EXISTING ); if (hFile == INVALID_HANDLE_VALUE) return FALSE; //读文件 re = ReadFile(hFile &MyBuf &dwBytesRead NULL); if (dwBytesRead!= ) { CloseHandle(hFile); return FALSE; } //读文件失败的时候 if (re!=TRUE) { CloseHandle(hFile); return FALSE; } CloseHandle(hFile); *IsDatFile=(MyBuf[ ]== R && MyBuf[ ]== I && MyBuf[ ]== F && MyBuf[ ]== F ); return(TRUE); }
lishixinzhi/Article/program/Delphi/201311/24759
DELPHI基础教程:Delphi拖放编程[1]
拖放(DragDrop)是Windows提供的一种快捷的操作方式 作为基于Windows的开发工具 Delphi同样支持拖放操作 而且开发应用系统的拖放功能十分方便 真正体现了Delphi的强大功能和方便性
Delphi提供的所有控件(Control 即能获得输入焦点的部件)都支持拖放操作 并有相应的拖放属性 拖放事件和拖放方法 下面我们先介绍控件的拖放支持 而后再给出开发拖放操作的一般步骤和应用实例
控件的拖放支持
拖放操作中控件可以分为源控件和目标控件两类 绝大部分控件既可以作为源控件也可以作为目标控件 但也有一部分控件只能支持其中的一种
拖放属性
拖放属性主要有两个
● DragMode : 拖动模式
● DragCursor : 拖动光标
它们都是在拖放的源控件中设置 DragMode控制用户在运行时间内当在控件上按下鼠标时控件如何反应 如果DragMode置为dmAutomatic 那么当用户在控件上按下鼠标时拖动自动开始 如果DragMode置为dmManual(这是缺省值) 则将通过处理鼠标事件来判断一个拖动是否可以开始
DragCursor用于选择拖动时显示的光标 缺省值是CrDrag 一般不要去修改它 在程序设计过程中通用的界面规范应该得到开发者的尊重 但有时候为了特定的目的 开发者也可以把自己设计的光标赋给DragCursor
拖放事件
拖放事件主要有三个
●OnDragOver:拖动经过时激发
●OnDragDrop:拖动放下时激发
●OnEndDrop :拖动结束时激发
前两个事件由目标控件响应 后一个事件由源控件响应
OnDragOver事件最主要的功能是确定当用户就地放下拖动时控件是否可以接受 它的参数包括
Source : TObject; {源控件}
X Y : Integer; {光标位置}
State : TDragState; {拖动状态}
var Accept : Boolean {能否接受}
TDragState是一个枚举类型 表示拖放项目与目标控件的关系
type
TDragState = (dsDragEnter dsDragLeave dsDragMove)
不同取值的意义如下表
表 DragState 的取值与意义
━━━━━━━━━━━━━━━━━━━━━━━━━━━
取 值 意 义
───────────────────────────
dsDragEnter 拖动对象进入一个允许拖动对象放下的控件中 为缺省状态
dsDragLeave 拖动对象离开一个允许拖动对象放下的控件
dsDragMove 拖动对象在一个允许拖动对象放下的控件内移动
━━━━━━━━━━━━━━━━━━━━━━━━━━━
用户可以利用提供的参数来确定放下的拖动是否可被接受 如
● 判断源控件类型
Accept := Source is TLabel;
● 判断源控件对象
Accept := (Source = TabSet )
● 判断光标位置
见( ) ( )中的例程
● 判断拖动状态
If (Source is TLabel) and (State = dsDragMove) then
begin
source DragIcon := New Ico ;
Accept := True;
end
else
Accept := False;
当Accept=True时 目标控件可以响应OnDragDrop事件 用于确定拖动被放下后程序如何进行处理
OnDragDrop事件处理过程的参数包括源控件和光标位置 这些信息可用于处理方式的确定
OnEndDrag事件是在拖动操作结束后由源控件来进行响应的 用于源控件进行相应的处理 拖动操作结束既包括拖动放下被接受 也包括用户在一个不能接受放下的控件上释放了鼠标 该事件处理过程的参数包括目标控件(Target)和放下位置的坐标 如果Target=nil 表示拖动项目没有被任何控件接受
在第 节将介绍的文件拖放移动 拖放拷贝操作中 如果操作成功 则文件列表框应更新显示内容 下面这段程序用于实现这一功能
procedure TFMForm FileListEndDrag(Sender Target: TObject; X Y: Integer)
begin
if Target <> nil then FileList Update;
end;
除以上介绍的三个事件外 还有一个事件OnMouseDown 也常用于拖放操作的响应 OnMouseDown虽然不是一个专门的拖放事件 但在人工模式下拖动的开始是在这一事件的处理过程中实现的
lishixinzhi/Article/program/Delphi/201311/25213