Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Crear Objetos a Partir de un String? (https://www.clubdelphi.com/foros/showthread.php?t=93052)

ChigoCDL 30-04-2018 18:11:31

¿Crear Objetos a Partir de un String?
 
Hola, soy nuevo en Delphi y también en el foro, recientemente me he encontrado con un problema.
Estoy haciendo parte de un sistema, en donde a partir de un string, que contiene el nombre de una clase, se tiene que crear un objeto de esa clase.
Por ejemplo:

ClaseCrear: String;

ClaseCrear := 'frmCatalogoEmpleados'; //frmCatalogoEmpleados es un formulario, ahora, lo que se tiene que hacer, es crear un objeto de ese formulario, para poder recorrer los componentes

¿Alguien me podría ayudar?

De antemano, muchas gracias.
PD. Una disculpa si la pregunta es demasiado tonta, la verdad es que he buscado información, pero no encuentro cosas relacionadas.

orodriguezca 30-04-2018 19:45:04

Creo que para esto existe la función GetClass, pero nunca he tenido esa necesidad por lo que no puedo dar más detalles.

bucanero 30-04-2018 20:07:06

Hola a todos

todo depende de la clase de objetos que pretendas buscar y encontrar, en particular si trabajas con frames/Forms este método te puede servir. Prueba el siguiente código:

Código Delphi [-]
unit UnitMiFrame;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMiFrame = class(TFrame)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

procedure TMiFrame.Button1Click(Sender: TObject);
begin
  MessageDlg('Hola mundo', mtWarning, [mbOK], 0);
end;

initialization
  /// ESTA PARTE ES MUY IMPORTANTE. Registrar la clase para que se pueda localizar mas adelante.
  RegisterClass(TMiFrame);
end.

Código Delphi [-]
type
  TClassFrame = class of TFrame;

procedure TForm1.Button1Click(Sender: TObject);
var
  FPersistentClass: TPersistentClass;
  ClassFrame:TClassFrame;
  frame: TFrame;
begin
  FPersistentClass := FindClass('TMiFrame');
  if Assigned(FPersistentClass) and (FPersistentClass.InheritsFrom(TFrame)) then begin
    ClassFrame := TClassFrame(FPersistentClass);
    try
      frame := ClassFrame.Create(self);
      frame.Parent := Self;
      frame.Left := 100;
      frame.Top := 100;
    except
      on E: Exception do
        MessageDlg(E.message, mtError, [mbOK], 0);
    end;
  end;
end;

Un saludo

AgustinOrtu 30-04-2018 20:10:42

Que version de Delphi? Con la RTTI nueva podes invocar dinamicamente al constructor de una clase:

Código Delphi [-]
var
  ctx:TRttiContext;
  t: TRttiType;
  f: TValue;
begin
  ctx := TRttiContext.Create;
  t:= ctx.FindType('Unidad.TfrmCatalogoEmpleados'); // nombre calificado, el que se obtiene haciendo TfrmCatalogoEmpleados.QualifiedClassName
  f:= t.AsInstance.GetMethod('Create').Invoke(t.MetaclassType,[nil]); // aca pasas parametros, por ejemplo, owner o los que necesite tu formulario
end;

ecfisa 01-05-2018 16:43:29

Hola.

Una propuesta similar, por Zarko Gajic, para crear un form a partir de un string aquí.

Saludos :)

Neftali [Germán.Estévez] 02-05-2018 10:05:40

Además de todo lo dicho por los compañeros, sólo comentar que estaría bien que pusieras algo de código referente a cómo está definido el formulario, porque eso que has puesto, parece más la instancia, que la clase.

Código Delphi [-]
ClaseCrear: String;
...
ClaseCrear := 'frmCatalogoEmpleados'; //frmCatalogoEmpleados

A parte de ese detalle, por RTTI no deberías tener mayores problemas.


La franja horaria es GMT +2. Ahora son las 09:09:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi