DELPHI基础教程:文本编辑器的设计(二)[3]

DELPHI基础教程:文本编辑器的设计(二)[3],第1张

       替换对话框部件

替换对话框部件为应用程序提供替换对话框 如图 它包括查找对话框的所有功能 此外还允许使用者更换被选中的字符串 FindText 属性是应用程序需查找的字符串 ReplaceText属性是被选中字符的替换字符串 Options 属性决定对话框的显示方式 其值如表 所示

与查找对话框一样 替换对话框亦有OnFind 事件 用户输入查找字符串并按FindNext按钮时 发生OnFind 事件 用户选择Replace 或ReplacAll 时 对话框发生OnRelpace事件 要替换的字符串存入ReplaceText属性中 要编写相应的代码以支持替换功能

表 替换对话框的Options属性的取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  取值                          含义

────────────────────────────────────────

frRelpace          如果是真值 应用程序将ReplaceText 属性中的字符串替换FindText属性中的字符串

frReplacAll        如果是真值 应用程序将ReplaceText属性中的字符串替换 查找到的所有FindText属性中的字符串

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

例程中TEditForm Replace方法响应OnReplace事件 Replace方法首先判断控制中被选中字符串是否与替换字符串相等 如果不等则进行替换 而后根据Options中的方式循环进行查找替换 直至无匹配字符串为止 其代码如下

procedure TEditForm Replace(Sender: TObject)

var

Found: Boolean;

begin

with ReplaceDialog do

begin

if AnsiCompareText(Memo SelText FindText) = then

Memo SelText := ReplaceText;

Found := SearchMemo(Memo FindText Options)

while Found and (frReplaceAll in Options) do

begin

Memo SelText := ReplaceText;

Found := SearchMemo(Memo FindText Options)

end;

if (not Found) and (frReplace in Options) then

ShowMessage( Cannot find + FindText + )

end;

end;

打开对话框部件

打开对话框部件为应用程序显示打开对话框 使用Execute方法可显示打开对话框用户通过选择文件类型下拉框中的文件类型 可以确定显示在文件列表中的文件 例如 如果用户选择 txt文件类型 那么只有在当前目录下的文本文件才会显示在文件列表中 文件扩展名通常也称为过滤器

打开对话框包含一个Filters(过滤器)的属性 它可确定文件类型和在文件类型下拉框中的顺序 应用程序可以为打开对话框定义多个过滤器 对话框的FilterIndex 属性可以决定哪个过滤器是文件类型下拉框中的缺省过滤器 如FilterIndex等于 表示程序运行时出现在文件类型下拉框的过滤器是第 个过滤器

例程中关于文件打开的代码如下

procedure TEditForm Open/Click(Sender : TObject)

begin

if OpenDialog/ Execult then

begin

Open(Open Dialog/ FileName)

end

end;

打开 保存对话框中的Options属性值见表

表 打开 保存对话框的Options属性取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

           值                   含义

──────────────────────────────────────

ofAllowMultiSelect     如果是真值 则允许在文件名列表中选择多个文件

ofCreatePrompt        如果是真值 当用户在文件编辑框中输入一不存在的文件名 并选择OK按钮 则会出现消息框 提示用户此文件不存在并询问是否以此文件名创建一新文件

ofExiengronDifferent 如果是真值 从对话框中返回的文件扩展名将不同于缺省扩展名 其值存入DefaultExt属性中

ofFileMustExist         如果是真值 当用户在文件编辑框中输入一个不存在的文件名时 并选择OK按钮 则会出现一消息框提示用户此文件不存 并询问是否输入了正确的路径和文件名

ofNoChangeDir        如果是真值 当前目录将设置成对话框第一次出现的目录 并忽略任何目录改变

ofOverWritePrompt  如果是真值 当用户试图保存一个已存在的文件时 将出现一消息框 提示用户此文件已存在 并询问是否覆盖

ofPathMastExit         如果是真值 用户在文件名编辑框只能输入有效路径名 否则出现消息框 提示用户路径无效

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

表 打开 保存对话框中的Options属性取值及含义

文件保存对话框与打开对话框类似 如图 它的Option属性见上表 例程在保存文件前先对文件进行读写判断 如果文件是只读文件或未指定文件名的新文件 则程序对文件不保存 否则备份文件 代码如下

procedure TEditForm Save Click(Sender: TObject)

procedure CreateBackup(const Filename: string)

var

BackupFilename: string;

begin

BackupFilename := ChangeFileExt(Filename BackupExt)

DeleteFile(BackupFilename)

RenameFile(Filename BackupFilename)

end;

function IsReadOnly(const Filename: string) Boolean;

begin

Result := Boolean(FileGetAttr(Filename) and faReadOnly)

if Result then MessageDlg(Format( %s is read only

[ExtractFilename(Filename)]) mtWarning [mbOK] )

end;

begin

if (Filename = ) or IsReadOnly(Filename) then

SaveAs Click(Sender)

else

begin

CreateBackup(Filename)

Memo Lines SaveToFile(Filename)

Memo Modified := False;

end;

end;

其中CreateBackup过程用以改变需备份文件的扩展名 IsReadOnly 用以判断文件属性

lishixinzhi/Article/program/Delphi/201311/25250

Sybase和MicroSoft SQL Server数据库

在建立Sybase或MicroSorft SQL Server的SQL Link时除了需要下列文件外 应用程序还需要Sybase数据库管理系统的客户端的连接产品与网络协议接口

表 建立Sybase数据库的SQL Link所需的文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

文件名  描 述

───────────────────────────

SQLD_SS DLL  BDE SQL Link for Sybase的驱动程序

SQLD_SS HLP  联机帮助文件

SQL_SS CNF  Sybase驱动程序的BDE配置文件

W DBLIB DLL  Sybase/MC SQL Server客户端的DLL文件

DBNMP DLL  Sybase/MC SQL Server客户端的DLL文件

SYDC LD  Sybase语言驱动程序

SYDC LD  Sybase语言驱动程序

━━━━━━━━━━━━━━━━━━━━━━━━━━━

Informix数据库

在建立Informix的SQL Link时除了需要下列文件外 应用程序还需要Informix数据库管理系统的客户端的连接产品与网络协议接口

表 建立Informix 数据库的SQL Link所需的文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

文件名   描 述

───────────────────────────

SQLD_ss DLL  BDE SQL Link for Informix的驱动程序

SQLD_INF HLP  联机帮助文件

SQL_INF CNF  Informix驱动程序的BDE配置文件

LDLLSQLW DLL  Informix客户端的DLL文件

ISAM IEM  Informix错误信息文件

OS IEM  Informix错误信息文件

RDS IEM  Informix错误信息文件

SECURITY IEM  Informix错误信息文件

SQL IEM  Informix错误信息文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

InterBase 数据库

在建立InterBase的SQL Link时除了需要下列文件外 应用程序还需要InterBase数据库管理系统的客户端的连接产品与网络协议接口

表 建立InterBase数据库的SQL Link所需的文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

文件名   描 述

───────────────────────────

SQLD_IB DLL  BDE SQL Link for InterBase的驱动程序

SQLD_IB HLP  联机帮助文件

SQL_IB CNF  InterBase驱动程序的BDE配置文件

CONNECT EXE  InterBase连接测试诊断工具

CONNECT HLP  InterBase连接测试诊断工具的帮助文件

GDS DLL  InterBase API DLL

REMOTE DLL  InterBase与网络的接口的DLL文件

INTERBASE MSG  InterBase错误信息文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25179

⑵ 定义处理过程类型

一旦你决定产生事件 就要定义事件如何被处理 这就是要决定事件处理过程的类型 在大多数情况下 定义的事件处理过程的类型是简单的通知类型(TNotifyEvent)和已定义的事件类型

通知事件只是告诉你特定的事件发生了 而没有描述什么时候和什么地方 通知事件使用时只带一个TObject类型的参数 该参数是Sender 然而所有通知事件的处理过程都知道是什么样的事件发生和发生在那个部件 例如 Click事件是通知类型 当编写Click事件的处理过程时 你知道的是Click事件发生和哪个部件被点按了 通知事件是单向过程 没有提供反馈机制

