您的位置:首页 > 其它

GETCLASS与REGISTERCLASS的应用一例

2017-02-04 14:51 369 查看
利用GetClass与RegisterClass可以实现根据字符串来实例化具体的子类,这对于某些需要动态配置程序的场合是很有用的。其他的应用如子窗体切换,算法替换等都能得到应用。

unit Example1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;

ILog = interface(IUnknown)
['{A65044FC-644C-482A-BBFF-50A618835FC6}']
procedure WriteMessage;
end;

TLog = class(TInterfacedPersistent, ILog)
public
class function CreateInstance(Name: string): TLog; overload;
procedure WriteMessage; virtual; abstract;
end;

TTextLog = class(TLog)
public
procedure WriteMessage; override;
end;

TXMLLog = class(TLog)
public
procedure WriteMessage; override;
end;

TNullLog = class(TLog)
public
procedure WriteMessage; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
Log: TLog;
begin
{ 实际应用中可以从配置中读取字符串来决定实例化具体的子类 }
Log := TLog.CreateInstance('TXMLLog');
if Assigned(Log) then
begin
Log.WriteMessage;
Log.Free;
end;
end;

class function TLog.CreateInstance(Name: string): TLog;
var
AClass: TPersistentClass;
begin
Result := nil;
AClass := GetClass(Name);
if Assigned(AClass) then
begin
Result := AClass.NewInstance as TLog;
Result.Create;
end
else
{ error handle }
end;

{ TTextLog }

procedure TTextLog.WriteMessage;
begin
//写入到文本文件
end;

{ TXMLLog }

procedure TXMLLog.WriteMessage;
begin
//写入到XML文件
end;

{ TNullLog }

procedure TNullLog.WriteMessage;
begin
{ nothing need to do }
end;

initialization
RegisterClass(TTextLog);
RegisterClass(TXMLLog);
RegisterClass(TNullLog);

finalization
UnRegisterClass(TTextLog);
UnRegisterClass(TXMLLog);
UnRegisterClass(TNullLog);

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: