[Lazarus-es] ventanas no modales

José Mejuto joshyfun en gmail.com
Vie Jul 29 22:07:49 CEST 2011


Hello Paola,

Friday, July 29, 2011, 7:04:13 PM, you wrote:

>> ahora las declaré en la sección Implementation del formulario principal.
PB> de todas maneras, el closeAction:= caFree me deja "mugre" en la 
PB> variable, por tanto, no puedo usar el if Assigned(f5)...
PB> debería poner f5:= nil... pero debería f5 ser global, porque sino "no
PB> existe" obviamente.

No, no las hagas globales, no es necesario y sólo te va a complicar la
vida, hazla local al procedimiento que hace el Create nada más, si
quieres una referencia a esa ventana desde otro punto del código has
de usar el "ReciclaVentana" para que te devuelva un puntero a ese
form. Ejemplo:

procedure CreaElForm();
var
  F5: TF5;
begin
  TForm(F5):=ReciclaVentana('TF5');
  if not Assigned(F5) then begin
    F5:=TF5.Create(Self);
  end;
  F5.Show;
end;

procedure OtraFuncionQueNecesitaF5();
var
  LaMismaf5: TF5;
begin
  TForm(LaMismaf5):=ReciclaVentana('TF5');
  if Assigned(LaMismaf5) then begin
    LaMismaf5.ActualizaValores();
  end else begin
    DebugLn('La ventana F5 no está disponible, no creada o destruida');
  end;
end;

PB> En qué lugar aconsejan Uds declarar todas las variables de los 
PB> formularios? en alguna unidad global?

No, no... De esas ventanas sólo puede haber una instancia por lo que
comentas (ya que antes eran modales) por lo tanto lo más fácil es usar
el método del "reciclaventana" ya que otras implementaciones más
"limpias" son mucho más complejas.

La ventana no está referenciada por ninguna variable, digamos que
simplemente existe, con el "reciclaventana" le pedimos que nos busque
entre las creadas una de la clase que digamos, y que nos la entregue
de vuelta.

-- 
Best regards,
 José





More information about the Lazarus-es mailing list