Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   Como liberar EmbeddedForm?? (https://www.clubdelphi.com/foros/showthread.php?t=84993)

RedVenom 11-01-2014 19:38:25

Como liberar EmbeddedForm??
 
Cree una EmbeddedForm en un panel en una aplicación firemonkey pero ahora no se como liberarla, ya que caFree no funciona.

Alguien que me pueda decir como hacerlo???

Gracias.

Neftali [Germán.Estévez] 12-01-2014 18:28:11

¿Puedes poner el código de cómo lo creaste?
No me acaba de quedar claro de qué estamos hablando...

RedVenom 13-01-2014 06:29:41

Esto es lo que estoy haciendo:

Código Delphi [-]
unit UnidadPrincipal;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMX.StdCtrls, FMX.Objects, FMX.Ani;

type
  TFormPrincipal = class(TForm)
    PanelBts: TPanel;
    BtCorrespondencia: TSpeedButton;
    Label1: TLabel;
    Image1: TImage;
    Image2: TImage;
    PanelFormas: TPanel;
    procedure BtCorrespondenciaClick(Sender: TObject);
    procedure IncrustarForm(AParent:TControl; AForm:TCustomForm);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormPrincipal: TFormPrincipal;

implementation

{$R *.fmx}
Uses UnidadCorrespondencia;

procedure TFormPrincipal.BtCorrespondenciaClick(Sender: TObject);
begin
  IncrustarForm(PanelFormas, Correspondencia.Create(Self));
end;

procedure TFormPrincipal.IncrustarForm(AParent:TControl; AForm:TCustomForm);
begin
  while AForm.ChildrenCount>0 do
    AForm.Children[0].Parent:=AParent;
end;

Pero me da un error a la hora de correr el procedimiento, me pone error Access Violation.

RedVenom 13-01-2014 07:47:54

1 Archivos Adjunto(s)
Aquí esta mi proyecto, no se que estaré haciendo mal.
Espero me puedan ayudar revisándolo.

Neftali [Germán.Estévez] 13-01-2014 21:03:00

Creo que lo que estás haciendo ahí (si no entiendo mal) es "pasar" todos los componentes al nuevo Parent (pero no el form).
Pasándolos de nuevo al Parent original, debería bastar.

No lo he probado con FMX, pero con VCL, puedes "incluir" el form completo, no sólo los componentes.

Por otro lado, el proyecto que has enviado da error. ¿Seguro que es lo que estás utilizando?

Neftali [Germán.Estévez] 13-01-2014 21:32:27

Vale. El error ya está corregido (faltaba una T en la creación del form).
Ahora lo que no me queda claro, es a qué te refieres con "liberarla".

¿Te refieres al form?

RedVenom 13-01-2014 21:42:45

Ya puedo liberarla, es que en FireMonkey es diferente la instrucción que en VCL.

En VCL es:
Código Delphi [-]
Action:= caFree;

En FireMonkey es:
Código Delphi [-]
Action:= TCloseAction.caFree;

RedVenom 13-01-2014 21:46:23

Gracias por la ayuda Neftalí, ahora tengo otra duda como puedo crear una variable TClassForm en FireMonkey, esto es con la intención de que dependiendo el botón le pase el nombre de la Form al procedimiento.

Neftali [Germán.Estévez] 13-01-2014 21:57:13

Cita:

Empezado por RedVenom (Mensaje 471645)
...esto es con la intención de que dependiendo el botón le pase el nombre de la Form al procedimiento.

Será la clase del form (o el nombre de la clase), no el nombre, ¿no?

Neftali [Germán.Estévez] 13-01-2014 22:03:49

No se si te refieres a esto, pero en FMX puedes pasar la referencia a la clase del form, de la misma manera a como lo haces en VCL.

Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls;

type

  TClassForm = Class of TForm;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure OpenForm(AClassForm:TClassForm);
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2, Unit3;

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenForm(TForm3);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  OpenForm(TForm2);
end;

procedure TForm1.OpenForm(AClassForm: TClassForm);
var
  f:TForm;
begin
  f := AClassForm.Create(Application);
  f.Show;
end;

end.

De esta forma el procedimiento OpenForm, te sirve para abrir cualquier formulario sea de la clase que sea, sólo pasando la clase.
Si quieres pasar el nombre de la clase, tendrás que registrar la clase y obtenerla a partir del nombre usando RTTI, como se hace en VCL.


La franja horaria es GMT +2. Ahora son las 09:48: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