Tema: Varias Dudas
Ver Mensaje Individual
  #2  
Antiguo 10-07-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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:
Código:
if Form2 = nil then
  Form2 := TForm2.Create(nil);

Form2.Show;
Y en el evento OnDestroy de Form2 pones:
Código:
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:

Código:
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:
Código:
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:
Código:
procedure Notification(
  AComponent: TComponent; Operation: TOperation); override;
que codificas así:
Código:
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

Última edición por roman fecha: 10-07-2003 a las 07:36:25.
Responder Con Cita