当前位置:首页 » 花卉百科 » 郁金香delphi外挂编程高级实例系列大型培训视频教程

郁金香delphi外挂编程高级实例系列大型培训视频教程

发布时间: 2023-04-29 05:02:50

⑴ DELPHI基础教程:Delphi开发数据库应用程序概述(一)[4]

值得指出的是在绝大多数数据库应用中 一般都是使用数据集部件TTable TQuery或TStoredProc与磁盘上的数据库进行连接 用TDataSource部件连接数据控制部件和数据集部件 当然用户也可以自定义数据集部件 用于数据库应用当中 TTable TQuery 和TStoredProc部件中都包含一个不可见的TField类型的对象Fields Fields是一个串列表 它对应于数据库表或一个查询结果的列或字段 Fields对象是伴随着TTable TQuery 和TStoredproc部件的活动状态动态地建立的 当数据库表被关闭时 Fields 对象也随之消失 它在程序设计和程序运行过程中都是不可见的

当然也可以利用Fields Editor建立永久性的Fields对象供Delphi应用程序使用 我们将在后面的内容中详细阐述

TTable部件

利用TTable部件程序设计人员甚至可以不需要编写任何程序便可对数据库进行访问 在一个应用程序窗体中放置一个TTable部件的过程如下

在部件选择板上选择Data Access页

单击Table图标

在窗体内单击鼠标 获得一个TTable部件

为TTable部件设置有关的属性

DatabaseName属性指定要访问的数据库所在的路径名 路径名可以用别名来表示

TableName属性指定要访问数据库中具体的数据库表

Active属性设置为True时 表示打开要访问的数据库表 设置为False时 暂时不打开要访问的数据库表

缺省情况下 TTtable部件中包含了要访问的数据库表中所有的字段和记录 用鼠标双击TTable图标时 会出现一个字段编辑器(Fields Editor) 使用Fields Editor可以对TTable部件中包含的数据库表中的字段的显示格式等属性进行编辑 具体可以控制

● 建立一个永久性的字段列表 包括字段的顺序 字段的类型等 即使磁盘上实际的数据库表的表结构发生了改变 我们建立的这个永久性的字段列表也不会发生改变

● 为每个字段指定一个便于阅读和使用的名字

● 指定字段显示的顺序

● 为每个字段指定一个用于显示的字符串

● 为字段增加合法性检验

● 为了显示的需要还可以建立新的字段(如可计算的字段)具体的使宏陵绝用方法见后面的内容

TQuery部件

TQuery部件是我们使用SQL语言开发数据库应用程序的有力工具 因为使用SQL语言 我们可以非常方便灵活地对一个或多个数据库表中的记录进行访问 所以利用TQuery我们可以查询本地的数据库如Pà?aradox和dBASE数据库系统中的数据 我们还可以使用TQuery部件对一个远地的数据库SQL服务器进行访问 建立Client/Server模式的应用程序

在一个应用程序窗体中放置一个TQuery部件的过程蔽姿如下

在部件选择板汪正上选择Data Access页

单击Query图标

在窗体内单击鼠标 获得一个TQuery部件

为TQuery部件设置有关的属性

DatabaseName属性指定将要访问的数据库的路径名

SQL属性指定对数据库表进行访问SQL语句 它可以是一条查询语句也可以是一条修改语句或插入语句等 在对象浏览器上 单击SQL属性时 会打开一个字符串编辑器供程序设计者输入SQL语句

在这里要注意在TQuery部件中 不是用TableName 属性来指定要访问的数据库中的数据库表 而是在SQL属性中 通过SQL语句来指定将要访问的数据库表

TDataSouece部件

TDataSource部件是连接数据集部件TTable TQuery TStoredProc 和数据控制部件TDBGrid TDBEdit等的桥梁 TTable TQuery TStoredProc部件通过BDE可以实现与磁盘上的数据库连接即访问 但它们本身不能显示数据库中的数据信息 而数据控制部件如TDBGrid TDBEdit等能够提供可视化的界面 显示数据库中的数据信息 但它们不具备访问磁盘数据库的能力 正是TDataSource将这两者有机地结合起来 使得用户才能交互地对数据库中的数据信息进行查询 修改 插入 删除等操作

在应用程序窗体中放置TDataSource部件的过程如下

在部件选择板上选择Data Access页

单击DataSource图标

在窗体内单击鼠标 获得一个TDataSource部件

为TDataSource部件设置有关的属性

Dataset属性指定一个数据集部件 可以是TTable TQuery或TStoredProc部件的名字

返回目录 DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

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

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

Oracle索引技术

ORACLE G数据库开发优化指南

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

C嵌入式编程设计模式

Android游戏开发实践指南

lishixin/Article/program/Delphi/201311/25181

⑵ 谁有郁金香delphi全套视频教程,原版免key的,谢谢啊!

某宝上去买吧,好像5元一套。

⑶ DELPHI基础教程:Delphi自定义部件开发(二)[4]

⑵ 定义处理过程类型

一旦你决定产生事件 就要定义事件如何被处理 这就是要决定事件处理过程的类型 在大多数情况下 定义的事件处理过程的类型是简单的通知类型(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(…)

procere WMPaint(var Message: MPaint) message WM_PAINT;

end;

⑵ 使用消息参数

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

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

⑶ 捕获消息

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

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

通常 象下面这样覆盖WndProc:

procere TMyControl WndProc(var Message: TMessage)

begin

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

inherited WndProc (Message)

end;

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

procere 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游戏开发实践指南

lishixin/Article/program/Delphi/201311/25120

⑷ DELPHI基础教程:数据访问部件的应用及编程(三)[4]

增加字段部件

字段编辑器Fields Editor中的Add Fields菜单项用于向数据集部件中增加字段部件的 单击Add Fields菜单项时便会打开增加字段部件对话框 如图 所示 Available Fields列表框中显示出数据集部件TTable或TQuery中当前可以用于创建永久字段部件的全部的字段 也就是说Available Fields列表框中显示字段是数据库表中实际存在的字段 而且还没有为这些字段创建相应的永久性的字段部件 在缺省状态下所有的字段都被选择用于创建相应的永久性的字段部件 用鼠标单击其中的字段名可以有选择地创建其相应的永久性的字段部件 选择好有关的字段名之后 单击OK按钮便可以创建永久性的字段部件

字段编辑器的增加字段部件对话框

删除字段部件

用字段编辑器Fields Editor为数据集部件创建好的字段部件都会显示在字段编辑器的Fields列表框中 如果用户认为其中的一些字段部件不合适或不再需要时 可以单击这些不需要的字段部件 然后单击鼠标右键弹出一佣弹出式菜单 从弹出式菜单中选择Delete菜单项 便可删除相应的字段部件 如果在弹出式菜单中单击Select All菜单项 然后选择Delete菜单项 这样会删除已创建好的所有的字段部件 某一个字段部件被删除以后 通过单击Add Fields菜单项可以重新创建 只是先前为该字段部件设定的一些属性将不复存在

定义新的字段部件

字段编辑器Fields Editor中的弹出式菜单中New Fields菜单项是用来为数据集部件TTable或TQuery创建用于显示目的的新的字段部件 我们可以用它来为数据库表中实际存在的字段创建新的字段部件(如改变字段的数据类型 使它的字段值被显示时不再需有关的类型转换) 但是我们使用New Fields菜单项创建新的字段部件主要是创建计算字段 计算字段并不与数据库表中实际存在的字段对应 它的字段值是根据表中其它的字段值计算而来的 具体的计算表达式由用户为TTable部件或TQuery部件的OnCalCFields事件编写程序代码时决定

定义(创建)计算字段的过程如下

单击字段编辑器中的New Fields菜单项 定义字段对话框如图 所示

在FieldName编辑框中输入新字段部件的名字 或者从下拉式列表框中选择一个已存在的字段部件的名字

在FieldType列表框中为新字段部件选择一个字段类型

单击Calculated检查框 确认定义的新字段部件是计算字段

单击ok按钮 创建上述定义的计算字段部件 此时该字段部件的名字会自动地加入到字滚搭段编辑中的Fields列表框中

创建新的计算字段

新的计算字段创建好了之后 它是没有任何字段值的 我们必须要编写相应的程序代码 根据数据库表中实际存在的字段的字段值为计算字段的宝定义字段值 我们为计算字段所在数据集部件的OnCalcFields事件编写代码来为计算字段赋值 其步骤如下

选择数据集部件TTable或TQuery

单击数据集部件的事件页

双击OnCalcFields事件为TTable或TQuery部件编写事件处理过程

TReport部件及其应用

在一般的数据库应用程序中都包含着为最终用户提供输出报表的功能 使用Delphi开发数据库应用程序时 可以使用一个叫TReport的部件来执行报表功能的 报表的具体格式和内容是由Delphi提供的一个专用报表生成工具ReprotSmith创建的 它报表的具体格式弯备虚和内容生成一个报表文件 然后为TReport部件设置相应的属性埋燃参数 由TReport部件执行报表功能

我们可以在设计阶段双击TReport部件 调用ReportSimith工具或者在Delphi程序组内双击ReportSmith图标来调用ReportSmith工具来创建一个报表文件 具体的操作步骤和设计方法请参看ReportSimth工具的使用说明

我们在使用TReport部件执行报表功能时 要设置TReport部件的一些的一些属性 这些属性是

ReportName属性 说明报表文件的名字 就是用ReportSmith创建的报表文件

ReportDir属性 说明报表文件所在的途径名

PreView属性 这是一个布尔型属性 若它的值为True 那么在执行报表功能时 只是在屏幕上显示报表 若它的值为False 则报表内容将在缺省的打印机打印出来

AutoUnload属性 布尔型属性 它的值为True时 在执行完一个报表功能后 自动地从内存中卸出ReportSmith工具 它的值为False时 在运行完一个报表功能后 不从内存中卸出ReportSmith工具 一般情况下 如果应用程序只有一个报表或者只有较少的报表要输出时 应设置AutoUnload属性为True 如果应用程序一次要输出多个报表 那么要应设置AutoUnload属性为False

InitialValues属性 这是一个字符串类型的属性 它是说明报表文件中使用的变量 每一条说明一个变量 如

ReportVAR := Value;

要详细了解创建和使用报表变量的过程请参看创建报表一节

TReport部件要真正执行报表功能以输出一个报表需要调用Run方法 如下所示

Report Run;

TReport部件所具有的重要方法如表 所示

表 TReport部件的方法

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

方法 功 能

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

Run 执行报表功能 输出报表

RunMacro 发送一个宏命令给Reportimith工具

Connect 预先连接报表文件和数据库 在输出报表时不需要登录到数据库

SetVariable 改变说明的报表变量

ReCalcReport 当报表变量改变以后 重新输出报表

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

还有一些其他的数据访问部件如TBatchMove部件 它主要用在两个数据库表之间移动或拷贝帆数据记录 具体的使用请参看本地SQL服务器的使用

应用举例 多个窗体显示同一个数据库表

在应用当中 我们常常需要以不同的视图显示同一个数据库表中的内容 例如要在两窗体中同时显示一个数据库表中一个记录的不同字段时 我们必须要想办法使两个窗体中的数据浏览部件同步地显示数据库表中的同一条记录的不同字段的值 要想做到以不同的视图显示同一个数据库表中的记录 下面两条规则是很重要的

● 多个TDataSource部件能够同时访问同一个数据集部件

● 在多个窗体中显示同一个表时 必须为每个窗体设置一个TDataSource部件 只须为其中的一个窗体设置一个TTable部件

例如 如果想在窗体Form 和Form 中同时显示一个数据库表的记录 最简单可行的办法是 为Form 和Form 各设置一个TDataSource部件叫DataSource DataSource 并在Form 中设置一个TTable部件Table 连接Form 中的Datasource 和Table 在程序运行过程中设置Form 中的DataSource 的DataSet属性为Form 中的Table 代码如下

Format DataSource Dataset := Form Table ;

这样 当Table 被打开时 两个窗体中便可以同步地显示数据库表中的同一条记录了

一个名叫OForms DPR的例子在C:DelphiDEMosDBTwoForms中(如果Delphi安装在其它的磁盘驱动器中 从相应的磁盘驱动器中可以找到该例子) 它演示了在两个窗体中显示同一个数据库表的记录 应用程序在第一个窗体中打开Contry DB表 并在窗体中显示Name Captial和Continent字段 在第二个窗体中显示Area和Population字段 在第一个窗体中有一个按钮用于打开第二个窗体 两个窗体中都有TDBNavigator部件 用于记录的导航

返回目录 DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

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

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

Oracle索引技术

ORACLE G数据库开发优化指南

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

C嵌入式编程设计模式

Android游戏开发实践指南

lishixin/Article/program/Delphi/201311/25156

⑸ DELPHI基础教程:开发Delphi对象式数据管理功能(五)[4]

BLOB字段与文本

Delphi BLOB字段中增加了大型文本的处理能力 可以在TBlobField和Strings中自由地交换数据

procere TBlobField LoadFromStrings(Strings: TStrings)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmWrite)

