[Lazarus-es] EXC_BAD_ACCESS al hacer un close de un form

JoshyFun joshyfun en gmail.com
Vie Jun 26 11:46:38 CEST 2009


Hello Paola,

Friday, June 26, 2009, 12:41:35 AM, you wrote:

PB> Hola Joshy..
PB> he entendido tu razonamiento... (aclaro que tuve que releer todo el hilo)..

Es que no me explico como debería... no soy muy bueno transmitiendo
por escrito.

PB> ahora... cuál es la forma que tú aconsejas para crear/mostrar un form?

Lo mismo que se ha hecho siempre...

PB> Leyendo el libro "la cara oculta de d4" (si, un 
PB> poco viejo pero tiene muchas cosas aplicables), es que usan este procedimiento:
PB> procedure MostrarForm(AClass: TFormClass);
PB> begin
PB>       with AClass.Create(Application)do
PB>       try
PB>          ShowModal;
PB>       finally
PB>          Free;
PB>       end;
PB> end;
PB> está correcto??

Es correcto, pero como técnica de programación hay que uir de ella.
Está bien como ejemplo, ya que explica varias cosas, como crear una
instancia de "algo" sabiendo sólo que pertenece o hereda la forma de
un TFormClass y como usar sus métodos y propiedades sin asignarlo a
ninguna variable (explícitamente).

El "with" sabemos que lo que hace es que dentro del bloque do..end
todo lo que no tenga sentido se reintenta procesar (en tiempo de
compilación) anteponiendo lo que aparece entre el with y el do. Esto
que es muy cómodo para por ejemplo rellenar de datos una estructura
puede convertirse en una pesadilla de depuración si se usa de forma
indiscriminada. Pongamos un ejemplo:

type
  Prueba=record
   a: integer;
   b: integer;
  end;
  Lio=record
   V1: integer;
   a: integer;
  end;
[...]
var
  V1: Prueba;
  V2: Lio;
  a: integer;
begin
  with V1 do begin
   a:=1;
   b:=1;
  end;
  //Ahora compliquémoslo...
  with V2 do begin
    V1.a:=1;
    with V1 do begin
      a:=1; //Esta que parte de que record es ? o es la variable ?
    end;
  end;
end;

PB> podría usarle en vez de Free, FreeAndNil(AClass)?? sería esa la sintaxis?

No puedes hacer un FreeAndNIL en este caso, ya que la variable que
contiene la instancia del form no existe, la ha creado el compilador a
través del "with" y está fuera del control del programador, de modo
que no podemos ponerla a NIL aunque tampoco es necesario, ya que como
el programador no tiene acceso a ella, no podrá "mal usarla" por
error.

PB> de esta manera, sólo se dejaría la creación 
PB> automática para el formulario ppal y el/los datamodules...

La creación automática sólo tiene 2 inconvenientes, los cuales pueden
ser pequeños o grandes según como sea la aplicación. Si la aplicación
tiene muuuuchos forms es fácil tener problemas de memoria en equipos
justos, o de falta de recursos de windows (o de otro SO). Otro
problema es que con creación automática no debemos crear más de una
instancia de cada form autocreado, no al menos sin tomar precauciones
sobre que variables vamos a usar y como.

Como veo que usais los forms modales con mucha frecuencia, aviso por
si hos habiais dado cuenta, que un form modal no puede mostrar otro
form modal. Algo asi:

form1:=Tform1.create;
form1.showmodal;
[...]

form1.Onclick()
var
  form2: TOtroForm;
begin
  form2:=TOtroForm.Create;
  form2.showmodal; //KBOOOOOMMMM!


-- 
Best regards,
 JoshyFun





More information about the Lazarus-es mailing list