PDA

Ver la Versión Completa : Varias Dudas


mauro
10-07-2003, 03:38:02
Hola, que tal?

1. Como hago para cerar un formulario, o sea
descargarlo, probe usando el metodo
form.free, pero si lo abro y lo cierro varias
veces me tira errores.

2. como se si un formulario ya esta cargado,
ya que si uso dos veces la funcion createform,
me crea 2 veces el formulario y lo que necesito
es que se cree una sola vez.

muchas gracias.

roman
10-07-2003, 07:32:42
No especificas desde dónde llamas al form.free pero no puedes hacerlo desde un método de la misma forma. Usa el método Release en su lugar.

Por otro lado quizá te convenga más usar el evento OnClose del form poniendo Action := caFree. Esto hace que el form se libere cuando se cierra.

En cuanto a la segunda pregunta hay dos maneras de hacerlo.

La más fácil es usar la variable global en la unidad del form. Digamos que Form2 es el formulario que deseas que se cree una sóla vez. Cuando lo crees usas:

if Form2 = nil then
Form2 := TForm2.Create(nil);

Form2.Show;

Y en el evento OnDestroy de Form2 pones:

Form2 := nil;


El problema con esto es que utilizas una variable global además de referirte a una instancia particular de una clase (Form2) dentro de la misma clase(TForm2), ambas cosas no muy recomendadas por los expertos.

La manera "difícil" en realidad es fácil :)

Suponiendo que abres Form2 desde el formulario principal (Form1) puedes declararla como propiedad de este:


type
TForm1 = class
...
public
Form: TForm2;
end;


Y procedes igual que en el caso anterior para crearla: verificas que sea distinta de nil.

Con esto ya evitaste el uso de una variable global. El punto está ahora en cómo poner en nil la variable cuando el formulario se destruya. La solución es "pedirle" a Form2 que le avise a Form1 que se destruye. Para ello, modifica la creación de Form2 como sigue:

if Form2 = nil then
begin
Form2 := TForm2.Create(nil);
Form2.FreeNotification(Self);
end;

Form2.Show;


FreeNotification indica a Form2 que notifique a Form1 (Self) cuando se cree o se destruya. Form1 se entera de esto con el método Notofication:

procedure Notification(
AComponent: TComponent; Operation: TOperation); override;


que codificas así:

procedure TForm1.Notification(
AComponent: TComponent; Operation: TOperation);
begin
if (Operation = opRemove) and (AComponent = Form) then
Form := nil
else
inherited;
end;


Espero no haberte causado mucha confusión.

// Saludos