[Lazarus-es] Error External SIGSEGV al asignar valor depropiedad

Iván Mesa iv.mesa.prg en gmail.com
Mie Mayo 24 21:38:18 CEST 2017


Tienes que crear los formularios con la fórmula Application.CreateForm 
(TForm2, form2).
Tal como los creas (With TForm2.Create(...)) no podrás acceder a sus 
datos desde fuera de with, ya que la variable Form2 no se inicializa en 
ningún sitio.
Para trabajar con datos entre formularios, yo te recomiendo en uso de 
propiedades públicas:
En el form3:
public
     Property datodeotroform :String.....

Cuando creas el form, antes del show:
desde el form2:
with Tfrom3.create(self)) ...
     datodeotroform := self.datoform2.Text;
     showmodal;
     self.datoform2.text := datodeotroform; //esto sería un ejemplo para 
recuperar un dato modificado en form3
     free;
...

etc.

Esta es la mejor forma, aunque pueda parecer que necesitas más código, 
pero te permitirá usar el dato incluso si el form2 se destruyera antes 
que el form3 (en tu caso como es showmodal no ocurrirá pero en otras 
ocasiones producirá quebraderos de cabeza).

Es sólo una recomendación, yo desde que lo hago así, tengo cero 
problemas con objetos que no existen y trato de acceder a ellos.

Abrazos,
Iván Mesa.



El 24/05/2017 a las 21:20, Maxi via Lazarus-es escribió:
> Pero para poder llamar al form 2 debes crear primero, pero se quedaria 
> atascado haste que termine el showmodal.
> Y al salir ya el objeto no existe. si quieres ese comportamiento deben 
> estar creados antes de intentar acceder a alguna propiedad.
>
>
>
> El 24 de mayo de 2017, 15:51, Ismael L. Donis Garcia via Lazarus-es 
> <lazarus-es en lists.lazarus-ide.org 
> <mailto:lazarus-es en lists.lazarus-ide.org>> escribió:
>
>     Si existe el problema ocurre cuando desde un formlario llamo a
>     otro con Showmodal y ese otro llama a otro con Showmodal también
>     Cuando desde el último llamado quiero coger un valor del anterior
>     me da el error.
>     Osea
>       Application.Initialize;
>       Application.CreateForm(TForm1, Form1);
>       Application.Run;
>     Desde TForm1
>     Form2.Showmodal;
>     y desde Form2
>     Form3.Showmodal;
>     Ahora si en Form3 pregunto por ejemplo:
>     if form2.edit1.text = 'xx' then // aqui suena el error
>     Prueba creando un proyecto con 3 formularios:
>     Pon en el primero:
>     --------
>     unit Unit1;
>     {$mode objfpc}{$H+}
>     interface
>     uses
>       Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
>     StdCtrls;
>     type
>       { TForm1 }
>       TForm1 = class(TForm)
>         Button1: TButton;
>         procedure Button1Click(Sender: TObject);
>       private
>         { private declarations }
>       public
>         { public declarations }
>       end;
>     var
>       Form1: TForm1;
>     implementation
>     uses
>       Unit2;
>     {$R *.lfm}
>     { TForm1 }
>     procedure TForm1.Button1Click(Sender: TObject);
>     begin
>       with TForm2.Create(nil) do
>      try
>         Showmodal;
>       finally
>        Free;
>      end;
>     end;
>     end.
>     --------
>     Pon en el segundo:
>     --------
>     unit Unit2;
>     {$mode objfpc}{$H+}
>     interface
>     uses
>       Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
>     StdCtrls;
>     type
>       { TForm2 }
>       TForm2 = class(TForm)
>         Button1: TButton;
>         Edit1: TEdit;
>         procedure Button1Click(Sender: TObject);
>       private
>         { private declarations }
>       public
>         { public declarations }
>       end;
>     var
>       Form2: TForm2;
>     implementation
>     uses
>       Unit3;
>     {$R *.lfm}
>     { TForm2 }
>     procedure TForm2.Button1Click(Sender: TObject);
>     begin
>       with TForm3.Create(nil) do
>      try
>         Showmodal;
>       finally
>        Free;
>      end;
>     end;
>     end.
>     --------
>     Pon en el tercero:
>     --------
>     unit Unit3;
>     {$mode objfpc}{$H+}
>     interface
>     uses
>       Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
>     StdCtrls;
>     type
>       { TForm3 }
>       TForm3 = class(TForm)
>         Button1: TButton;
>         procedure Button1Click(Sender: TObject);
>       private
>         { private declarations }
>         bvalida: boolean;
>       public
>         { public declarations }
>       end;
>     var
>       Form3: TForm3;
>     implementation
>     uses
>       Unit2;
>     {$R *.lfm}
>     { TForm3 }
>     procedure TForm3.Button1Click(Sender: TObject);
>     begin
>       if Form2.Edit1.Text='xx' then
>         bvalida:=true;
>     end;
>     end.
>     --------
>     Saludos Cordiales
>     ========
>     | ISMAEL |
>     ========
>     Devuan User : http://distrowatch.com/table.php?distribution=devuan
>     <http://distrowatch.com/table.php?distribution=devuan>
>     WebSite: http://
>     <http://sisconge.byethost15.com>sisconge.byethost15.com
>     <http://sisconge.byethost15.com>
>
>         ----- Original Message -----
>         *From:* Maxi via Lazarus-es
>         <mailto:lazarus-es en lists.lazarus-ide.org>
>         *To:* Spanish version of Lazarus List
>         <mailto:lazarus-es en lists.lazarus-ide.org>
>         *Cc:* Maxi <mailto:maximiliano.duarte en gmail.com>
>         *Sent:* Wednesday, May 24, 2017 1:29 PM
>         *Subject:* Re: [Lazarus-es] Error External SIGSEGV al asignar
>         valor depropiedad
>
>         El objeto ya no existe le hiciste free.
>         Despues del showmodal
>
>         El 23 de mayo de 2017, 13:23, Ismael L. Donis Garcia via
>         Lazarus-es <lazarus-es en lists.lazarus-ide.org
>         <mailto:lazarus-es en lists.lazarus-ide.org>> escribió:
>
>             Tengo un formulario que tiene una propiedad pública:
>             public
>                { public declarations }
>                property salvar: boolean write setsalvar;
>             procedure Tfrecep.setsalvar(AValue: boolean);
>             begin
>               bvalida:=AValue;
>             end;
>             El cual llama otro formulario de la siguiente forma:
>                  with Tfimprec.Create(nil) do
>                   try
>                     asignarnum:=strtoint(snorec);
>                     entidad:=sentidad;
>                     Showmodal;
>                   finally
>                     Free;
>                   end;
>             Cuando desde el formalario Tfimprec trato de asignarle un
>             valor a la propiedad salvar me da dicho error el cual no
>             encuentro la posible causa.
>             procedure Tfimprec.cmdcerrarClick(Sender: TObject);
>             begin
>               frecep.salvar:=true;
>               Self.Close;
>             end;
>             Al alguien de ustedes le ha pasado esto? En caso
>             afirmativo como lo han solucionado?
>             Desde ya Gracias
>
>             _______________________________________________
>             Lazarus-es mailing list
>             Lazarus-es en lists.lazarus-ide.org
>             <mailto:Lazarus-es en lists.lazarus-ide.org>
>             http://lists.lazarus-ide.org/listinfo/lazarus-es
>             <http://lists.lazarus-ide.org/listinfo/lazarus-es>
>
>
>
>
>         -- 
>         El que pregunta aprende, y el que contesta aprende a responder.
>
>         No a la obsolecencia programada:
>         http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
>         <http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml>
>
>         Linux User #495070
>         http://domonetic.com/blog
>
>         ------------------------------------------------------------------------
>         _______________________________________________
>         Lazarus-es mailing list
>         Lazarus-es en lists.lazarus-ide.org
>         <mailto:Lazarus-es en lists.lazarus-ide.org>
>         http://lists.lazarus-ide.org/listinfo/lazarus-es
>         <http://lists.lazarus-ide.org/listinfo/lazarus-es>
>
>
>     _______________________________________________
>     Lazarus-es mailing list
>     Lazarus-es en lists.lazarus-ide.org
>     <mailto:Lazarus-es en lists.lazarus-ide.org>
>     http://lists.lazarus-ide.org/listinfo/lazarus-es
>     <http://lists.lazarus-ide.org/listinfo/lazarus-es>
>
>
>
>
> -- 
> El que pregunta aprende, y el que contesta aprende a responder.
>
> No a la obsolecencia programada: 
> http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml
>
> Linux User #495070
> http://domonetic.com/blog
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus-ide.org
> http://lists.lazarus-ide.org/listinfo/lazarus-es

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20170524/33889340/attachment-0001.html>


Más información sobre la lista de distribución Lazarus-es