Anduvo perfecto Joshy<br><br>Evidentemente esto me va a costar un poco <br><br>yo visual basic no use nunca<br><br>Vengo de Usar Minigui / OOHG <br><br>donde las cosas son bastante mas sencillas , la forma de "instanciar" como decis vos<br>
es mucho mas sencillo , pero claro , probablemente codigo no reutilizable, o un form<br>que no se puede volver a usar desde otra parte.<br><br>Entendi perfectamente , la duda que me queda es , si es necesario nombrar la unidad<br>
que corresponde al form , en USES del form madre, al instanciarlo de esta forma<br><br>Bruno<br><br><div class="gmail_quote">El 20 de junio de 2009 08:43, JoshyFun <span dir="ltr"><<a href="mailto:joshyfun@gmail.com">joshyfun@gmail.com</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hello Bruno,<br>
<br>
Saturday, June 20, 2009, 3:19:30 AM, you wrote:<br>
<br>
BL> Compilo ok ahora y ejecuto<br>
BL> pero al hacer click en el menu clientes<br>
BL> Project raised exception 'External  : SIGSEGV'<br>
BL> Esto es lo que ejecuta el click de menu:<br>
BL> procedure TForm1.clientesClick(Sender: TObject);<br>
BL> begin<br>
BL>   FormCli.showmodal;<br>
BL> end;<br>
<br>
A ver, hay una gran diferencia entre definir un form, esto es sus<br>
controles y comportamiento, y otra instanciarlo. Haciendo el uses xxx;<br>
lo que haces es incluir la definición del form clientes en el form que<br>
estés usando, pero nada más, por decirlo de otro modo "FormCli" apunta<br>
a una zona de memoria indeterminada y por lo tanto erronea.<br>
<br>
Cámbialo por:<br>
<div class="im"><br>
procedure TForm1.clientesClick(Sender: TObject);<br>
</div>var<br>
  InstancedFormCli: TFormCli;<br>
begin<br>
  InstancedFormCli:=TFormCli.Create(Self);<br>
  InstancedFormCli.showmodal;<br>
  InstancedFormCli.Free;<br>
end;<br>
<br>
Resumiendo el código, creas una copia de la definición de FormCli<br>
llamada "InstancedFormCli" (como si le quieres llamar Juan), después<br>
le dices que la instancia (inicialice), luego que la muestre en modo<br>
modal, y al final que la libere.<br>
<br>
Existe cierta tendecia malsana de la gente que viene de los primeros<br>
Delphi y de otros lenguajes tipo VB a crear todos los formularios en<br>
el arranque pero dejándolos invisibles y luego mostrarlos y ocultarlos<br>
según convenga. Esto es un gasto de recursos brutal en algunos casos.<br>
Un form sólo definido ocupa unos 4 bytes de memoria, instanciado puede<br>
ocupar megas.<br>
<br>
Cada vez que defines un form, tanto delphi como Lazarus crean una<br>
variable global que es una definición del form (4 bytes), que verás en<br>
el código del form, después del "type", más abajo, verás "var FormCli:<br>
TFormCli", eso se usa para que Lazarus pueda crear una instancia de<br>
ese form automáticamente nada más arrancar si así se lo mandas. Esto<br>
va bien si tienes que tener sólo una instancia de cada form, pero muy<br>
mal por que hace creer al programador que esa es la única instancia<br>
posible del form.<br>
<br>
Para ponerte un ejemplo, la función de arriba cámbiala por:<br>
<div class="im"><br>
procedure TForm1.clientesClick(Sender: TObject);<br>
</div>var<br>
  InstancedFormCli: TFormCli;<br>
  Count: SizeInt;<br>
begin<br>
  for Count:=1 to 20 do begin<br>
    InstancedFormCli:=TFormCli.Create(Self);<br>
    InstancedFormCli.Show;<br>
  end;<br>
end;<br>
<br>
Lazarus te ha creado 20 forms iguales pero independientes y encima has<br>
perdido el control individual de cada uno de ellos, ya que<br>
InstanceFormCli sólo apunta al último. Puedes cerrarlos todos uno a<br>
uno, pero si cierras el principal (Form1) verás que los cierra todos<br>
de golpe, ya que Lázarus si sabe cuales están abiertos (lo apunta<br>
internamente).<br>
<br>
Resumiendo, suele ser una buena técnica de programación no usar la<br>
variable que define el form por defecto excepto en el form principal o<br>
en el caso seguro de que no van a existir más de una representación de<br>
ese form a lo largo de todo el programa. Aún así no debemos olvidarnos<br>
de comprobar si debemos instanciarlo cada vez que queramos mostrarlo.<br>
Una buena técnica que suele simplificar esto cuando usamos ShowModal<br>
habitualmente es:<br>
<div class="im"><br>
procedure TForm1.clientesClick(Sender: TObject);<br>
begin<br>
</div>  if not Assigned(FormCli) then begin<br>
    FormCli:=TFormCli.Create(Self);<br>
  end;<br>
  FormCli.ShowModal;<br>
  FreeAndNIL(FormCli);<br>
end;<br>
<br>
De este modo si el form está instanciado, lo muestra y después lo<br>
libera. Si no está instanciado, lo instancia, lo muestra y lo libera.<br>
<br>
--<br>
Best regards,<br>
<font color="#888888"> JoshyFun<br>
</font><div><div></div><div class="h5"><br>
<br>
_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org">Lazarus-es@lists.lazarus.freepascal.org</a><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es</a><br>
</div></div></blockquote></div><br>