还有几个问题:
2.midas不是说需要有个dbclient.dll支持吗,但我怎么找不到这个文件
3.什么是回调
4.delphi的虚拟方法表VMT是怎么回事,
VMT是一个张表还是每个对象一张表,VMT中包含了那些内容,大概是如何工作的
5.
怎么样把指针的内容显示出来
怎么将pchar转换成string,请简单写一下代码。谢谢(回答任何一个问题都有分)
2.midas不是说需要有个dbclient.dll支持吗,但我怎么找不到这个文件
3.什么是回调
4.delphi的虚拟方法表VMT是怎么回事,
VMT是一个张表还是每个对象一张表,VMT中包含了那些内容,大概是如何工作的
5.
怎么样把指针的内容显示出来
怎么将pchar转换成string,请简单写一下代码。谢谢(回答任何一个问题都有分)
解决方案 »
- 求delphi免费的OPC开发工具包
- 请问delphi中有没有类似SQL的isnull函数
- FORM最小化状态问题
- 如何调整TTreeView中同一父节目下的子节点的显示次序?
- 如何连接dbx数据文件
- 在线求教:我做一个串口软件,画线代码老是出错,运行时出现一个“Range Check Error"的提示,请问是什么意思?该如何解决。高分求教!!
- 在TREEVIEW中怎么给每一项加上一个CHECK框?
- 我这个判断Listbox里是否存在相同纪录的Procedure哪里错了?
- 有现成的可以从一个字符串中从左到右或者从右到左取其中的字符串!
- 新人求知帖!!
- 急!filtered的问题 小弟作揖了!各位大侠!
- 用printer.canvas.textout可以打印特殊字符吗?
也可以说是一个公共接口, 要在服务器和客户机都实现, 服务器这边由 TRemoteDataModule 实现的(你的父类), 客户机部分内部机制无法确定,这些是未公开原码的,服务器部份就那几句,TRemoteDataModule 一共才几行,关键在 IProviderSupport 和 DataSetProvider 这一个接口和一个控件中。看这句:
TRemoteDataModule = class(TDataModule, IAppServer)
看得出来 TRemoteDataModule 跟 TDataModule 没有什么重大区别, 关键在重实现 IAppServer部份原码
客户机这部分实现在 MIDAS.dll 里(d4 以前版本叫 DBClient.dll, 这是第二个问题).IProvider 仍是d4 以前版本的兼容产物, 在那时代放在 RDM 上的Query是要 export provider to datamodule 的(不像现在的 DataSetProvider),而导出的接口就是 IProvider.Idatabroker 我不知道, 你告诉我在哪个单元中的? 我得去看看.IProviderSupport 呵, 这才是 MIDAS 使用到的最重要的一个接口, 虽然它不是核心, 实际上也得简单.
IProviderSupport 定义在 db.pas 1715 行, 你得看看它的方法, 不明白没事, 知道有这些方法就可以我们看 TDataSet 哈
TDataSet = class(TComponent, IProviderSupport) // db.pas 1786
原来对 IProviderSupport 的实现就是 TDataSet,而不是 Borland 一惯的 TProviderSupport
再向下100 行左右(可怕,全是TDataSet声明)
{ IProviderSupport } //db.pas 1881 行
原来 IProviderSupport 中的方法全被 TDataSet 声明成了 virtual, 也就是说真正的数据引擎相关数据集控件都要继承并实现这些 virtual 方法是不是上面这么一回事?看看 ADOQuery
TADOQuery = class(TCustomADODataSet) // ADODB.pas 938 行
原来所有的ADO控件都是 TCustomADODataSet 子类, 好,那看 TCustomADODataSet
TCustomADODataSet = class(TDataSet, IUnknown, RecordsetEventsVt) //ADODB.pas 530行
...
{ IProviderSupport } // 629 行
procedure PSEndTransaction(Commit: Boolean); override;
procedure PSExecute; override;
function PSExecuteStatement(const ASQL: string; AParams: TParams;
ResultSet: Pointer = nil): Integer; override;
procedure PSGetAttributes(List: TList); override;
function PSGetDefaultOrder: TIndexDef; override;
function PSGetKeyFields: string; override;
function PSGetParams: TParams; override;
function PSGetQuoteChar: string; override;
function PSGetTableName: string; override;
function PSGetIndexDefs(IndexTypes: TIndexOptions = [ixPrimary..ixNonMaintained]): TIndexDefs; override;
function PSGetUpdateException(E: Exception; Prev: EUpdateError): EUpdateError; override;
function PSInTransaction: Boolean; override;
function PSIsSQLBased: Boolean; override;
function PSIsSQLSupported: Boolean; override;
procedure PSReset; override;
procedure PSSetParams(AParams: TParams); override;
procedure PSSetCommandText(const CommandText: string); override;
procedure PSStartTransaction; override;
function PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean; override;
...
end;
procedure PSStartTransaction; override;
procedure PSEndTransaction(Commit: Boolean); override;
function PSInTransaction: Boolean; override; // adodb.pas 5816
procedure TCustomADODataSet.PSStartTransaction;
begin
SetConnectionFlag(cfProvider, True);
try
// 哈,原来就这...
Command.CommandObject.Get_ActiveConnection.BeginTrans;
except
SetConnectionFlag(cfProvider, False);
raise;
end;
end;procedure TCustomADODataSet.PSEndTransaction(Commit: Boolean);
var
ActiveConnection: _Connection;
begin
// 得到原生的 connection
ActiveConnection := Command.CommandObject.Get_ActiveConnection;
if Assigned(ActiveConnection) then
try
// commit 事务,这些代码我也不是都清楚含义
if Commit then
ActiveConnection.CommitTrans else
ActiveConnection.RollbackTrans;
finally
SetConnectionFlag(cfProvider, False);
end;
end;
说明一点,贴子的内容绝对原创,有些东西也是我的个人看法...有错请大家纠正以上说明了Borland 数据引擎控件的 IProviderSupport 能力,能看明白的兄弟只要看了就很容易明白 DataSetProvider 调用IProviderSupport部份代码,可以打开 Provider.pas 文件, search 文字 IProviderSupport,我就不多废话了...
PChar变量 := String变量, 反过来也可以
苹果兄为什么不发言??:)
反正不是看源码的时候看见的,在哪本书%%....我晚上找找看
谢谢大家捧场:))))嗷嗷
应用服务器上的远程数据模块支持IDataBroker接口,当客户程序与应用服务器连接以后,客户程序上的MIDAS连接构件就查找IDataBroker接口.IDataBroker只实现了一个方法叫GetProviderNames,调用这个方法可以获得一个列表,这个列表列出了应用服务器上的TDataSetProvider构件.TClientDataSet的ProviderName属性可以指定其中的一个TDataSetProvider构件.
我现在的理解IDataBroker实现了TClientDataSet的ProviderName属性的功能,用于定位应用服务器,Iprovider接口用于在应用服务器和客户端之间进行数据交换.iprovider和iappserver是类似的,只是导出者不同.IproviderSupport用于数据集的定义
TDataSet = class(TComponent, IProviderSupport),凡是数据集的组件都要实现这个接口.~~~~~~~~~~~~~以上是我个人现在的理解.大家帮我分析一下,加深我的理解.谢了(鞠躬):)