try

Strings SaveToStream(BlobStream)

finally

BlobStream Free;

end;

end;

procere TBlobField SaveToStrings(Strings: TStrings)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmRead)

try

Strings LoadFromStream(BlobStream)

finally

BlobStream Free;

end;

end;

BLOB字段与Stream对象

因为Delphi中 BLOB字段是通过BLOB流来访问的 所以可以很容易地在BLOB字段和Stream对象之间传递数据 为此 TBlobField对象提供了LoadFromStream和SaveToStream方法

procere TBlobField LoadFromStream(Stream: TStream)

var

伏姿旅BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmWrite)

try

BlobStream CopyFrom(Stream )

finally

BlobStream Free;

end;

end;

procere TBlobField SaveToStream(Stream: TStream)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmRead)

try

Stream CopyFrom(BlobStream )

finally

BlobStream Free;

end;

end;

存取嵌入在OleContainer对象中的OLE服务器的数据

对象链接和嵌入(Object Linking and Embedding 简称OLE) 是一组服务功能 它提供了一种用来源于不同应用程序的信缺凳息创建复合文档的强有力方法

通过把图像 图形 表格 声音 注解 文件和其它表示手段描述成对象 用它能在不同软件厂家提供的应用程序中更为容易地交换合成和处理数据它是应用程序的集成更为容易 OLE 支持直观编辑 用户不需切换到不同窗口就能在文档中直接对对象进行操作 改进了操作环境 用户不用再关注应用程序和操作环境 只需关注于使用对象技术的数据和文件 便能完成全部工作

