[Lazarus-es] Error en formularios y lazreport

Maxi maximiliano.duarte en gmail.com
Lun Jul 20 22:25:10 CEST 2015


es porque en algun momento estas llamando algo que ya se destruyó o el
reporte intenta acceder a algo que no puede.

Cada formulario tiene una variable publlica con el objeto por lo que
si puedes llamarlo.

Si Tdm.IniSis(); se usa para iniciar para que lo vuelves a llamar?

Te digo como hago siempre yo en mis aplicaciones

Desde el proyecto dejo crear automaticamente:
Modulo de datos con conexion a DB solamente
->Antes del seguir valido el usuario sino cierro todo
Modulo de datos con tablas y consultas
Modulo de datos con lookups
Formulario principal

Despues de iniciar recien llamo al resto de cosas despues de iniciar
el form principal. Y uso herencia de formularios, me ahorra mucho
codigo y configuraciones.

Lo que noté que el splash lo creas pero no lo destruyes. y si un
formulario lo vas a recrear luego he visto que usan .FreeAndNil.
Por eso es mejor crearlo en en proyecto y destruirlo lo antes posible.

cambia la creacion:
Application.CreateForm(Tfconta, fconta);
por
Tfconta.Create(Application);

Aunque insisto que eso solo sirve si deseas que el objeto Application
se encargue de destruir todo al cerrar la aplicacion.