在某些情况下 只知道什么事件发生和发生在那个部件是不够的 如果按键事件发生 事件处理过程往往要知道用户按了哪个键 在这种情况下 需要事件处理过程包含有关事件的必要信息的参数 如果事件产生是为了响应消息 那么传递给事件的参数最好是直接来自消息参数

因为所有事件处理过程都是过程 所以从事件处理过程中返回信息的唯一方法是通过var参数 自定义部件可以用这些信息决定在用户事件处理过程执行后是否和怎样处理事件

例如 所有的击键事件(OnKeyDown OnKeyUp和OnKeyPressed)通过名为key的var参数传递键值 为了使应用程序看见包含在事件中的不同的键 事件处理过程可以改变key变量值

⑶ 声明事件

一旦你决定了事件处理过程的类型 你就要准备声明事件的方法指针和属性 为了让用户易于理解事件的功能 应当给事件一个有意义的名字 而且还要与部件中相似的属性的名称保持一致

Delphi中所有标准事件的名称都以 On 开头 这只是出于方便 编译器并不强制它 Object Inspector是看属性类型来决定属性是否是事件 所有的方法指针属性都被看作事件 并出现在事件页中

⑷ 调用事件

一般说来 最好将调用集中在事件上 就是说在部件中创建一个虚方法来调用用户的事件处理过程和提供任何缺省处理 当调用事件时 应考虑以下两点

● 必须允许空事件

● 用户能覆盖缺省处理

不能允许使空事件处理过程产生错误的情况出现 就是说 自定义部件的正常功能不能依赖来自用户事件处理过程的响应 实际上 空事件处理过程应当产生与无事件处理过程一样的结果

部件不应当要求用户以特殊方式使用它们 既然一个空事件处理过程应当与无事件处理过程一样动作 那么调用用户事件处理过程的代码应当象这样

if Assigned(OnClick) then OnClick(Self)

{ 执行缺省处理 }

而不应该有这样的代码

if Assigned(OnClick) then

OnClick(Self)

else

… { 执行缺省处理 }

对于某些种类的事件 用户可能想取代缺省处理甚至删除所有的响应 为支持用户实现这种功能 你需要传递var参数给事件处理过程 并在事件处理过程返回时检测某个值 空事件处理过程与无事件处理过程有相同作用 因为空事件处理过程不会改变任何var参数值 所以缺省处理总是在调用空事件处理过程后发生