OLE已成为操作系统功能上的一大标准 各大软商纷纷在开发工具中支持OLE 规范 Delphi 提供了OleContainer对象支持OLE窗户应用程序的开发

尽管通过OLE可以用来源于不同应用程序的信息创建复合文档 充分体现以任务 以文档为中心的思想 但是很难分解来自其它应用程序中的嵌入数据 以进行特殊的处理

例如 一套多媒体电子文档管理系统 系统需要数据库管理功能文档编辑功能 全文检索功能等 在文档编辑功能的实现上 如果能利用中文Word 或写字板之类的强大的编辑排版功能 就可以省却重新开发一个文档编辑的费用 使用具有直观编辑的OLE复合文档嵌入Word的DOC数据或RTF数据当然是最佳的选择册卖 但问题在于全文检索系统要求能直接在文档中搜索关键字 因此要求将文档数据从OLE嵌入数据或文档中的本地数据中分离出来

Delphi 的OleContainer部件支持存储OLE对象数据 OLE对象数据包括两部分 OLE类描述信息和OLE服务器嵌入数据 一般说来 OLE服务器嵌入数据是以服务器支持的数据格式存储的 比方说 中文Word 的嵌入数据的格式就是Word 文档的格式 因此 要将文档数据从OLE 嵌入式文档中分离出来就是要访问第二部分数据

我们分析了Delphi 的OleContainer对象存取复合文档的程序 得到分离数据的方法

让我们来看一段OleContainer对象存储数据的程序

procere TOleContainer SaveToStream(Stream: TStream)

var

DataHandle: HGlobal;

Buffer: Pointer;

Header: TStreamHeader;

R: TRect;

……

begin

……

try

……

if FOldStreamFormat then

begin

R := BoundsRect;

Header PartRect Left := R Left;

Header PartRect Top := R Top;

Header PartRect Right := R Right;

Header PartRect Bottom := R Bottom;

end else

begin

Header Signature := StreamSignature;

Header DrawAspect := FDrawAspect;

end;

Header DataSize := GlobalSize(DataHandle)

Stream WriteBuffer(Header SizeOf(Header))

Buffer := GlobalLock(DataHandle)

try

Stream WriteBuffer(Buffer^ Header DataSize)

finally

GlobalUnlock(DataHandle)

end;

finally

ReleaseObject(TempStorage)

ReleaseObject(TempLockBytes)

end;

end;

程序中 OleContainer对象执行了两次往流中写数据的操作

Stream WriteBuffer(Header Size(Header))

Stream WriteBuffer(Buffer^ Header DataSize)

前一语句是写入OLE类描述信息 后一句语句是写入OLE服务器的嵌入数据 Header是TStreamHeader记录类型的变量 TStreamHeader记录的定义如下

TStreamHeader = record

case Integer of

: ( { 新版OLE对象 }

Signature: Integer;

DrawAspect: Integer;

DataSize: Integer)

: ( { 旧版OLE对象 }

PartRect: TSmallRect)

end;

因此读OLE服务器嵌入数据时 要跳过文件头的TStreamHeader记录 下面就是如何分离OLE服务器嵌入数据的程序

var

Stream : TMemoryStream;

FileStream : TFileStream;

begin

Stream := TMemoryStream Create;

FileStream := TFileStream Create( TEST DOC fmCreate) ;

with OleContainer do

if (State <> osEmpty) then

SaveToStream(Stream)

Stream Seek(Sizeof(TStreamHeader) )

FileStream CopyFrom(Stream Stream Size SizeOf(TStreamHeader))

Stream Free;

FileStream Free;

end;

OleContainer 包含的服务器对象是中文Word 程序中将分离出的数据存储在磁盘文件 TEST DOC 上 如果希望存储在不同的媒介上 可以使用相应的Stream对象 分离的方法类似 但是 这种方法并非对所有的OLE服务器数据都适用 如Windows 附件中的写字板(WordPad)就不行

返回目录 DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

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

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

Oracle索引技术

ORACLE G数据库开发优化指南

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

C嵌入式编程设计模式

Android游戏开发实践指南

lishixin/Article/program/Delphi/201311/25091

⑹ 求delphi 入门教程 或者 视频

帮你找了几个,激宏看看吧,下载的则铅悔时候要是不能直接下,就用迅雷等下载

洪恩编程之道 delphi7-视频教程
http://znccw.com/Article/pc/biancheng/200703/2267.html
Delphi 2005 视频教程 设计师版
http://znccw.com/Article/pc/biancheng/200703/2266.html
Delphi经典编程入门 电子书
http://znccw.com/Article/pc/biancheng/200703/2240.html
《Delphi7从入门到精通》中文版 电子书
http://znccw.com/Article/pc/biancheng/200703/2239.html
delphi7.0视频教程 视频教孙正程
http://znccw.com/Article/pc/biancheng/200703/2237.html
Delphi编程入门篇视频教程 编程之道
http://znccw.com/Article/pc/shujuku/200703/2233.html
DELPHI程序设计视频教程 中山大学
http://znccw.com/Article/pc/biancheng/200703/2235.html

⑺ DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4]

Truncate方法

该方法是通过调用BDE API函数实现的 其实现如下

procere TBlobStream Truncate;

begin

if FOpened then

begin

Check(DbiTruncateBlob(FDataSet Handle FRecord FFieldNo FPosition))

FModified := True;

end;

end;

该方法从BLOB流的当前位置起删除所有数据 并设置修改漏乎标志FModified为True 在Delphi VCL中许多部件特别是数据库应用方面的部件都用BDE API函数完成对数据库的访问 如Data Access和Data Control部件 各种数据库部件都是BDE API函数外层的包装简化了对数据库的访问操作 BDE API中还提供了避开BDE配置工具在程序中直接处理Alias(建立 修改 删除等)的函数支持 这也是部件所没有提供的 在Delphi数据库应用安装程序中 这些Alias操作函数无疑是相当重要的 有关BDE API函数的详细介绍 可阅读Delphi Client/Server Suite所带的BDE API 帮助文件

