趣百科

Delphi7创建、使用和销毁接口

编辑:Simone 2025-01-14 03:17:54 598 阅读

Delphi7创建、使用和销毁接口

Delphi7创建、使用和销毁接口,接口是不能实例化的,所以必须用类继承接口才可以实例化

打开Delphi7集成开发环境,在默认的工程中,新建Unit

在Unit2.pas文件增加一个接口,并增加一个类实现这个接口,完整代码如下:

unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type IMyInter=interface function DoSomething:string; end; TMyClass=class(TObject,IMyInter) private FRefCount:Integer; FValue:Integer; public constructor create(AValue:Integer); //IUnkown接口 function QueryInterface(const IID:TGUID;out Obj):HRESULT;stdcall; function _AddRef:Integer;stdcall; function _Release:Integer;stdcall; //IMyInter接口 function DoSomething:string; //增加过程 procedure SetVaule(AValue:Integer); end;implementation{ TMyClass }function TMyClass._AddRef: Integer;begin Inc(FRefCount); Result:=FRefCount;end;function TMyClass._Release: Integer;begin Dec(FRefCount); Result:=FRefCount; if FRefCount=0 then Destroy;end;constructor TMyClass.create(AValue: Integer);begin inherited create(); FValue := AValue;end;function TMyClass.DoSomething: string;begin showMessage('FValue is'+inttostr(FValue))end;function TMyClass.QueryInterface(const IID: TGUID; out Obj): HRESULT;const E_NOINTERFACE=$8004002;begin if GetInterface(IID,Obj) then Result:=0 else Result:=E_NOINTERFACE;end;procedure TMyClass.SetVaule(AValue: Integer);begin FValue:=AValue;end;end.注意,接口都是继承自IUnknown,所以必须要实现QueryInterface,_AddRef和_Release三个方法

在Form1窗体放一个button按钮

双击这个按钮进入事件方法,写代码如下:

procedure TForm1.btn1Click(Sender: TObject);var my:TMyClass;begin my := Unit2.TMyClass.create(12); my.SetVaule(13); my.DoSomething; my.Free;end;

注意要uses Unit2 要添加到引用模块单元

F9运行代码,点击Button按钮,会弹出对话框如下图所示

改写button的点击事件方法,使用接口声明,代码如下:

procedure TForm1.btn1Click(Sender: TObject);var my:IMyInter;begin my := Unit2.TMyClass.create(12); my.SetVaule(13); my.DoSomething;end;

这里注意接口声明的变量不用free释放,会自动释放

F9运行代码会报错‘[Error] Unit1.pas(33): Undeclared identifier: 'SetVaule'’,因为接口并没有SetValue方法,是实现这个接口的类才有这个方法,尽管my是使用TMyClass类创建的也不行

去掉报错这行代码,再次运行程序,点击按钮弹出对话框

版权声明:本站【趣百科】文章素材来源于网络或者用户投稿,未经许可不得用于商用,如转载保留本文链接:https://www.qubaik.com/answer/118492.html

相关推荐