Recent

Author Topic: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte  (Read 12247 times)

esdonis

  • Jr. Member
  • **
  • Posts: 61
Cuando intento listar un reporte en LazReport después de haber cerrado todos los formularios abiertos me da la siguiente excepción:

Excepción de la clase 'External: SIGSEGV'
En archivo lr_progr.pas en linea 76:
Timer1.Enabled:=true;

Edson

  • Hero Member
  • *****
  • Posts: 1296
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #1 on: January 20, 2017, 10:40:51 pm »
No conozco mucho de LazReport, pero lo primero que yo haría es ver si los objetos referenciados son correctos. En tu caso vería si Timer1 todavía existe cuando intentas acceder a él con: Timer1.Enabled:=true;

Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

BlueIcaro

  • Hero Member
  • *****
  • Posts: 791
    • Blog personal
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #2 on: January 21, 2017, 06:20:46 pm »
¿Podrías mostrar el código dónde falla?.
Indicar que versión de lazarus usas y que sistema operativo también puede ser de ayuda.
Saludos
/BlueIcaro

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #3 on: January 22, 2017, 03:33:28 pm »
Uso Lazarus 1.6.2 sobre windows
El procedimiento es bien largo pero voy a poner lo que creo esencial

//El error ocure si mando a ejecutar este procedimiento del modulo

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.Name <> Self.Name then begin
      if Screen.Forms.Name <> 'fconta' then Screen.Forms.Free;
    end;
  end;
  for i := Screen.FormCount - 1 downto 0 do begin
    if Screen.Forms.Name <> Self.Name then Screen.Forms.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;

//Este procedimiento tambien esta en el modulo
procedure Tdm.entrar();
var
   f: Tflogin;
begin
  if length(struser) = 0 then struser := 'administrador';
  if (cnsc.Connected or cnsch.Connected or cnos.Connected) then FinConexServer();
  IniConexServer;
  f:=Tflogin.Create(Self);
  f.ShowModal;
   f.Free;
  if blnend then
    cerrarme()
  else
    begin
      fconta.lblestado.Caption := 'Listo';
      fconta.Show;
      fsplash.Free;
    end;
end;

//Para mostrar el reporte esto esta en un formulario

if ((cbomes.ItemIndex <> 0) and ((cboent.ItemIndex <> 0) or (dm.Entidad = 0))) then
   rpt.LoadFromFile(ExtractFilePath(Application.Exename) + 'balmes.lrf')
else
    rpt.LoadFromFile(ExtractFilePath(Application.Exename) + 'balance.lrf');
fconta.prbestado.Position:=98;
rpt.ShowReport;

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #4 on: January 22, 2017, 03:51:21 pm »
Se mo olvido comentar que el procedimiento Tdm.IniSis siempre se ejecuta al inicial el sistema y los reportes se muestran bien.

Pero si quiero cerrar la sección del usuario para iniciar otra sección mando a ejecutar de nuevo el procedimiento Tdm.IniSis que esta en el datamodule y es cuando me da error los reportes al tratar de visualizarlos.

El timer que me da error esta en un formulario de Lazarus, también algunas veces me da otro error diferente.

Edson

  • Hero Member
  • *****
  • Posts: 1296
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #5 on: January 22, 2017, 04:03:01 pm »
A mi me parece que estás tratando de referenciar a un objeto destruido. En tu procedimiento veo que destruyes formularios directamente. Eso siempre trae problemas. Por lo general debe haber rutimas especializadas para destruir formularios, teniendo cuidado de que los objetos que contienen no sean referenciados luego. Ello puede implicar reiniciar eventos, deshabilitar Timers o destruir previamente algunos objetos problemáticos.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #6 on: January 23, 2017, 02:19:04 pm »
La verdad que no debe ser eso, o al menos no veo porque ya que procedure Tdm.IniSis(); es un procedimiento publico dentro del modulo de datos el cual se ejecuta al inicial la aplicación y si un usuario va a cerrar su seccion para iniciar otra sección y las siguientes lineas deben de cerrar todos los fulmularios abiertos.

Incluso ahora modifique el procedimiento por:
  for i := Screen.FormCount - 1 downto 0 do begin
    if Screen.Forms.Name <> Self.Name then begin
      if Screen.Forms.Name <> 'fconta' then Screen.Forms.Free;
    end;
  end;
  for i := Screen.FormCount - 1 downto 0 do begin
    //if Screen.Forms.Name <> Self.Name then Screen.Forms.Free;
    Screen.Forms.Free;
  end;

que debe cerrar todos los formularios abiertos y persiste el mismo problema.

Edson

  • Hero Member
  • *****
  • Posts: 1296
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #7 on: January 23, 2017, 03:28:34 pm »
Y si quitas la parte que cierra los formularios ¿Persiste el problema?
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #8 on: January 23, 2017, 05:27:14 pm »
No puedo quitarlos porque caso contrario no me cierra las formularios abiertos

cambie el procedimiento por:

  x := false;
  for i := Screen.FormCount - 1 downto 0 do begin
      if (Screen.Forms.Name <> 'dm') and (Screen.Forms.Name <> 'fconta') then
        Screen.Forms.Free
      else if Screen.Forms.Name = 'fconta' then
        x := true;
  end;
  if not x then Application.CreateForm(Tfconta, fconta);

para cerrar todos los formularios abiertos menos el modulo de datos y el formulario principal y ahora el error me lo da el archivo customform.inc en la linea 1734

TWSCustomFormClass(WidgetSetClass).SetModalResult(Self, Value);

el procedimiento completo de ese archivo es:

procedure TCustomForm.SetModalResult(Value: TModalResult);
begin
  if HandleAllocated and (Value <> FModalResult) then
    TWSCustomFormClass(WidgetSetClass).SetModalResult(Self, Value);
  FModalResult := Value;
end;

Edson

  • Hero Member
  • *****
  • Posts: 1296
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #9 on: January 23, 2017, 05:42:24 pm »
No puedo quitarlos porque caso contrario no me cierra las formularios abiertos

Solo te dije que quitaras esa parte, como una forma de probar, si el problema está en la gestión de los formularios. No digo que tengas que dejarlo así.  Es parte de la depuración.

Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #10 on: January 23, 2017, 05:57:34 pm »
Deje lo suiguiente

  x := false;
  for i := Screen.FormCount - 1 downto 0 do begin
    if Screen.Forms.Name = 'fconta' then x := true;
  end;
  if not x then Application.CreateForm(Tfconta, fconta);

Y no da el error

Pero ahora como cierro los formularios que tengo abierto si quiere iniciar otro usuario la sección de trabajo?

Edson

  • Hero Member
  • *****
  • Posts: 1296
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #11 on: January 23, 2017, 07:05:33 pm »
El problema no está en cerrar los formularios, sino en cómo los cierras. No conozco tu aplicativo pero te repito:

... debe haber rutimas especializadas para destruir formularios, teniendo cuidado de que los objetos que contienen no sean referenciados luego. Ello puede implicar reiniciar eventos, deshabilitar Timers o destruir previamente algunos objetos problemáticos.

Si tienes un formulario principal, ese es el que debe cerrar a los demás formularios. Mejor sería que ubiques a los formularios por su clase en lugar de su nombre y, mejor aún, si creas una lista para almacenar a los formularios que estás abriendo.
 
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #12 on: January 23, 2017, 07:42:21 pm »
Si es ese el problema ya que puse:
x := false;
  for i := Screen.FormCount - 1 downto 0 do begin
    if (Screen.Forms.Name <> 'dm') and (Screen.Forms.Name <> 'fconta') then
      begin
        Application.MessageBox(pchar(Screen.Forms.Name), pchar('Error de Prueba'), 0);
        Screen.Forms.Free;
      end
    else if Screen.Forms.Name = 'fconta' then
        x := true;
  end;

Y me entra a formularios de Lazarus que no son los del proyecto, por eso el error después.

Me voy a poner a estudiar como crear la lista ya que soy nuevo en Lazarus y en delphi nunca ni lo he mirado. Ni pienso tampoco mirarlo ya que no es soft libre


lainz

  • Hero Member
  • *****
  • Posts: 4449
    • https://lainz.github.io/
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #13 on: January 23, 2017, 07:50:46 pm »
Code: Pascal  [Select][+][-]
  1. Screen.Forms.Free;

Ahí no especificas que formulario liberar, o me equivoco? Tendría que ser así:

Code: Pascal  [Select][+][-]
  1.   for i := Screen.FormCount - 1 downto 0 do begin
  2.     if (Screen.Forms[i].Name <> 'dm') and (Screen.Forms[i].Name <> 'fconta') then
  3.       begin
  4.         Application.MessageBox(pchar(Screen.Forms[i].Name), pchar('Error de Prueba'), 0);
  5.         Screen.Forms[i].Free;
  6.       end
  7.     else if Screen.Forms[i].Name = 'fconta' then
  8.         x := true;
« Last Edit: January 23, 2017, 07:52:32 pm by lainz »

esdonis

  • Jr. Member
  • **
  • Posts: 61
Re: Excepción de la clase 'External: SIGSEGV' al intentar listar reporte
« Reply #14 on: January 23, 2017, 08:35:52 pm »
Si ese error ya me había dado cuenta.

Pero el problema que el for i := Screen.FormCount - 1 downto 0 do me cierra formularios de lazarus que no forman parte del proyecto mio sino de el sistema de Lazarus

Poniendo un mensaje vi que me cierra el formulario frProgressForm que es de Lazarus y no forma parte del proyecto

Por lo que me parece que lo más correcto sería crear una lista de los formularios abiertos como me dijo Epson y recorrer la lista para cerrar los formularios.

Ahora tengo que buecar como hacer eso o implementar alguna otra forma de hacerlo



 

TinyPortal © 2005-2018