例如在处理Key Press事件 用户可以通过将var参数key的值设置为空字符(# )来压制部件的缺省处理 代码如下

if Assigned(OnkeyPress) then OnkeyPress(Self key)

if key <> # then { 执行缺省处理 } ;

实际的代码将与这稍有不同 因为它只处理窗口消息 但处理逻辑是相同的 在缺省情况下 部件先调用任何用户赋予的事件处理过程 然后执行标准处理 如果用户的事件处理过程将key设为空 则部件跳过缺省处理

处理消息

在传统Windows编程中 一个很关键的方面是处理Windows发送给应用程序的消息 Delphi已经帮你处理了大多数的普通消息 但是在创建部件的过程中有可能Delphi没有处理方法 得由自己处理消息 也可能创建了新的消息需要处理它们

学习掌握Delphi的消息处理 要掌握以下三个方面

● 理解消息处理系统

● 修改(改变)消息处理方法

● 建立新的消息处理方法

理解消息处理系统

所有的Delphi对象内部具有处理消息的机制 如调用消息处理方法或消息处理过程 消息处理的基本思想是对象接收某种消息并派送它们 这是通过调用与接收的消息相应的方法来实现的 如果没有相应于消息的指定的方法 那就调用缺省处理 下面的图解表示消息派送系统

Delphi部件库定义了将所有Windows消息(包括用户自定义消息)直接转换到对象方法调用的消息派送系统 一般没有必要改变这种消息派送系统 只要建立消息处理方法

⑴Windows消息中有什么?

Windows消息是包含若干有用的域的数据记录 记录中最重要的是一个整型大小的值 该值标识消息 Windows定义了大量的消息 库单元Messages声明了所有消息的标识 消息中其它的有用信息包括两个域参数和结果域 两个参数分别是 位和 位的 Windows代码总是以wParam和lParam来引用它们

最初 Windows程序员不得不记住包含的每一个参数 现在 微软公司已经命名了这参数 这样理解伴随这些消息的信息就更简单了 例如 WM_KEYDOWN消息的参数被称为vkey和keydata 这就比wParam和lParam给出了更多的描述信息

Delphi为不同类型的消息定义了指定的记录类型 如鼠标消息在long参数中传递鼠标事件的x y座标 一个在高字 一个在低字 使用鼠标消息记录 你不需要自己关心哪个字是哪个座标 因为引用这些参数时通过名子Xpos和Ypos取代了lParamLo和lParamHi

⑵ 派送方法

当应用程序创建窗口时 在Windows Kernel中注册了一个窗口过程 窗口过程是处理窗口消息的函数 传统上 窗口过程包括了Case表达式 表达式的每个入口是窗口要处理的每一条消息 当你每次创建窗口时 必须建立完整的窗口过程

Delphi在下列三方面简化了消息派送

● 每个部件继承了完整的消息派送系统

● 派送系统具有缺省处理 用户只需定义想响应的消息的处理方法

● 可以修改消息处理的一部分 依靠继承的方法完成大多数处理

这种消息派送系统的最大优点是用户能在任何时候安全地发送任何消息给任何部件 如果部件没有为该消息定义处理方法 那缺省处理方法会解决这个问题 通常是忽略它

Delphi为应用程序每种类型的部件注册了名为MainWndProc的方法作为窗口过程 MainWndProc包含了异常处理块 它完成从Windows到名为WndProc的虚方法传送消息记录 并且通过调用应用程序对象的HandleException方法处理异常

MainWndProc是静态方法 没有包含任何消息的指定处理方法 定制过程发生在WndProc中 因为每个部件类型都能覆盖该方法以适合特定的需要

WndProc方法为每个影响它们处理的任何条件进行检查 以捕捉不要的消息 例如 当被拖动时 部件忽略键盘事件 因此 inControl的WndProc只在没有拖动时传送键盘事件 最后WndProc调用Dispatch方法 该方法是从TObject继承来的静态方法 决定什么方法来处理消息

Dispatch使用消息记录的Msg域来决定怎样派送特定消息 如果部件已经给该消息定义了处理方法 则Dispatch调用该方法 反之 Dispatch调用缺省处理方法

改变消息处理方法

在改变自定义部件的消息处理方法之前 先要弄清楚你真正想要做什么 Delphi将大多数的Windows消息转换成部件编写者和部件用户都能处理的事件 一般来说 你应当改变事件处理行为而不是改变消息处理行为

为了改变消息处理行为 要覆盖消息处理方法 也能提供捕获消息防止部件处理该消息

⑴ 覆盖处理方法

为了改变部件处理特定消息的方法 要覆盖那个消息的处理方法 如果部件不处理该消息 你就需要声明新的消息处理方法

为了覆盖消息处理方法 要在部件中以相同的消息索引声明新的方法 不要使用override指令 你必须使用Message指令和相应的消息索引

例如 为了覆盖一个处理WM_PAINT消息的方法 你要重声明WMPaint方法

type

TMyComponent=class(…)

procedure WMPaint(var Message: MPaint) message WM_PAINT;

end;

⑵ 使用消息参数

在消息处理方法内部 自定义部件访问消息记录的所有参数 因为消息总是var参数 如果需要的话 事件处理过程可以改变参数的值 Result域是经常改变的参数 Result是Windows文档中所指的消息的返回值 由SendMessage返回

因为消息处理方法的消息参数的类型随着被处理的消息的变化而变化 所以应当参考Windows消息文档中的参数的名字和含义 如果出于某种原因要使用旧风格的消息参数(wParam lParam) 可以配合通用类型TMessage来决定Message

⑶ 捕获消息

在某种情况下 你可能希望自定义部件能忽略某种消息 就是说 阻止部件将该消息派送给它的处理方法 为了那样来捕获消息 可以覆盖虚方法WndProc

WndProc方法在将消息传给Dispatch方法前屏蔽该消息 它依次决定哪一个方法来处理消息 通过覆盖WndProc 部件得到了派送消息之前过滤它们的机会

通常 象下面这样覆盖WndProc:

procedure TMyControl WndProc(var Message: TMessage)

begin

{ 决定是否继续处理过程 }

inherited WndProc (Message)

end;

下面的代码是TControl的WndProc的一部分 TControl定义整个范围内的鼠标消息 当用户拖动和放置控制时 它们将被滤过

procedure TControl WndProc(var Message:TMessage)

begin

if (Message Msg >= WM_MOVSEFIRST) and

(Message Msg <= WM_MOUSELAST) then

if Dragging then

DragMouseMsg(MMOUSE(Message)) { 处理拖动 }

else

…   { 正常处理其它 }

…   { 否则正常处理 }

end;

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25120

基于数据库表的有效性验证

在用户创建数据库表时就建立有效性验证机制 如在使用DBD创建一个表时 我们可以为创建的数据库表说明一些验证手段 包括字段的最大值 最小值 图形字段的显示格式等等 在设定这些有效性验证机制时 不需要编写任何程序代码 基于数据库表的有效性验证是当数据写到数据库之前 由数据库本身来执行 Delphi也执行一些有效性验证 如在数据写到数据库之前Delphi会验证每一个字段是否被填入相应的值 有关这种途径来验证数据的有效性的详细情况请参考DBD的使用

基于字段的有效性验证

一般有两种方法来进行这种方式的有效性验证

①为记录中需要设置有效性验证的字段编写Onvalidate事件处理过程 这样每当该字段的值被修改时 该字段的OnValidate事件处理过程就会被调用 进而对被修改的字段值进行验证

②对于记录中要求非空的字段(如口令或关键字等) 我们必须首先设置这些字段的Required属性为True 然后为这些字段编写OnValidate事件处理过程 这样在修改现存记录或插入新记录时 在写入数据库之前 如果要求非空的字段中没有填入适当的字段值 那么会出现错误信息提示用户必须输入字段值

基于记录的有效性验证

这种验证方式一般在TTable部件的BeforePost事件处理过程中进行处理 即在记录写回到数据库之前对记录的每个字段值进行有效性验证

例 在程序中对字段值的有效性进行验证

创建一个用TEdit部件浏览ORDERS DB表的应用 如图 所示

修改TDataSource部件的AutoEdit属性为True

双击TTable部件打开字段编辑器Fields Editor 并单击SaleDate字段

在Object Inspector中双击SaleDate字段对象的OnValidate事件 为该字段对象编写事件处理过程如下

TForm Table SaleDateValidate(Sender:TField)

begin

If SaleDate Value>Now then

raise Exception Create( 不能输入一个未来的日期 )

end;

当这个应用程序运行时 用户修改或插入ORDERS DB中的记录时 该应用程序会对销售日期(SaleDate)字段的值进行验证 该字段值不能晚于系统的当前日期 程序中调用Now方法获得系统的当前日期 如果字段值大于系统的当前日期会出现一错误信息提示框 告知用户不能输入一个未来的日期

使用TDBComBox部件和TDBLookupComBox部件来限制用户输入字段值的范围

创建查看orders db表的应用 窗体中显示Terms 字段的是TDBComBox部件 显示EmpNo字段的是TDBLookupComBox部件

TDBComBox和TDBLookupComBox部件的属性值如表 所示

表 窗体中各部件的属性设置

━━━━━━━━━━━━━━━━━━━━━━━━━━━

部 件 属 性 属 性 值

───────────────────────────

DataField Terms

DBComBox DataSource DataSource

Items Prepaid

Net

COD

───────────────────────────

DataField EmpNo

DataSource DataSource

DBLookupComBox LookupSource DataSource

KeyField EmpNo

LookupField EmpNo

───────────────────────────

DataSource DataSet Table

AutoEdit True

───────────────────────────

DataSource DataSet Table

AutoEdit True

───────────────────────────

Table DatabaseName DemosDB

TableName orders db

───────────────────────────

Table DatabaseName DemosDB

TableName orders db

━━━━━━━━━━━━━━━━━━━━━━━━━━━

该应用运行时 当用户修改和插入记录到ORDERS DB表中时 Terms字段的值可以从组合框中的Prepaid Net COD三个值中任选 EmpNo字段的值是从另一个表Employee中获得的雇员号码 用户可以从中选择

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25166

响应鼠标事件

鼠标常被用作绘图的工具 应用程序利用鼠标位置的变化来绘制各种不同的图形 鼠标有三个动作 鼠标按钮按下 鼠标移动 鼠标按钮d起 在Delphi中 对应三个动作有三个不同的事件 OnMouseDown OnMouseMove OnMouseUp

当Dlephi应用程序探测到一个鼠标动作时 它传递五个参数 并调用相应的事件响应

程序员可利用这些参数来定义事件程序 五个参数如下表 :

表 鼠标事件的五个参数

━━━━━━━━━━━━━━━━━━━━━━━━━━━

参数               含义

──────────────────────────

Sender    探测鼠标动作的对象

Button    涉及的鼠标按钮 左键 中键 右键

Shift        鼠标动作时 Alt Ctrl Shift按钮的状态

X Y          事件发生时鼠标的坐标

━━━━━━━━━━━━━━━━━━━━━━━━━━━

当鼠标按下时发生OnMouseDown事件 举一个简单例子来说明程序如何对该事件进

行响应 假如我们想在鼠标按下的地方出现 Here

响应鼠标的OnMouseDown事件

可在该事件中调用TextOut方法

procedure TForm FormMouseDown(Sender: TObject Button: TMouseButton;

Shift : TShifState; X Y : Integer)

begin

Canvas TextOut(X Y Here! )

end;

用户放松鼠标键时发生OnMouseUp事件 该事件发生时 鼠标到达的对象并不一定是鼠标键按下时鼠标所在的对象 例如 用户可在窗体之外画一条线段 (鼠标在窗体外 线段在窗体内) 下面的代码可用鼠标绘制直线

procedure TForm FormMouseDown(Sender:TObject)

begin

Moveto(x y)

end;

procedure TForm FormMouse Up(Sender:Tobject)

begin

Lineto(X Y)

end;

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25249

在这一章里我们主要介绍Delphi的数据访问部件的层次结构 多部件之间的关系 部件的属性 方法 事件以及各部件的应用 这些部件包括

● TSession部件

● 数据集部件(TTable和TQuery)

● TDatasource部件

● 字段对象TField

● 字段编辑器的使用

● TReport部件和TBatchMove部件

我们对这些部件的属性 方法和事件进行一般性的描述 读者在实际使用Delphi开发应用程序时 还可以通过联机帮助获得有关部件更详细的信息

Delphi数据访问部件的层次结构

Delphi提供了强大的开发数据库应用程序的能力 它给用户提供了大量的数据访问部件 以方便程序设计人员开发数据库应用程序 这些部件中 有些部件继承了另一些部件的属性 方法和事件 也就是说多部件之间存在着继承和被继承的关系 各部件的这种关联便构成了一个层次结构

TSession是全局性的部件 在应用程序运行时 它自动地建立 在设计阶段和运行过程中它是一个不可见的部件

TDatabase部件是为开发客户/服务器数据库应用程序时 设置登录的数据库的有关参数的 它在数据访问部件页上

TDataset部件是不可见的 TTable和TQuery部件是由它派生而来的 这两个部件一般被称为数据集部件 它们在数据访问部件页上

TDatasource部件是连接数据集部件和数据浏览部件的桥梁 它在数据访问部件页上

TFields部件对应于数据库表中的实际字段 它既可以在应用程序的运行过程中动态地生成也可以在程序设计阶段用字段编辑器创建 它是不可见的部件 在程序中我们可以通过TField部件来访问数据库记录的各个字段值

Tsession部件及其应用

TSession部件一般用得较少 但它对于一些特殊的应用是很有用的 在每一个数据库应用程序运行时Delphi自动地创建一个TSession部件 程序设计人既不能看见该部件也不能显示地创建一个TSession 部件 但是我们可以在应用程序中全局性地使用TSession部件的属性 方法

TSession部件的重要属性及作用

TSession部件的许多重要属性是用于控制数据库应用程序与数据库的连接的 在一个应用程序中 可以全局性地设置TSession的有关属性值 对与之相连接的磁盘上的数据库进行控制 TSession部件主要有下列属性

Database属性 是TSession中可以进行连接的所有数据库的数据库名字列表 这些数据库的名字常常是实际数据库的别名 包括数据库的路径 用户名 用户登录口令等参数

DatabaseCount属性 是TSession中可以进行连接的所有数据库的数量 它是一个整数

KeepCounnections属性 是一个布尔型属性 用它说明应用程序是否保持与一个非活动数据库的连接 因为对于一个数据库 当该数据库中没有相应的数据集部件(TTable或TQuery)被打开时 该数据库将自动地变成非活动的数据库 缺省情况下 KeePcounnections的值是True 就是说应用程序总是保持着与数据库的连接 即使数据库变成了非活动的数据库时 也是如此 如果将KeepConnections属性设置成False 那么当数据库由活动状态变成非活动状态时 应用程序与该数据库的连接也随之中断

NetFileDir属性 说明BDE网络控制文件的路径名

PrivateDir属性 说明存取临时文件的路径名

TSession部件的方法

TSession部件中的大部分方法是用于向用户提供与应用程序相连接的数据库的信息 如数据库的名字及别名 数据库中的表名以及数据库引擎BDE的有关参数等 在设计数据库应用程序时 想要获取有关数据库的信息 调用TSession部件的下列方法 将会大大简化程序的设计

GetAliasNames方法 调用该方法 我们可以获得数据库引擎BDE中定义的数据库别名

GetAliasParams方法 该方法主要用于获取我们在BDE中定义数据库别名时所说明的参数值 如BDE所在的目录路径以及实际名称等

GetDatabaseNames 方法 调用该方法可以帮助我们获得当前应用程序可以进行连接的所有数据库的名字 数据库的名字是用户使用BDE工具定义的实际数据库的别名

GetDriverNames方法 数据库引擎BDE可以与多种数据库管理系统相连接 如客户/服务器数据库管理系统Oracle Sybase以及本地数据库管理系统dBASE Paradox等 BDE与每一种数据库管理系统进行连接时 都有相应的驱动程序 而且这些驱动程序都可以选择地安装 通过调用GetDriverNames方法 我们可以获得当前BDE安装的数据库驱动程序的名字

GetDriverParams方法 BDE的数据库驱动程序中包含着多个参数 如支持的民族语言 DBMS的版本号 文件块大小等 对于服务器上的DBMS 还有数据库服务器的名字等等

GetTableNames方法 因为每一个数据库都是由多个数据库表组成的 我们通过说明数据库名 然后调用GetTableNames方法 便可以获得该数据库中全部的数据库表的名字

上述这些方法在调用时都需要一个字符串列表作为参数 而且都返回一个字符串列表的值

TSession部件还有一个叫DropConnections的方法用于控制应用程序与数据库的连接 当调用DropConnections方法时 应用程序与所有的数据库的连接将会切断

TSession部件应用举例

例 :我们创建一个应用程序 通过调用TSession有关的方法获取当前应用程序可以进行连接的数据库的名字以及获取其中任意一个数据库中的全部数据库表的名字

通过TSession部件获取数据库的有关信息

窗体中主要使用了两个列表框 其中列表框DatabaselistBox用于显示数据库的名字 列表框TablelistBox用于显示数据库中的表名 程序运行完后数据库的名字显示在DatabaselistBox列表框中 当用户单击DatabaselistBox列表框中的数据库名时 该数据库全部的数据库表的名字将会显示在TablelistBox列表框中 有关的程序代码如下

lishixinzhi/Article/program/Delphi/201311/25161

以上就是关于DELPHI基础教程:文本编辑器的设计(二)[3]全部的内容,包括:DELPHI基础教程:文本编辑器的设计(二)[3]、DELPHI基础教程:Delphi开发数据库应用程序概述(二)[4]、DELPHI基础教程:Delphi自定义部件开发(二)[4]等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9841533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存