读写对象的实现原理和应用

读写对象(Filer)包括TFiler对象 TReader对象和riter对象 TFiler对象是文件读写的基础对象 在应用程序中使用的主要是TReader和riter TReader和riter对象都直接从TFiler对象继承 TFiler对象定义了Filer对象的基本属性和方法

Filer对象主要完成两大功能

● 存取窗体文件和窗体文件中的部件

● 提供数据缓冲 加快数据读写操作

TFiler对象

TFiler对象是TReader和riter的抽象类 定义了用于部件存储的基本属性和方法 它定义了Root属性 Root指明了所读或写的部件的根对象 它的Create方法将Stream对象作为传入参数以建立与Stream对象的联系 Filer对象的具体读写操作都是由Stream对象完成 因此 只要是Stream对象所能访问的媒介都能由Filer对象存取部件 TFiler 对象还提供了两个定义属性的方法闷孙 DefineProperty和DefineBinaryProperty 这两个方法使对象能读写不在部件published部分定义的属性

因为Filer对象主要用于存取Delphi的窗体文件和窗体文件中的部件 所以要清楚地理解Filer对象就要清楚Delphi 窗体文件(DFM文件)的结构

DFM文件是用于Delphi存储窗体的 窗体是Delphi可视化程序设计的核心 窗体对应Delphi应用程序中的窗口 窗体中的可视部件对应窗口中的界面元素 非可视部件如TTable和TOpenDialog 对应Delphi应用程序的某项功能 Delphi应用程序的设计实际上是以窗体的设计为中心 因此 DFM文件在Delphi应用设计中也占很重要的位置 窗体中的所有元素包括窗体自身的属性都包含在DFM文件中

在Delphi应用程序窗口 界面元素是按拥有关系相互联系的 因此树状结构是最自然的表达形式 相应地 窗体中的部件也是按树状结构组织 对应在DFM文件中 也要表达这种关系 DFM文件在物理上 是以二进制方式存储的 在逻辑上则是以树状结构安排各部件的关系 Delphi编辑窗口支持以文本方式显示DFM文件 从该文本中可蚂搜链以看清窗体的树状结构 下面是DFM文件的文本显示

Object Form : TForm

Left =

Top =

ActiveControl = DBIMage

Object Panell: TPanel

Left =

Object DBLabel : TDBText

end

Object DBImage : TDBImage

end

end

Object Panel : TPanel

Left =

Object Label : TLable

end

end

Object Panel : TPanel

Left =

Object DBLabel : TDBText

end

end

end

关于DFM文件中存储属性值的规则 请参见自定义部件开发这一章

对照TFiler对象的属性 Root属性就表示部件树的根──窗体 Filer对象的许多方法都是读从根起始的树中所有的部件 Ancestor属性表示根的祖先对象 IgnoreChildren属性则是读部件时忽略根的子结点

下面介绍Filer对象的属性和方法

返回目录 DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

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

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

Oracle索引技术

ORACLE G数据库开发优化指南

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

C嵌入式编程设计模式

Android游戏开发实践指南

lishixin/Article/program/Delphi/201311/25103

⑻ DELPHI基础教程:SQL编程(一)[4]

利用参数编辑器(Parameter Editor)来为参数赋值

具体方法是 选中TQuery部件 单击鼠标右键 然后从中选择Define Parameters 便可以打开参数编辑器

例如 在TQuery部件的SQL属性中我们设置如下的SQL语句

Setect * From Customer Where CustNO=:Number;

TQuery的DatabaseName属性为DBDEMOS 其中Number为参数变量 我们便可以为参数Number赋值 在Datetype组合框中选择该参数的数据类型为整数Integer 在Value编辑框中可以为参数Number赋一个值 也可以单击Null Value检查框为参数Number赋一个空值Null 给参数赋值之后 单击OK按钮 这样TQuery部件中的SQL 查询便准备好了 而且参数值也被赋给了动态SQL语句中相应的参数 此时当把TQuery 部件的Active属性设置成True时 在与TQuery部件相连的数据浏览部件中会显示出查询结果 通过参数编辑器为参数赋值 这种方式缺乏应有的灵活性 在实际应用中用得较少 在实际应用中程序设计人员希望用更灵活方便的方式为参数赋值 那就是我们接下来要介绍的另一种途径

