码迷,mamicode.com
首页 > 其他好文 > 详细

GetClass与RegisterClass的应用一例

时间:2017-01-30 23:36:08      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:virt   子类   app   initial   forms   窗体   src   signed   class   

这是转来的一篇文章,我自己在项目中也使用到了类似于根据类名创建类实例并调用相应函数的功能。具体代码我会在今后发布出来。

利用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.

 

http://www.cnblogs.com/gxch/archive/2011/04/23/GetClass.html

GetClass与RegisterClass的应用一例

标签:virt   子类   app   initial   forms   窗体   src   signed   class   

原文地址:http://www.cnblogs.com/findumars/p/6358468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!