[Delphi] GetClass与RegisterClass的应用一例
利用GetClass与RegisterClass可以实现根据字符串来实例化具体的子类,这对于某些需要动态配置程序的场合是很有用的。其他的应用如子窗体切换,算法替换等都能得到应用。
unit Example1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end ;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end ;
ILog = interface(IUnknown)
[ ' {A65044FC-644C-482A-BBFF-50A618835FC6} ' ]
procedure WriteMessage;
end ;
[ ' {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 ;
public
class function CreateInstance(Name: string): TLog; overload;
procedure WriteMessage; virtual; abstract;
end ;
TTextLog = class(TLog)
public
procedure WriteMessage; override;
end ;
public
procedure WriteMessage; override;
end ;
TXMLLog = class(TLog)
public
procedure WriteMessage; override;
end ;
public
procedure WriteMessage; override;
end ;
TNullLog = class(TLog)
public
procedure WriteMessage; override;
end ;
public
procedure WriteMessage; override;
end ;
var
Form1: TForm1;
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 ;
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 ;
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 ;
begin
// 写入到文本文件
end ;
{ TXMLLog }
procedure TXMLLog.WriteMessage;
begin
// 写入到XML文件
end ;
begin
// 写入到XML文件
end ;
{ TNullLog }
procedure TNullLog.WriteMessage;
begin
{ nothing need to do }
end ;
begin
{ nothing need to do }
end ;
initialization
RegisterClass(TTextLog);
RegisterClass(TXMLLog);
RegisterClass(TNullLog);
RegisterClass(TTextLog);
RegisterClass(TXMLLog);
RegisterClass(TNullLog);
finalization
UnRegisterClass(TTextLog);
UnRegisterClass(TXMLLog);
UnRegisterClass(TNullLog);
UnRegisterClass(TTextLog);
UnRegisterClass(TXMLLog);
UnRegisterClass(TNullLog);
end .
一花独放不是春,百花齐放春满园!
让机器视觉应用满天下,解放人类的眼睛和大脑!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律