Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   llamar a un formulario (https://www.clubdelphi.com/foros/showthread.php?t=3129)

Michel 22-08-2003 22:06:48

llamar a un formulario
 
Como hago para llamar a un formulario.



El problema es que yo quiero llamar a un formulario por me dio de un String



Ejemplo

var
oForm1 : string;



oform1 tiene el nombre del formulario q deseo llamar q esta en una tabla

oform1.show;


Como lo hagoo

Gracias

fabianbbg 25-08-2003 00:58:10

Hola
Proba.. definir el nombre del form no como un string sino como un objeto, en el ejemplo el form1 llama al form dos en el evento click del buttom 1, crea dos forms, y pegale esto.. espero que te sirva
form2 seri ael nombre del form porsupuesto


procedure TForm1.Button1Click(Sender: TObject);
var
f:tobject;
begin
f:=form2;
tform(f).ShowModal;

end;

end.

gatosoft 26-08-2003 21:47:50

Prueba la siguiente función:

Código:

Function Get_Frm(pNombreFrm:String):Tform;
Var i:Integer;
    vFrm:Tform;
Begin
Result:=nil;
  For i:=0 to Screen.FormCount-1 do
    Begin
      vFrm:=Screen.Forms[i];
      if UpperCase(vFrm.ClassName)=UpperCase('T'+pNombreFrm) then
        Begin
        Result:=vFrm;
        Exit;
        end;//if
    end; //For i
end;

Esta te devloverá todos los formularios que estan Creados pero no son visibles. (Estos se guardan en la lista Screen.Forms[i]);

Para probar como funciona, debes hacer lo siguiente:

Código:

procedure TForm1.Button1Click(Sender: TObject);
var Elform:Tform;
begin
  Elform:=Get_Frm('Form2');
  if ElForm=nil then
    showmessage('No se puede mostrar el formulario')
  else
    ElForm.Show;
end;

Esto es solo para formularios que no se crean dinámicamente.
si lo quisieras hacer con formularios dinámicos, Lo ideal seria hacer algo como:

Código:


Código erróneo....

  pNombreFrm:='Form3';
  vFrm:=TFormClass('T'+pNombreFrm).Create(Application);
  (vFrm as TFormclass('T'+pNombreFrm)).showmodal;

Pero eso no funciona.... Entonces por ahora (mientras averiguamos como hacerlo), deberias ser mas explicito y evaluar tu cadena de texto asi:

if Uppercase(pNombreFrm)='FRMPRINCIPAL' then
begin
frmPrincipal:=TFrmPrincipal.create(self);
frmPrincipal.show;
end;


..etc...


Saludos....

roman 27-08-2003 07:41:32

Michel:

Puedes crear un objeto a partir del nombre de su clase usando la función GetClass en clases previamente registradas con el procedimiento RegisterClass.

Para el caso específico de formularios podrías hacer lo siguiente:

En la sección initialization de cada formulario que desees crear dinámicamente por medio del ombre de su clase registras ésta:

Código:

unit Unit2;

interface

uses
  Classes, Forms;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

initialization
  RegisterClass(TForm2);
end.

Después, para crear en código el formulario utiliza la siguiente función:

Código:

function CreaFormulario(Owner: TComponent; Nombre: String): TForm;
var
  FormaClase: TFormClass;

begin
  FormaClase := TFormClass(GetClass(Nombre));
  if FormaClase <> nil
    then Result := FormaClase.Create(Owner)
    else Result := nil;
end;

Usas esta función así:

Código:

var
  Forma: TForm;
 
begin
  Forma := CrearFormulario(Self, oForm);
  if Forma <> nil then
    Forma.Show
  else
    Application.MessageBox('Clase no registrada', 'Error', );
end;

Donde "Self" se refiere al formulario desde donde creas los otros formularios y "oForm" es un string con el nombre de la clase de formulario que desees crear.

Quizá te convenga revisar el siguiente hilo

http://www.clubdelphi.com/foros/arch...hlight=fabrica

así como las referencias que allí se indican que tratan este tema con más detalle. En particular quizá encuentres útil el concepto de "fábrica de clases".

// Saludos


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

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