在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
利用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 .
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论