Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Asignar NIL a un formulario (https://www.clubdelphi.com/foros/showthread.php?t=34673)

Caro 17-08-2006 17:36:04

Asignar NIL a un formulario
 
Hola a todos

Como puedo asignar el valor nulo a un formulario que creo dinamicamente, y lo libero utilizando screen.

Si hago de esta forma, me da este error cuando lo compilo "Cannot assign to a read-only property"

Código Delphi [-]
    For i:=0 to screen.FormCount-1 Do
    begin
         If screen.Forms[i].name=forma Then
         begin
              screen.Forms[i].Free;
              screen.Forms[i]:=NIL; //Aqui marca el error
              break;
         end;
    end;

Si hago de esta otra forma, me da este error cuando lo compilo "Constant object cannot be passed as var parameter"

Código Delphi [-]
    For i:=0 to screen.FormCount-1 Do
    begin
         If screen.Forms[i].name=forma Then
         begin
              FreeAndNil(screen.Forms[i]);//Aqui marca el error
              break;
         end;
    end;

Muchisimas gracias por adelantado

droguerman 17-08-2006 17:49:50

hubiera sido bueno que expliques como desear utilizar eso, si es para luego iterar en screens puedes usar la funcion assigned que te dice si un puntero tiene una referencia valida

seoane 17-08-2006 17:56:01

No entiendo porque quieres hacer eso. Al eliminar el formulario con Free también es eliminado de la lista Forms, ya no esta en la lista. De echo si quieres eliminar todos los formularios la forma correcta seria empezar por el ultimo, de lo contrario te dará error, es decir:

Código Delphi [-]
For i:=screen.FormCount-1 downto 0 Do
    begin
         If screen.Forms[i].name=forma Then
         begin
              screen.Forms[i].Free;
         end;
    end;

Caro 17-08-2006 18:18:41

Muchisimas gracias a los dos por responder, quiero hacer de esa forma porque creo mi menu dinamicamente y lo cargo en un TreeView, y cuando voy moviendome entre los items o haciendo un click en el item muestro su forma correpondiente en un panel, pero antes de mostrar la nueva fora libero la anterior forma cargada con Free. Mi problema es el siguiente que si hago dos veces click en el mismo item se carga la forma primero despues se destruye y se vuelve a cargar, lo que yo quisiera es poder preguntar si la forma (teniendo su nombre como cadena), ya ha sido creada para no volver a crearla.

La primera ves cuando la forma no se ha creado apunta a nulo, todo bien hasta, pero cuando ya se ha creado y despues lo libero con Free o Destroy, no apunta a nulo entonces como hago la pregunta, porque no funciona tampoco con assigned.


Espero se entienda, creo que me estoy enredando mucho.

seoane 17-08-2006 18:38:05

Si te entiendo, tu creas una forma y utilizas una variable que apunta a ella. Algo como esto:

Código Delphi [-]
  Miforma:= TMiforma.Create(nil);

Sin embargo a la hora de borrarlo utilizas la lista Forms de la variable Screen, supongo que lo haces así para no tener que preocuparte de que formulario fue el ultimo que abriste. Pero como has dicho, el contenido de la variable no cambia y esta pasa a apuntar a una forma que ya no existe. Se me ocurre una posible solución:

Código Delphi [-]
function Existe(F: TForm): Boolean;
var
  i: integer;
begin
  for i:= 0 to Screen.FormCount - 1 Do
    if Screen.Forms[i] = F then
    begin
      Result:= TRUE;
      Exit;
    end;
  Result:= FALSE;
end;

Esta función te dirá si la variable apunta a una forma real, o por el contrario su valor ya no sirve.

Caro 17-08-2006 19:55:00

Si, asi lo hare seoane, muchisimas gracias


La franja horaria es GMT +2. Ahora son las 06:27:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi