PDA

Ver la Versión Completa : Como liberar EmbeddedForm??


RedVenom
11-01-2014, 19:38:25
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:

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
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:
Action:= caFree;

En FireMonkey es:
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
...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.


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.