Criando uma instância de classe à partir do seu nome (string)


Amigos estou trazendo um exemplo de como criar uma classe à partir de seu nome ( String ),  eu já vi alguns exemplos de como fazer isso utilizando forms, mas para classes normais eu ainda não tinha visto nenhum exemplo, então segue abaixo a solução que eu criei.
1- Primeiro crie um form simples como o da figura abaixo tendo 3 edits , 1 bitbtn e 2 labels;
2- Renomeie os componentes conforme o exemplo, por favor.
3- É só clicar no botão e acompanhar ( debug ) para ver o que é feito no código, o efeito de tela nada mais é que o preenchimento dos dois edits de baixo com o valor das propriedades setadas no código.
4- No meu caso a primeira classe eu fiz descendente de TDataModule por uma necessidade minha, mas na realidade ela deve ser descendente de TPersistent



Imagem do form



unit UCriarClasseString;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, AdvSmoothDock, jpeg, ExtCtrls, StdCtrls, Buttons;


type


  TminhaClasse = class (TDataModule)
  private
    FPrimeiraClasse: String;
    procedure SetPrimeiraClasse(const Value: String);
  published
    property PrimeiraClasse:String read FPrimeiraClasse 
    write SetPrimeiraClasse;
  end;


  TMinhaSegundaClasse = class(TminhaClasse)
  private
    FSegundaClasse: STring;
    procedure SetSegundaClasse(const Value: STring);
  published
    property SegundaClasse:STring read FSegundaClasse 
    write SetSegundaClasse;
  end;

  TfrmCriarClasseString = class(TForm)
    btClasse: TBitBtn;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure btClasseClick(Sender: TObject);
  private
    { Private declarations }
    procedure InstanceClasse(AClassName: String);
  public
    { Public declarations }
  end;

var
  frmCriarClasseString: TfrmCriarClasseString;

implementation


{$R *.dfm}


procedure TfrmCriarClasseString.btClasseClick(Sender: TObject);
begin
  InstanceClasse(Edit1.Text);
end;

procedure TfrmCriarClasseString.InstanceClasse
(AClassName: String);
var
  lObj: TMinhaSegundaClasse;
  Pers: TPersistentClass;
begin
  Pers := GetClass(AClassName);
  lObj := (Pers.Create) as TMinhaSegundaClasse;

  if Assigned(lObj) then
  try
    lObj.FPrimeiraClasse := 'Propriedade da Classe ancestral';
    lObj.FSegundaClasse  := 'Propriedade da Segunda Classe';
    Edit2.Text :=lObj.FPrimeiraClasse;
    Edit3.Text :=lObj.FSegundaClasse;
  finally
    lObj.Free;
  end
end;


{ TminhaClasse }

procedure TminhaClasse.SetPrimeiraClasse(const Value: String);
begin
  FPrimeiraClasse := Value;
end;


{ TMinhaSegundaClasse }
procedure TMinhaSegundaClasse.SetSegundaClasse(const 
Value: STring);
begin
  FSegundaClasse := Value;
end;


initialization
  RegisterClasses([TminhaClasse, TMinhaSegundaClasse]);

end.


Link para os arquivos:
UCriarClasseString.pas
UCriarClasseString.dfm

1 comment

Anônimo disse...

Mto legal, vlw

Postar um comentário

 
|  JoséHenriqueBR. Blogger Template By Lawnydesignz Powered by Blogger