PDA

Ver la Versión Completa : ¿Crear Objetos a Partir de un String?


ChigoCDL
30-04-2018, 18:11:31
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:

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.


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:


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í (https://www.thoughtco.com/create-delphi-form-from-a-string-1057672).

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.


ClaseCrear: String;
...
ClaseCrear := 'frmCatalogoEmpleados'; //frmCatalogoEmpleados


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