在运行过程中 通过程序为参数赋值

用这种方式为参数赋值有三种方法

①根据参数在SQL语句中出现的顺序 设置TQuery部件的Params属性值为参数赋值

②直接根据SQL语句中各参数的名字 调用ParamByName方法来为各参数赋值

③将TQuery部仔银迟件的DataSource属性设置为另一个数据源 这样将另一个数据源中与当前TQuery部件的SQL语句中的参数名相匹配的字段值赋给其对应的参数

这三种方法我们将在下面的三小节中具体地介绍

使用Params属性为参数赋值

TQuery部件具有一个Params属性 它们在设计时不可用 在程序运行过程中可用 并且是动态建立的 当为TQuery部件编写动态SQL 语句时 Delphi 会自动地建立一个数组Params 数组Params是以 下标开始的 依次对应动态SQL 语句中的参数 也就是说动态SQL语句中第一个参数对应Params[ ] 第二个参数对应params[ ] 依此类推

例如 一个TQuery部件Query 我们为它编写的动态SQL语句是

Insert Into Customer(CustNo Name Country)

Values(念李 CustNo :Name : Country)

对于上述这条动态SQL语句中的参数 我们可以利用TQuery部件的params 属性为参数赋值

Query params[ ] AsString := ;

Query params[ ] AsString := Lichtenstein ;

Query params[ ] AsString := USA ;

上述语句将把 赋给参数 Cuse_No Lichtenstein 赋给参数 Name USA 赋给参数 Country

使用ParamByName方法为参数赋值

ParamByName是一个函数 用动态SQL语句中的参数作为调用ParamByName函数的参数 这样便可以为它们赋值 使用这种赋值方法 必须要知道动态SQL语句参数的名字

例如在 节中的例子中 也可以用下述方法给参数赋值

Query ParamByName( CustNo ) AsString := ;

Query ParamByName( Name ) AsString := Lichtenstein ;

Query ParamByName( Country ) AsString := USA ;

使用这种方法同样可以为各参数赋值 而且更加直观一些

使用Datasource属性为参数赋值

上述两种方法的共同特点是 我们在为各参数赋值时 我们是知道各参数对应的具体参数值的 而在具体的应用程序中 有些参数值常常是无法确定的 例如参数值来自于另搏宴一个查询结果 对于这种情况 Delphi提供了使用Datasource属性为动态SQL 语句中尚存在没有赋值的参数时 Delphi 会自动检查 TQuery 部件的 Datasource 属性 如果为Datasource属性设置了属性值(该属性的值是另一个TDatasource部件的名字) Delphi 会把没有赋值的参数与TDatasource部件中的各字段比较 Delphi 会将相应的字段值赋给与其相匹配的参数 利用这种方法也能实现所谓的连接查询 我们在学习使用TTable部件时 便会创建主要 明细型数据库应用 用TQuery部件创建的连接查询与主要 明细型应用是相似的

例如 在如图 所示的应用中 设置了下列部件

● 一个TTable部件

名字为Cust 它的DatabaseName属性为DEMOS TableName属性为Customer

● 一个TDatasource部件

名字为Custsource 其Dataset属性被设置为Cust

● 一个TQuery部件

名字为ORDERS 其DatabaseName被设置为DEMOS SQL属性值为

Select Orders CustNo Orders OrderNo Orders SaleDate FROM Orders

WHERE Orders CustNo =: CustNo

ORDERS的DataSouce属性被设置为CustSource

● 一个TDatasource部件

名字为OrderSource 其DataSet属性被设置为Orders

● 两个TDBGrid部件

它们分别连接CustSource和OrderSource

TQuery部件Orders中的动态SQL语句中的参数 CustNo在程序设计过程中没有给它赋值 当该应用程序运行时Delphi会自动地到其Datasource属性中说明的数据源CustSource中查找与参数 CustNo匹配的字段 而CustSource中正好有一个名字为 CustNo 的字段与参数 CustNo匹配 这样Customer表中的CustNo字段值被赋给了参数 : CustNo 而当每移动Customer表中的记录指针 参数 CustNo的值会随之改变 而参数 CustNo的值发生改变时 Orders中的动态SQL语句会根据新的参数值重新查询 从数据库表中获取相应的订单数据 这样也变实现了类似于主要 明细型应用 即连接查询

