Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Controlar instancias de un Tform dentro de un TPanel (https://www.clubdelphi.com/foros/showthread.php?t=94559)

wilcg 01-04-2020 07:43:35

Controlar instancias de un Tform dentro de un TPanel
 
Amigos del foro, de antemano agradecerles su ayuda.
estoy tratando de meter muchos Forms dentro de un Panel mediante una función, pero al mismo tiempo quiero controlar las instancias de los formularios que ya se encuentran dentro del TPanel. Si ya esta dentro simplemente hacerlo visible a dicho form.
Código Delphi [-]
Procedure ShowFormTPanel( TfrmClass: TFormClass; bMultiInstace : boolean );
var
  i : SmallInt;
  F : TForm;
begin
  if not bMultiInstace then
    for i := TPanel1.ComponentCount - 1 downto 0 do
    begin
      F := TPanel1.Components[i];
      if F.ClassType = TfrmClass then
      begin
        F.BringToFront;
        Exit;
      end;
    end;

  with TfrmClass.Create(Application) do
  begin
    Parent   := TPanel1;
    Align    := alClient;
    Position := poMainFormCenter;
    Show;
  end;

end;

Para ser llamado así
Código Delphi [-]
ShowFormTPanel( TfClientes, False );
Por el momento no esta funcionando, necesito de ustedes.

kuan-yiu 01-04-2020 08:25:04

Yo para mostrar un formulario que no sé si ya ha sido creado uso esto:
Código Delphi [-]
   if not (Assigned(fFormulario)) then
      Application.createform(tfFormulario, fFormulario);
   fFormulario.show;

Neftali [Germán.Estévez] 01-04-2020 13:39:39

Cita:

Empezado por wilcg (Mensaje 536575)
Por el momento no esta funcionando, necesito de ustedes.


Estaría bien que dijeras porqué no está funcionando.
¿No te compila? ¿Te da un error? ¿Cual?
¿Si te compila, pero no hare lo que esperas?

Algunos comentarios más....
* No estás destruyendo los formularios que creas.
* Si pasas parámetros a la función, pasa también el panel (TPanel1)

aledieb 01-04-2020 20:54:28

Por que no recorres screen.forms podes buscar por nombre o por caption y cuando encontras el que te interesa haces screen.forms[nro].show

wilcg 01-04-2020 21:35:21

Gracias amigos por los aportes,
la idea de esta función es poder usarla de manera independiente desde toda la aplicación con tan solo invocar la función y una linea de código. Hasta el momento lo he hecho de esta manera y funciona perfecto, si hay un aporte en que se pueda corregir o mejorar excelente.
Código Delphi [-]
Procedure ShowFormTPanel( TfrmClass: TFormClass; Panel :TPanel );
var
  i : SmallInt;
  Lista: TList;
begin

  Lista := TList.Create;
  try
    Panel.GetTabOrderList(Lista);
    for i := 0 to Lista.Count - 1 do
      if TWinControl(Lista[i]) is TForm then
        if TForm(Lista[i]).ClassType = TfrmClass then
        begin
          TForm(Lista[i]).BringToFront;
          Exit;
        end;

    with TfrmClass.Create(Application) do
    begin
      Parent   := Panel;
      Align    := alClient;
      Position := poMainFormCenter;
      Show;
    end;

  finally
    Lista.Free;
  end;
end;

Uso:
Código Delphi [-]
ShowFormTPanel( TForm2, Pane1 );
y con respecto a liberar el form, en el evento OnClose de esta manera.
Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

ecfisa 01-04-2020 21:51:50

Hola.

Yo la modificaría un poco,
Código Delphi [-]
procedure ShowFormIn(frmClass: TFormClass; Container: TWinControl);
var
  i : Integer;
begin
  for i := Screen.FormCount-1 downto 0 do
  if Screen.Forms[i] is frmClass then
  begin
    Screen.Forms[i].BringToFront;
    Exit;
  end;
  with frmClass.Create(Application) do
  begin
    Parent   := Container;
    Align    := alClient;
    Position := poMainFormCenter;
    Show;
  end;
end;

De ese modo te permitirá usar diferentes contenedores, por ejemplo:
Código Delphi [-]
begin
  ShowFormIn(TForm2, Memo1);
  ShowFormIn(TForm3, Edit1);
  ShowFormIn(TForm4, Panel1);
  ShowFormIn(TForm5, ListBox1);
end;

Saludos :)

wilcg 01-04-2020 22:08:28

Maestro ecfisa, gracias por la corrección. Ahora si ya esta completa.


La franja horaria es GMT +2. Ahora son las 04:37:23.

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