百分求例子。我程序中使用如下类
type
TMan=class
Name:Pchar;
Sex:Pchar;
Age:Integer;
end;我想在App.exe中创建这个类TMan的一个对象 AMan,并令AMan.Name='张三',然后把AMan送入到 dll.dll 进行填充(Fill),完成之后再把结果返回主程序App.exe。主程序Show出AMan.Sex代码段
App.exeprocedure button1click();
var
AMan:TMan;
begin
AMan:=TMan.create;
AMan.Name:='张三';
Fill(AMan);
Showmessage(AMan.sex);
AMan.free;
end;在Dll中
function TMan.fill(AMan:TMan):Boolean;
begin
AMan.sex='男';
AMan.age=18;
Result:=true;
end;
上面的书写方法不太严谨,但不影响理解。但这种方法,DLL中不能传出类的对象。看了资料,说要应用接口技术,但是,书上都是讲接口是什么东西呀,接口怎么定义呀,然后怎么Query、怎么Addref呀,就没讲定义了接口后怎么实现,晕中,
所以求助各位达人,给写个简单的示例。因为我想把部分功能封在DLL里。
我真实要传的对象有20多个属性,我不想一个个作为参数传进传出DLL。所以,APP传给DLL的要是一个对象,返回也是一个对象。或是用Var AMan传递。又AMan传进DLL后要进行Fill,这个功能在DLL中实现,就这样了,
谁帮帮我!代码打包给 [email protected]
type
TMan=class
Name:Pchar;
Sex:Pchar;
Age:Integer;
end;我想在App.exe中创建这个类TMan的一个对象 AMan,并令AMan.Name='张三',然后把AMan送入到 dll.dll 进行填充(Fill),完成之后再把结果返回主程序App.exe。主程序Show出AMan.Sex代码段
App.exeprocedure button1click();
var
AMan:TMan;
begin
AMan:=TMan.create;
AMan.Name:='张三';
Fill(AMan);
Showmessage(AMan.sex);
AMan.free;
end;在Dll中
function TMan.fill(AMan:TMan):Boolean;
begin
AMan.sex='男';
AMan.age=18;
Result:=true;
end;
上面的书写方法不太严谨,但不影响理解。但这种方法,DLL中不能传出类的对象。看了资料,说要应用接口技术,但是,书上都是讲接口是什么东西呀,接口怎么定义呀,然后怎么Query、怎么Addref呀,就没讲定义了接口后怎么实现,晕中,
所以求助各位达人,给写个简单的示例。因为我想把部分功能封在DLL里。
我真实要传的对象有20多个属性,我不想一个个作为参数传进传出DLL。所以,APP传给DLL的要是一个对象,返回也是一个对象。或是用Var AMan传递。又AMan传进DLL后要进行Fill,这个功能在DLL中实现,就这样了,
谁帮帮我!代码打包给 [email protected]
可以用接口或抽象类。利用一个公共的单元。。
------------
数据模块单元:
unit DBmdUnit;interfaceuses
SysUtils, Classes, DB, ADODB, Provider;type
TDataModule1 = class(TDataModule)
ADOConnection1: TADOConnection;
bInfoQuery: TADOQuery;
ReaderQuery: TADOQuery;
DSPbookInfo: TDataSetProvider;
DSPreader: TDataSetProvider;
private
{ Private declarations }
public
{ Public declarations }
end;implementation{$R *.dfm}end.
抽象类共同单元:
unit SClass;interfaceuses
Classes,DB,ADODB;type
//该记录保存重要的全局信息--------------
TImvalue=record
lendNum:integer; //可借书数量(以本计)
lendTime:integer;//借书的时间长度(以月计)
CartTime:integer; //借书证有效期(以月计)
end;//一个数据库操作的抽象类
TISearch=class(TObject)
public
constructor create;virtual;abstract;
procedure GetImportValue(var ImValue:TImvalue);virtual;abstract;
function GetBookInfo(SType,SRange,SCon,ReNum:string):OleVariant;virtual;abstract;
function GetReaderLend(RNum,ReNum:string):OleVariant;virtual;abstract;
end;//上面的类的引用
TISearchClass=class of TISearch;implementationend.
------------------
DLL的单元:
unit SSubClass;interfaceuses
DBmdUnit,SClass,SysUtils,Classes, DB, ADODB,Variants;type
//继承一个子类,以实现里面的操作
TSearch=class(TISearch)
private
DataModule1: TDataModule1;
public
constructor create;override;
destructor Destroy;override;
procedure GetImportValue(var ImValue:TImvalue);override;
function GetBookInfo(SType,SRange,SCon,ReNum:string):OleVariant;override;
function GetReaderLend(RNum,ReNum:string):OleVariant;override;
end;implementationconstructor TSearch.create;
begin
DataModule1:=TDataModule1.Create(nil);
end;destructor TSearch.Destroy;
begin
DataModule1.Free;
inherited Destroy;
end;
//------------------------------------------
//取得info表的数据
procedure TSearch.GetImportValue(var ImValue:TImvalue);
begin
with DataModule1 do
begin
ReaderQuery.Close;
ReaderQuery.SQL.Clear;
ReaderQuery.SQL.Add('select * from Info');
ReaderQuery.Open;
ReaderQuery.First;
ImValue.lendNum:=ReaderQuery.fieldByName('可借数').AsInteger;
ImValue.CartTime:=ReaderQuery.fieldByName('图书证有效期').AsInteger;
ImValue.lendTime:=ReaderQuery.fieldByName('借书有效期').AsInteger;
ReaderQuery.Close;
ReaderQuery.SQL.Clear;
ReaderQuery.SQL.Add('select * from Reader');
ReaderQuery.Open;
end;
end;
//取得图书信息表的数据
function TSearch.GetBookInfo(SType,SRange,SCon,ReNum:string):OleVariant;
begin
with DataModule1 do
try
if not ADOConnection1.Connected then
ADOConnection1.Connected:=true;
bInfoQuery.Close;
bInfoQuery.SQL.Clear;
bInfoQuery.SQL.Add('Select top '+Renum+' * from bookInfo ');
bInfoQuery.SQL.Add('where '+SType+' like ''%'+SCon+'%'' ');
bInfoQuery.SQL.Add('and 所在室='''+SRange+'''');
bInfoQuery.Open;
Result:=DSPbookInfo.Data;
finally
ADOCOnnection1.Connected:=false;
end;
end;
//取得读者表的数据
function TSearch. GetReaderLend(RNum,ReNum:string):OleVariant;
begin
with DataModule1 do
try
if not ADOConnection1.Connected then
ADOConnection1.Connected:=true;
bInfoQuery.Close;
ReaderQuery.SQL.Clear;
ReaderQuery.SQL.Add('Select top '+ReNum+' * from Reader');
ReaderQuery.SQL.add('where 读者号 like '''+RNum+'''');
ReaderQuery.Open;
Result:=DSPReader.Data;
finally
ADOCOnnection1.Connected:=false;
end;
end;end.
DLL工程文件:
library SearchDll;
uses
SysUtils,
Classes,
SClass in 'SClass.pas',
DBmdUnit in 'DBmdUnit.pas' {DataModule1: TDataModule},
SSubClass in 'SSubClass.pas';{$R *.res}
Function SearchClass:TISearchClass;
begin
result:=TSearch;
end;
exports
SearchClass;
begin
end.
--------------------------
界面单元
unit SearchUnit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, Grids, DBGrids, DB,
DBClient,SClass,SSubClass;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Panel1: TPanel;
Panel2: TPanel;
CBStlye: TComboBox;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Label1: TLabel;
Label2: TLabel;
CBRange: TComboBox;
Label3: TLabel;
Bevel1: TBevel;
Bevel2: TBevel;
EditSearch: TEdit;
Label4: TLabel;
Bevel3: TBevel;
EditNum: TEdit;
UpDown1: TUpDown;
Button1: TButton;
ClientDataSet1: TClientDataSet;
Label5: TLabel;
EditReader: TEdit;
EditRe: TEdit;
Label6: TLabel;
UpDown2: TUpDown;
Button2: TButton;
EditName: TEdit;
Label7: TLabel;
EditTime: TEdit;
Label8: TLabel;
EditEnd: TEdit;
Label9: TLabel;
EditKill: TEdit;
Label10: TLabel;
EditBNum: TEdit;
Label11: TLabel;
Bevel4: TBevel;
StaticText1: TStaticText;
ListView1: TListView;
ClientDataSet2: TClientDataSet;
ListView2: TListView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure EditReaderKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure EditSearchKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
SBookInfo:TISearch;
ImValue:TImvalue;
public
{ Public declarations }
procedure GetReader;
procedure GetBookInfo;
end;
function SearchClass:TISearchClass;external 'SearchDll.dll';
var
Form1: TForm1;implementation{$R *.dfm}
//--------------------------------------
//程序创建时,创建DLL中的查询类,并取得重要的数据
procedure TForm1.FormCreate(Sender: TObject);
begin
SBookInfo:=SearchClass.create;
SBookInfo.GetImportValue(ImValue);
end;
//------------------------------------------
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SBookInfo.Free;
end;
//---------------------------------------------
//模糊查询图书信息
procedure TForm1.Button1Click(Sender: TObject);
begin
GetBookInfo;
end;procedure TForm1.EditSearchKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_ReTurn then
GetBookInfo;
end;
//-------------------------------------------
//精确查询读者信息
procedure TForm1.Button2Click(Sender: TObject);
begin
GetReader;
end;procedure TForm1.EditReaderKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_ReTurn then
GetReader;
end;
//-------------------------------------
//函数功能模块
//取得读者借阅信息
procedure TForm1.GetReader;
begin
if editreader.Text='' then
begin
showmessage('请输入要查询的内容');
exit;
end
else begin
ClientDataSet2.Active:=False;
ClientDataSet2.Data:=SBookInfo.GetReaderLend(EditReader.Text,Editre.Text);
ClientDataSet2.Active:=True;
end;
ListView1.Items.Clear;
with ClientdataSet2 do
begin
First;
Editname.Text:=FieldByName('姓名').AsString;
EditTime.Text:=FieldByName('办证时间').AsString;
EditKill.Text:=FieldByName('冻结').AsString;
EditBNum.Text:=FieldByName('借书数').AsString;
//显示读者证的截止时间
EditEnd.Text:=DateTimeToStr(incMonth(FieldByName('办证时间').AsDateTime,Imvalue.CartTime));
While not Eof do
begin
with ListView1.Items.Add do
begin
caption:=fieldByName('书号').AsString;
SubItems.Add(fieldByName('书名').AsString);
SubItems.Add(fieldByName('借书时间').AsString);
SubItems.Add(DateTimeToStr(incMonth(FieldByName('借书时间').AsDateTime,Imvalue.lendTime)));
end;
next;
end;
end;
end;
//取得图书信息
procedure TForm1.GetBookInfo;
begin
if editSearch.Text='' then
begin
showmessage('请输入要查询的内容');
exit;
end
else begin
ClientDataSet1.Active:=False;
ClientDataSet1.Data:=SBookInfo.GetBookInfo(CBStlye.Text,
CBRange.Text,EditSearch.Text,EditNum.Text);
ClientDataSet1.Active:=True;
end;
ListView2.Items.Clear;
with ClientdataSet1 do
begin
While not Eof do
begin
with ListView2.Items.Add do
begin
caption:=fieldByName('书号').AsString;
SubItems.Add(fieldByName('书名').AsString);
SubItems.Add(fieldByName('作者').AsString);
SubItems.Add(fieldByName('出版社').AsString);
SubItems.Add(fieldByName('类型').AsString);
SubItems.Add(fieldByName('借还').AsString);
SubItems.Add(fieldByName('所在室').AsString);
SubItems.Add(fieldByName('所在区').AsString);
SubItems.Add(fieldByName('位置').AsString);
end;
next;
end;
end;
end;
//-----------------------------------------end.