Prepare方法的使用

在使用动态SQL语句编程时 常常用到一个很重要的方法prepare 调用prepare 方法之后 Delphi会将带参数的SQL语句传送给与其对应的数据库引擎 对动态SQL语句进行语法分析和优化 虽然在用动态SQL语句编程时 调用prepare方法并不是必须的 但是这里我们要极力推荐调用prepare方法 因为调用prepare方法后 会大大提高动态SQL 语句的执行性能 特别是当要反复多次执行同一条动态SQL语句时 其优越性会更加明显 如果在应用程序中执行一条SQL语句之前并没有显式地调用prepare方法 每次在执行SQL 语句时 Delphi会隐含地调用propare方法以准备这个查询

TQuery部件还有一个prepare属性 这是一个布尔型属性 当其属性值为True时 表明该查询已被准备好了( SQL 语句已被传送到数据库引擎中 ) 当我们使用参数编辑器Parameters Editor来为动态SQL语句中的参数赋值时 当设置完相应的参数值并退出参数编辑器时 Delphi会隐含地调用prepare方法以准备好查询

当SQL语句执行完之后 要想准备下一个查询 首先必须调用close方法 然后才能调用prepare方法准备下一个查询 一般来说 在一个应用程序中应该调用一次prepare方法 常常在窗体的OnCreate事件处理过程中调用prepare方法 然后用上述介绍的方法为参数赋值 最后调用Open方法或ExecSQL方法执行SQL语句 以完成查询

当然在调用prepare方法准备好一个查询时 会消耗一些数据库资源 因而每当一个查询执行完毕之后 要养成调用Unprepare方法以撤消查询的好习惯 在运行程序过程中 通过程序改变TQuery部件的SQL属性值时 Delphi会自动地调用Close方法和Unprepare 方法 以撤消查询

返回目录 DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

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

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

Oracle索引技术

ORACLE G数据库开发优化指南

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

C嵌入式编程设计模式

Android游戏开发实践指南

lishixin/Article/program/Delphi/201311/25147

⑼ DELPHI基础教程:Delphi开发数据库应用程序概述(二)[4]

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游戏开发实践指南

lishixin/Article/program/Delphi/201311/25179

⑽ DELPHI基础教程:Delphi图形图像编程(一)[3]

响应鼠标事件

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

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

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

表 鼠标事件的五个参数

━━━━━猛颤答━━━━━━━━━━━━━━━━━━━━━━

参数 含义

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

Sender 探测鼠标动作的对象

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

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

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

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

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

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

响应鼠标的OnMouseDown事件

可在该事件中调用TextOut方法

procere TForm FormMouseDown(Sender: TObject Button: TMouseButton;

Shift : TShifState; X Y : Integer)

begin

Canvas TextOut(X Y Here! )

end;

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

procere TForm FormMouseDown(Sender:TObject)

begin

Moveto(x y)

end;

procere TForm FormMouse Up(Sender:Tobject)

begin

Lineto(X Y)

end;

返回目录 DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

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

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

Oracle索引技术

ORACLE G数据库开发优化指南

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

C嵌入式编程设计模式

Android游戏开发实践指南

lishixin/Article/program/Delphi/201311/25249

热点内容
美乐棵兰花 发布:2025-08-01 00:40:14 浏览:869
盆景名片 发布:2025-08-01 00:40:08 浏览:130
百合漫画纯爱 发布:2025-08-01 00:33:21 浏览:749
六一樱花草舞蹈视频 发布:2025-08-01 00:26:42 浏览:869
夏日里最后一朵蓝色妖姬 发布:2025-08-01 00:03:30 浏览:976
晋城花卉市场 发布:2025-07-31 23:57:40 浏览:788
王艳梅花 发布:2025-07-31 23:57:05 浏览:636
花艺鱼线 发布:2025-07-31 23:56:49 浏览:170
十二月梅花 发布:2025-07-31 23:56:49 浏览:784
瓜子盆栽育苗 发布:2025-07-31 23:55:16 浏览:180