Para el splash esto:
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  splash :=(TFormSplash.Create(nil);
  splash.update;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  ... mas formularios
  splash.Free;
 Application.Run;
end.

Seguimos en contacto

El día 20 de julio de 2015, 16:49, Ismael L. Donis Garcia
<slibre en citricos.co.cu> escribió:
> Respondo entre lineas.
>
> Ante todo recuerda que nunca he trabajado con Delphi por lo que provengo de
> la filosofía de Microsoft la cual de hecho me gusta mucho "me refiero la
> filosofía de programación".
>
>> ----- Original Message ----- From: "Maxi" <maximiliano.duarte en gmail.com>
>> To: "Spanish version of Lazarus List"
>> <lazarus-es en lists.lazarus.freepascal.org>
>> Sent: Monday, July 20, 2015 12:54 PM
>> Subject: [Lazarus-es] Error en formularios y lazreport
>>
>
>> El día 18 de julio de 2015, 11:57, Ismael L. Donis Garcia
>> <slibre en citricos.co.cu> escribió:
>>
>>> En el encabezamiento del grupo das click secundario y marcas las opción
>>> de
>>> Forzar Nueva Página.
>>>
>>> Respecto a Delphi ni me preguntes. Jamas en la vida lo he usado, nunca me
>>> ha
>>> gustado. En windows siempre había trabajado con Visual Estudio.
>>>
>>> He mirado a Lazarus porque es libre y multiplataforma y como yo me he
>>> tirado
>>> ultimamente para Linux, soy el encargado en mi empresa en difundir el
>>> soft
>>> libre. De hecho el sistema operativo que uso por defecto es Jessie,
>>> aunque
>>> tengo PC virtuales con 1 millón de sistemas porque viy haciendo estudios
>>> de
>>> los que puedo hacerme, ahora mismo estoy mirando a Manjaro OpenRC el cual
>>> ha
>>> tenido una bueba aceptación.
>>>
>>> En estos momentos estoy parado en Lazarus, hoy voy a instalar la versión
>>> 1.4.2 a ver si me resuelve un problema que tengo precisamente con
>>> lazreport
>>> el cual me da una ecepción si cierro todos los formulario abiertos desde
>>> un
>>> modulo de datos y los vuelvo a abrir. Al volver abrir los formulario y
>>> tratar de visualizar algo en lazreport este tira una ecepción y me cierra
>>> el
>>> programa la rutina que tengo para cerrar los formularios es la siguiente:
>>>
>>> procedure Tdm.IniSis();
>>> var
>>> f: Tforigen;
>>>  i: integer;
>>> begin
>>>  DecimalSeparator:='.';
>>>  ThousandSeparator:=',';
>>>  ShortDateFormat := 'dd/mm/yyyy';
>>>  blnend := false;
>>>  intciclo := 0;
>>>  intfilas := 0;
>>>  intnivel := 0;
>>>  lngentidad := 0;
>>>  struser := '';
>>>  strerror := '';
>>>  for i := Screen.FormCount - 1 downto 0 do begin
>>>    if Screen.Forms[i].Name <> Self.Name then begin
>>>      if Screen.Forms[i].Name <> 'fconta' then Screen.Forms[i].Free;
>>>    end;
>>>  end;
>>>  for i := Screen.FormCount - 1 downto 0 do begin
>>>    if Screen.Forms[i].Name <> Self.Name then Screen.Forms[i].Free;
>>>  end;
>>>  Application.CreateForm(Tfconta, fconta);
>>>  Application.CreateForm(Tfsplash, fsplash);
>>> fsplash.Show;
>>>  Application.ProcessMessages;
>>>  if datos() then
>>>    entrar()
>>>  else
>>>    begin
>>>      f:=Tforigen.Create(Self);
>>>      f.IniSystem:=true;
>>>     f.ShowModal;
>>>     f.Free;
>>>      if blnend then
>>>        cerrarme()
>>>      else if datos() then
>>>        begin
>>>          intciclo := intciclo + 1;
>>>         entrar()
>>>        end
>>>      else
>>>        cerrarme();
>>>    end;
>>> end;
>>>
>>> El error que me da es el siguiente:
>>> El proyecto XXXX  ha lanzado una excepción de la clase Éxternal: SIGSEGV'
>>> En
>>> Archivo '.\include\control.inc'en linea 3260
>>>
>>> Pero no veo cual puede ser el error porque si no cierro los formularios
>>> con
>>> la rutina anterior nunca me da ese error, lo peor del caso es que a veces
>>> si
>>> tengo que utilizar ese procedimiento.
>>>
>>> Por ese motivo voy a instalar la versión 1.4.2 a ver si persiste el
>>> problema.
>>>
>>> Saludos Cordiales
>>> ========
>>> | ISMAEL |
>>> ========
>>
>>
>> Paso a otro hilo para que sirva despues.
>>
>> Creo que primero debes dejar al modulo de datos solo para datos, y
>> hacer las creaciones y destrucciones mas controladas.
>>
>>>  Application.CreateForm(Tfsplash, fsplash);
>>> fsplash.Show;
>>
>>
>> el splash lo creas en el proyecto
>
>
> Ya esta creado en el proyecto el formulario. En esas lineas lo que hace
> segun la filosofía de microsoft es
> 1.- crear una instancia del formulario
> 2.- mostrar la intancia
>
> Yo en las propiedades del proyecto tengo a modulo de datos solamente para
> que se cree el formulario automaticamente los demás no.
>
>>
>>>  Application.CreateForm(Tfconta, fconta);
>>
>>
>> No usaria esto sino Tfconta.Create(self), aunque en tu caso usaria el
>> envento occlose y le pondria caFree, que lo destruye al salir del
>> form, con eso te olvidas de liberarlo y no usaria Self sino nil (sin
>> pariente)
>
>
> Si pongo:
> Tfconta.Create(self);
> o
> Tfconta.Create(nil);
>
> Despues no puedo mostrar el formulario con:
> fconta.Show;
>
> Ni tampoco puedo usar el siguiente procedimiento por ejemplo ''que lo uso
> tal como está" lo cual tengo en otro formulario.
>
> procedure Tflogin.mnuother(buser: boolean);
> begin
>  with fconta do begin
>    mnuherod.Visible := buser;
>    mnuherbh.Visible := buser;
>    mnuhercs.Visible := buser;
>    mnuherbar2.Visible := buser;
>    mnuherec.Visible := buser;
>    mnuhercp.Visible := buser;
>    mnuherbar3.Visible := buser;
>    mnuherid.Visible := buser;
>    mnuhereh.Visible := buser;
>    mnuherbar4.Visible := buser;
>  end;
> end;
>
> Ya que no encuentra a fconta
>
>>
>> procedure TFormPrincipal.FormClose(Sender: TObject;  var
>> CloseAction:TCloseAction);
>> begin
>>  CloseAction:=caFree;
>> end;
>>
>
> Puse la declaración CloseAction:=caFree; en todo los FormClose y persiste el
> problema
>
>>
>> Te ayudo si quieres
>>
>
> No estaría de más, por el contrario sería bien venida toda ayuda.
>
> Así como lo tengo todo funciona bien. Excepto los reportes que si se
> visualizan bien la primera vez que se use el procedimiento procedure
> Tdm.IniSis(); pero si lo ejecuto por segunda vez entonces es cuando me dan
> error los reportes.
>
> Ese procedimieto se ejecuta siempre al iniciar la apliación y ahi todo
> funciona bien, pero si mando a ejecutar ese procedimiento por segunda vez
> los reportes dan error, pero el trabajo con los formularios no da error
> alguno.
>
> Saludos Reiterados
> ========
> | ISMAEL |
> ========
> Only for the small landowners and Cubans companies
> Website: www.sisconge.byethost15.com
>              www.sisconge.hol.es
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/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




More information about the Lazarus-es mailing list