unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;type
TIBillOperate= interface //接口類
['{D59DE540-C923-430C-A030-36B615778A90}']
procedure SetBillData;
end;
TBillHead = Class(TInterfacedObject,TIBillOperate) //-實現類
procedure SetBillData;virtual;
end;
TMyBillHead = class(TBillHead) //實現繼承類
procedure SetBillData;override;
end;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
aa: TBillHead;//對象
public
procedure SetBill(BillObj: TIBillOperate); //操作接口對象
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TBillHead.SetBillData;
begin
showMessage('TBillHead');
end;
procedure TMyBillHead.SetBillData;
begin
showMessage('TMyBillHead');
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SetBill(aa); //-----------------------------------第二次按Button就出錯!!
// SetBill(TMyBillHead.Create); 改成這樣就可以了
end;procedure TForm1.FormCreate(Sender: TObject);
begin
aa:= TMyBillHead.Create;
end;
procedure TForm1.SetBill(BillObj: TIBillOperate);
begin
BillObj.SetBillData;
end;
end.我的意思是想在按一個button來通過SetBill(BillObj: TIBillOperate)來實現調用不同對象的SetBillData方法;但是為什麼第一次操作可以,但第二次再調用時就出錯地址錯?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;type
TIBillOperate= interface //接口類
['{D59DE540-C923-430C-A030-36B615778A90}']
procedure SetBillData;
end;
TBillHead = Class(TInterfacedObject,TIBillOperate) //-實現類
procedure SetBillData;virtual;
end;
TMyBillHead = class(TBillHead) //實現繼承類
procedure SetBillData;override;
end;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
aa: TBillHead;//對象
public
procedure SetBill(BillObj: TIBillOperate); //操作接口對象
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TBillHead.SetBillData;
begin
showMessage('TBillHead');
end;
procedure TMyBillHead.SetBillData;
begin
showMessage('TMyBillHead');
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SetBill(aa); //-----------------------------------第二次按Button就出錯!!
// SetBill(TMyBillHead.Create); 改成這樣就可以了
end;procedure TForm1.FormCreate(Sender: TObject);
begin
aa:= TMyBillHead.Create;
end;
procedure TForm1.SetBill(BillObj: TIBillOperate);
begin
BillObj.SetBillData;
end;
end.我的意思是想在按一個button來通過SetBill(BillObj: TIBillOperate)來實現調用不同對象的SetBillData方法;但是為什麼第一次操作可以,但第二次再調用時就出錯地址錯?
第一次能操作,是aa还存在。
在第一次操作时,aa作为一个接口传入函数,
在函数中被自动销毁,因为接口当引用数为0时就会自动销毁。
这样的话,你的aa 就不存在了。
所以你第二次就出错。但是你用SetBill(TMyBillHead.Create);
每次都有一个新的,所以不会出错。
一个对象可以不使用接口引用,但一旦一个对象使用了接口引用。。则必须维持引用。否则对象会释放。
楼主的程序,只要第一次调用了SetBill之后。。对象就会被释放。
procedure SetBill(BillObj: TBillHead1 );overload; //操作接口對象
procedure SetBill(BillObj: TBillHead2 );overload;
procedure SetBill(BillObj: TBillHead3 );overload;
1.你可以传递一个var 类型的 如: var BillObj: TIBillOperate2.也可以写为 const BillObj: TIBillOperate3.在创建对象的时候赋给引用