Utilizo bastante a instanciação dinâmica de classes em bibliotecas e projetos Delphi. Algumas vezes a partir do nome da classe, outras a partir da classe propriamente dita. No meu caminho de migração - ou melhor, compatibilização - de algumas bibliotecas para a VCL.NET criei duas funções utilitárias que me permitem trabalhar com o mesmo fonte tanto para Win32 quanto para .NET. A unit segue abaixo. Um projeto completo mostrando a utilização pode ser encontrado aqui.
unit uCreateInstance;
interface
uses
Classes, SysUtils;
function CreateInstance(AClass: TClass): TObject; overload;
function CreateInstance(AClassName: string): TObject; overload;
implementation
function CreateInstance(AClass: TClass): TObject;
begin
{$IFDEF CLR}
Result := Activator.CreateInstance(AClass.ClassInfo); // .NET
{$ELSE}
Result := AClass.Create; // Win32
{$ENDIF}
end;
function CreateInstance(AClassName: string): TObject;
var
AClass: TClass;
begin
AClass := GetClass(AClassName);
if not Assigned(AClass) then
raise Exception.Create('A classe "' + AClassName + '" não está registrada.');
Result := CreateInstance(AClass);
end;
end.
No comments:
Post a Comment