![DELPHI基础教程:动态链接库编程(一)[1],第1张 DELPHI基础教程:动态链接库编程(一)[1],第1张](/aiimages/DELPHI%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E7%BC%96%E7%A8%8B%EF%BC%88%E4%B8%80%EF%BC%89%5B1%5D.png)
Windows的动态链接库原理
动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的 所有的C语言标准库函数都存放在某一函数库中 同时用户也可以用LIB程序创建自己的函数库 在链接应用程序的过程中 链接器从库文件中拷贝程序调用的函数代码 并把这些函数代码添加到可执行文件中 这种方法同只把函数储存在已编译的 OBJ文件中相比更有利于代码的重用
但随着Windows这样的多任务环境的出现 函数库的方法显得过于累赘 如果为了完成屏幕输出 消息处理 内存管理 对话框等 *** 作 每个程序都不得不拥有自己的函数 那么Windows程序将变得非常庞大 Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝 动态链接库就是在这种情况下出现的 动态链接库不用重复编译或链接 一旦装入内存 Dlls函数可以被系统中的任何正在运行的应用程序软件所使用 而不必再将DLLs函数的另一拷贝装入内存
动态链接库的工作原理
动态链接 这几字指明了DLLs是如何工作的 对于常规的函数库 链接器从中拷贝它需要的所有库函数 并把确切的函数地址传送给调用这些函数的程序 而对于DLLs 函数储存在一个独立的动态链接库文件中 在创建Windows程序时 链接过程并不把DLLs文件链接到程序上 直到程序运行并调用一个DLLs中的函数时 该程序才要求这个函数的地址 此时Windows才在DLLs中寻找被调用函数 并把它的地址传送给调用程序 采用这种方法 DLLs达到了复用代码的极限
动态链接库的另一个方便之处是对动态链接库中函数的修改可以自动传播到所有调用它的程序中 而不必对程序作任何改动或处理
DLLs不仅提供了函数重用的机制 而且提供了数据共享的机制 任何应用程序都可以共享由装入内存的DLLs管理的内存资源块 只包含共享数据的DLLs称为资源文件 如Windows的字体文件等
Windows系统的动态链接库
Windows本身就是由大量的动态链接库支持的 这包括Windows API函数 ( KRNLx EXE USER EXE GDI EXE …) 各种驱动程序文件 各种带有 Fon和 Fot 扩展名的字体资源文件等 Windows还提供了针对某一功能的专用DLLs 如进行DDE编程的ddeml dll 进行程序安装的ver dll等
虽然在编写Windows程序时必然要涉及到DLLs 但利用Delphi 用户在大部分时候并不会注意到这一点 这一方面是因为Delphi提供了丰富的函数使用户不必直接去使用Windows API;另一方面即使使用Windows API 由于Delphi把API函数和其它Windows DLLs函数重新组织到了几个库单元中 因而也不必使用特殊的调用格式 所以本章的重点放在编写和调用用户自定义的DLLs上
使用传统的Windows编程方法来创建和使用一个DLLs是一件很令人头痛的事 正如传统的Windows编程方法本身就令人生畏一样 用户需要对定义文件 工程文件进行一系列的修改以适应创建和使用DLLs的需要 Delphi的出现 在这一方面 正如在其它许多方面所做的那样 减轻了开发者的负担 更令人兴奋的是Delphi利用DLLs 实现了窗体的重用机制 用户可以将自己设计好的窗体储存在一个DLLs中 在需要的时候可随时调用它
DLLs的编写和调用
DLLs的编写
在Delphi环境中 编写一个DLLs同编写一个一般的应用程序并没有太大的区别 事实上作为DLLs 主体的DLL函数的编写 除了在内存 资源的管理上有所不同外 并不需要其它特别的手段 真正的区别在工程文件上
在绝大多数情况下 用户几乎意识不到工程文件的存在 因为它一般不显示在屏幕上 如果想查看工程文件 则可以打开View菜单选择Project Source项 此时工程文件的代码就会出现在屏幕的Code Editor(代码编辑器)中
一般工程文件的格式为
program 工程标题
uses 子句
程序体
而DLLs工程文件的格式为
library 工程标题
uses 子句
exprots 子句
程序体
它们主要的区别有两点
一般工程文件的头标用program关键字 而DLLs工程文件头标用library 关键字 不同的关键字通知编译器生成不同的可执行文件 用program关键字生成的是 exe文件 而用library关键字生成的是 dll文件
假如DLLs要输出供其它应用程序使用的函数或过程 则必须将这些函数或过程列在exports子句中 而这些函数或过程本身必须用export编译指令进行编译
根据DLLs完成的功能 我们把DLLs分为如下的三类
完成一般功能的DLLs;
用于数据交换的DLLs;
用于窗体重用的DLLs
这一节我们只讨论完成一般功能的DLLs 其它内容将在后边的两节中讨论
编写一般DLLs的步骤
编写一般DLLs的步骤如下
利用Delphi的应用程序模板 建立一个DLLs程序框架
对于Delphi 的用户 由于没有DLLs模板 因此
( ) 建立一个一般的应用程序 并打开工程文件
( ) 移去窗体和相应的代码单元
( ) 在工程文件中 把program改成library 移去Uses子句中的Forms 并添加适当的库单元(一般SysUtils Classes是需要的) 删去begin…end之间的所有代码
以适当的文件名保持文件 此时library后跟的库名自动修改
输入过程 函数代码 如果过程 函数准备供其它应用程序调用 则在过程 函数头后加上export 编译指示
建立exports子句 包含供其它应用程序调用的函数和过程名 可以利用标准指示 name Index resident以方便和加速过程/函数的调用
输入库初始化代码 这一步是可选的
编译程序 生成动态链接库文件
动态链接库中的标准指示
在动态链接库的输出部分 用到了三个标准指示 name Index resident
name
name后面接一个字符串常量 作为该过程或函数的输出名 如
exports
InStr name MyInstr;
其它应用程序将用新名字(MyInstr)调用该过程或函数 如果仍利用原来的名字(InStr) 则在程序执行到引用点时会引发一个系统错误
Index
Index指示为过程或函数分配一个顺序号 如果不使用Index指示 则由编译器按顺序进行分配
Index后所接数字的范围为 … 使用Index可以加速调用过程
resident
使用resident 则当DLLs装入时特定的输出信息始终保持在内存中 这样当其它应用程序调用该过程时 可以比利用名字扫描DLL入口降低时间开销
对于那些其它应用程序常常要调用的过程或函数 使用resident指示是合适的 例如
exports
InStr name MyInStr resident;
lishixinzhi/Article/program/Delphi/201311/25207
Windows NT服务程序不同于一般的运行程序,它不需要NT登录进去,只需要开机进入NT系统便可以运行,一般用于系统服务方面的应用,学会编写NT服务程序对网络管理人员而言是非常重要的,Delphi作为一种高效、快速、强大的开发语言,为开发NT服务程序提供了非常便捷的方法,加上其可视化界面以及与数据库的完美结合,使我们开发与数据库有关的NT服务程序变得非常简单,下面以编写一个NT定期备份程序为例,介绍如何运用Delphi编写Windows NT的服务程序。
打开Delphi编辑器,选择菜单中的File|New,在New Item中选择Service Application项,Delphi便自动为你建立一个基于TServiceApplication的新工程,TServiceApplication是一个封装NT服务程序的类,它包含一个TService1对象以及服务程序的装卸、注册、取消方法。
将TService1对象的属性做下列更改:
DisplayName与Name改为:DataBackup,ServiceStartName属性改为系统管理员用户(如DOMAIN\Administrator)和Password则输入用户密码
这样,服务程序运行时将自己以该用户的权限 *** 作NT。
这样,一个NT服务程序编写已经完成,在Delphi编辑器中选择菜单Run|Parameters,在Parameters中输入/install,程序编译运行后,一个名为DataBackup的NT服务程序已经安装好,你可以双击控制面板中的服务项目,将会看到此服务程序,只是此服务程序没有任何东西而已;在Delphi编辑器中选择菜单Run|Parameters,在Parameters中输入/uninstall,程序编译运行后,系统将会将此服务程序卸掉。
服务程序是通过控制一个线程的生成、暂停、继续、停止来达到服务目的的,因此我们必须加入一个TSession对象来编写文件自动备份代码,在Delphi编辑器中选择菜单中的File|New,在New Item中选择Thread Object项,Delphi会提示你为该TSession对象输入一个名称(输入DataCopy),Delphi便生成了一个基于TSession的DataCopy对象,并提供了一个Execute过程供重载,我们要Execute过程中输入以下程序:
var
Hour, Min, Sec, MSec: Word;
TimeStamp, DirectoryEdit1, DirectoryEdit2: String;
SearchRec: TSearchRec;
Source, Temp, Dest: Pchar;
F, F1: THandle;
FF, FF1: WIN32_FIND_DATA;
Begin
// 每次文件备份执行时间
TimeStamp:= '12:00';
// 文件备份源目录
DirectoryEdit1:= 'C:\temp';
// 文件备份目录
DirectoryEdit2:= 'C:\temp1';
While True do
Begin
DecodeTime(Time, Hour, Min, Sec, MSec);
IF Trim(TimeStamp) = Format('%-22d:%-22d',[Hour, Min]) then
Begin
GetMem(Source, 250);
GetMem(Dest, 250);
GetMem(Temp, 250);
StrPcopy(Dest, DirectoryEdit2 + '\' + FormatDateTime('YYYYMMDD', Date));
CreateDirectory(Dest, Nil);
IF FindFirst(DirectoryEdit1 + '\', faAnyFile, SearchRec) = 0 then
Begin
Repeat
StrPcopy(Source, DirectoryEdit1 + '\' + SearchRecName);
StrPcopy(Dest, DirectoryEdit2+'\' + FormatDateTime('YYYYMMDD', Date) + '\' + SearchRecName);
CopyFile(Source, Dest, False);
Until FindNext(SearchRec) <> 0;
end;
SysUtilsFindClose(SearchRec);
FindClose(F);
FreeMem(Source, 250);
FreeMem(Dest, 250);
FreeMem(Temp, 250);
end;
Sleep(60000);
end;
end;
此线程执行时每隔一分钟将检查一次时间,看是否到了备份时间,如果是则将DirectoryEdit1中的所有文件拷到DirectoryEdit2目录中去。
现在编写服务控制DataCopy线程的代码,在TdataBackup对象中的OnStart、OnStop、OnPause、OnContinue事件中分别输入如下代码:
Procedure TDataBackupDataBackupStart(Sender: TService;
var Started: Boolean);
begin
DataThread:= TDataCopyCreate(False);
Started := True;
end;
procedure TDataBackupDataBackupStop(Sender: TService;
var Stopped: Boolean);
begin
DataThreadTerminate;
Stopped := True;
end;
procedure TDataBackupDataBackupPause(Sender: TService;
var Paused: Boolean);
begin
DataThreadSuspend;
Paused := True;
end;
procedure TDataBackupDataBackupContinue(Sender: TService;
var Continued: Boolean);
begin
DataThreadResume;
Continued := True;
end;
这样一个文件自动备份程序已经完成,编译好后,加上/install参数执行程序,系统会将此服务程序安装,由于服务程序中StartType属性为stAuto,NT每次启动时,此程序自动执行,你可以在控制面板中的服务项目来启动、暂停、恢复、停止它,也可以加上/uninstall参数执行程序来卸掉它。通过上述例子我们可以看到,用Delphi编写NT服务器程序十分方便,而且你也可以在TService对象上加许多非可视化控件来与数据库关联,实现很多复杂的功能。
ObjectTextToBinary过程执行的功能与ObjectBinaryToText相反 将TXT文件转换为二进制流中的部件 而且只要TXT文件内容的书写符合DFM脚本语法 ObjectTextToBinary可将任何程序生成的TXT文件转换为部件 这一功能也为DFM 文件的动态生成和编辑奠定了基础 ObjectTextToBinary过程的主程序如下
procedure ObjectTextToBinary(Input Output: TStream)
var
SaveSeparator: Char;
Parser: TParser;
Writer: riter;
…
begin
Parser := TParser Create(Input)
SaveSeparator := DecimalSeparator;
DecimalSeparator := ;
try
Writer := riter Create(Output )
try
Writer WriteSignature;
ConvertObject;
finally
Writer Free;
end;
finally
DecimalSeparator := SaveSeparator;
Parser Free;
end;
end;
在程序流程和结构上与ObjectBinaryToText差不多 ConvertObject也是个递归过程
procedure ConvertObject;
var
InheritedObject: Boolean;
begin
InheritedObject := False;
if Parser TokenSymbolIs( INHERITED ) then
InheritedObject := True
else
Parser CheckTokenSymbol( OBJECT )
Parser NextToken;
ConvertHeader(InheritedObject)
while not Parser TokenSymbolIs( END ) and
not Parser TokenSymbolIs( OBJECT ) and
not Parser TokenSymbolIs( INHERITED ) do ConvertProperty;
Writer WriteListEnd;
while not Parser TokenSymbolIs( END ) do ConvertObject;
Writer WriteListEnd;
Parser NextToken;
end;
DFM文件与DFM脚本语言之间相互转换的任务由ObjectResourceToText和ObjextTextToResource两个过程完成
procedure ObjectResourceToText(Input Output: TStream)
begin
Input ReadResHeader;
ObjectBinaryToText(Input Output)
end;
ObjectTextToResource过程就比较复杂 因为DFM文件资源头中要包含继承标志信息 因此在调用ObjectTextToBinary后 就读取标志信息 然后写入资源头
procedure ObjectTextToResource(Input Output: TStream)
var
Len: Byte;
Tmp: Longint;
MemoryStream: TMemoryStream;
MemorySize: Longint;
Header: array[ ] of Char;
begin
MemoryStream := TMemoryStream Create;
try
ObjectTextToBinary(Input MemoryStream)
MemorySize := MemoryStream Size;
FillChar(Header SizeOf(Header) )
MemoryStream Position := SizeOf(Longint) { Skip header }
MemoryStream Read(Len )
if Len and $F = $F then
begin
if ffChildPos in TFilerFlags((Len and $F )) then
begin
MemoryStream Read(Len )
case TValueType(Len) of
vaInt : Len := ;
vaInt : Len := ;
vaInt : Len := ;
end;
MemoryStream Read(Tmp Len)
end;
MemoryStream Read(Len )
end;
MemoryStream Read(Header[ ] Len)
StrUpper(@Header[ ])
Byte((@Header[ ])^) := $FF;
Word((@Header[ ])^) := ;
Word((@Header[Len + ])^) := $ ;
Longint((@Header[Len + ])^) := MemorySize;
Output Write(Header Len + )
Output Write(MemoryStream Memory^ MemorySize)
finally
MemoryStream Free;
end;
end;
动态DFM文件应用揭秘
动态DFM文件概述
动态DFM文件是相对于静态DFM文件而言 所谓静态DFM文件是指在Delphi开发环境中设计的窗体文件 窗体的设计过程就是程序的编制过程 因此 动态DFM文件就是指在程序运行过程生成或存取的DFM文件
动态DFM文件的创建和使用分别如下两种情况
● 在程序运行过程中 由Create方法动态生成窗体或部件 然后动态生成其它部件插入其中生成DFM文件
● 在Delphi开发环境中 设计生成DFM文件 然后用DFM 文件存取函数 或者用Stream对象和Filer对象的方法 将DFM文件读入内存 进行处理 最后又存入磁盘中
由Delphi的窗体设计的常规方法生成的DFM文件在程序运行一开始就规定了部件的结构 因为在窗体设计过程中 窗体中的每个部件都在程序的对象声明中定义了部件变量 这种固定的结构虽然能方便应用 但以牺牲灵活性为代价
在Delphi应用程序中有时需要在运行过程中创建控制 然后将该控制插入另一个部件中 例如
procedure TForm Button Click(Sender: Tobject)
var
Ctrl: TControl
begin
Ctrl := TEdit Create(Self)
Ctrl Top := ;
Ctrl Left := ;
Ctrl Width := ;
Ctrl Height := ;
InsertControl(Ctrl)
end;
动态插入控制的优点是可以在任何时刻 任意位置插入任意数量的任何类型的控制 因为应用程序需求在很多情况下是在程序运行中才知道的 所以动态插入控制就显得很重要 而且在很多情况下 需要保存这些界面元素 留待程序再次调用 例如应用程序界面的定制 系统状态的保存 对话框的保存等 这时生成动态DFM文件是最佳选择
动态插入控制的不足之处是在插入控制前 无法直观地看到控制的大小 风格 位置等 也就是动态插入控制的过程是非可视化的 但可以借助于静态DFM文件的可视化设计 这就是生成和使用动态DFM文件的第二种方法 也就是在应用程序运行前 在Delphi开发环境中 使用可视化开发工具设计所需窗口或部件的样式 以DFM文件保存 然后在应用程序运行过程中 将DFM文件读入内存 Delphi的Stream对象和Filer对象在读取DFM文件时 会根据DFM文件的内容自动创建部件及其拥有的所有部件
在使用动态DFM文件时有两点需要注意
● 每一个动态插入的控制或部件必须在程序中调用RegisterClass进行注册
● 读入DFM文件自动创建部件后 如果调用了InsertControl方法 则在关闭窗口时要调用RemoveControl方法移去该控制 否则会产生异常事件
动态DFM文件应用之一 超媒体系统的卡片设计
Delphi多种类型的可视部件 如文本部件 编辑部件 图形图像部件 数据库部件 媒体媒放部件和OLE部件等 每一种部件在屏幕中占据一定的区域 具有相当丰富的表现能力 可以作为卡片中的一种媒体 因此可以利用这些可视部件进行超媒体系统的卡片设计
超媒体卡片设计要求卡片中的媒体数目和媒体种类是不受限制的 而且必须能够修改和存取卡片 因此 采用动态DFM文件是比较合适的 而且如果利用Stream对象 将卡片存储在数据库BLOB字段中 就为把超文本与关系数据库技术结合起来创造了契机
下面是超媒体卡片设计子系统中的部分源程序 它演示了如何创建对象 插入对象和存取动态DFM文件
⑴ 在应用程序中注册对象
procedure TMainForm FormCreate(Sender: TObject)
begin
RegisterClass(TLabel)
RegisterClass(TEdit)
RegisterClass(TMemo)
RegisterClass(TButton)
RegisterClass(TPanel)
RegisterClass(TPanelP)
RegisterClass(TBitBtn)
…
end;
⑵ 创建和插入对象
procedure TMDIChild FormClick(Sender: TObject)
var
Ctrl : TControl;
Point: TPoint;
begin
GetCursorPos(Point)
Point := BackGround ScreenToClient(Point)
case CurToolIndex of
: begin
Ctrl := TLabel Create(self)
TLabel(Ctrl) AutoSize := False;
TLabel(ctrl) Caption := Label +S;
TLabel(ctrl) Name := Label ;
TLabel(ctrl) Top := Point Y;
TLabel(ctrl) Left := Point X;
TLabel(Ctrl) Height := Round( Res/ /Ratio)
TLabel(Ctrl) Width := Round( Res/ /Ratio)
TLabel(Ctrl) Color := clWhite;
TLabel(Ctrl) Font Color := clBlack;
TLabel(Ctrl) Font Name := Roman ;
TLabel(Ctrl) Font Height := TLabel(Ctrl) Height;
TLabel(Ctrl) Font Pitch := fpFixed;
TLabel(Ctrl) Enabled := False;
TLabel(Ctrl) OnClick := LabelClick;
TLabel(Ctrl) OnMouseMove := ReportPos;
BackGround InsertControl(Ctrl)
CurTool Down := False;
CurTool := nil;
…
end;
: begin
Ctrl := TEdit Create(self)
TEdit(ctrl) AutoSize := True;
TEdit(ctrl) Top := Point Y;
TEdit(ctrl) Left := Point X;
TEdit(Ctrl) Height := ;
BackGround InsertControl(Ctrl)
…
end;
:
…
end;
end;
⑵ 存取动态DFM文件
lishixinzhi/Article/program/Delphi/201311/25089
在这一章里我们主要介绍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基础教程:动态链接库编程(一)[1]全部的内容,包括:DELPHI基础教程:动态链接库编程(一)[1]、delphi怎样编写服务程序、DELPHI基础教程:开发Delphi对象式数据管理功能(五)[2]等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)