Saturday, December 29, 2007

Instanciação dinâmica - VCL e VCL.NET

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: