![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
|
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 |
|
#2
|
||||
|
||||
|
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. |
|
#3
|
||||
|
||||
|
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;
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;
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;
if Uppercase(pNombreFrm)='FRMPRINCIPAL' then begin frmPrincipal:=TFrmPrincipal.create(self); frmPrincipal.show; end; ..etc... Saludos.... |
|
#4
|
||||
|
||||
|
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.
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;
Código:
var
Forma: TForm;
begin
Forma := CrearFormulario(Self, oForm);
if Forma <> nil then
Forma.Show
else
Application.MessageBox('Clase no registrada', 'Error', );
end;
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 |
![]() |
|
|
|