Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con aplicación (https://www.clubdelphi.com/foros/showthread.php?t=53633)

Dark_RavenM 26-02-2008 00:21:58

Error de Eaccessviolation in module
 
Tengo una aplicación que tiene el siguiente codigo:

Código Delphi [-]
procedure TfrmRBSytemsSql.ImprimePdf(vpTabla, vpClaveFactura, vpNumFactura:string);
// La impresion pdf automatica no se pone en multischemas porque se abren/cierran queries de acuerdo a c/schema y configuración.
var
  vltext : string;
begin
  vltext := 'SELECT * FROM '+vptabla+' WHERE CLAVEFACTURA = '''+vpClaveFactura+''' AND NUMFACTURA = '''+vpNumFactura+'''';
  try
    with DModmain do
    // Los quieries se usan como están definidos en dmodmain para que se pueda hacer la impresión.
    begin
      if vptabla = 'MIMPOMAT' then
      begin
        QIMa.Sql.clear;
        QIMa.Sql.Add(vltext);
        QIMa.Open;
        if QIMa.Isempty then exit;
      end
      else
        if vptabla = 'MIMPOMAQ' then
        begin
          QIMq.Sql.clear;
          QIMq.Sql.Add(vltext);
          QIMq.Open;
          if QIMq.Isempty then exit;
          QMaq.Open;
          QSeM.Open;
          QSEa.Open;
          QAcc.Open;
        end
        else
          if vptabla = 'MEXPOPT' then
          begin
            QEPt.Sql.clear;
            QEPt.Sql.Add(vltext);
            QEPt.Open;
            if QEPt.Isempty then exit;
          end
          else
            begin
              QEMq.Sql.clear;
              QEMq.Sql.Add(vltext);
              QEMq.Open;
              if QEMq.Isempty then exit;
              QEMaq.Open;
              QSeE.Open;
              QEAc.Open;
              QESac.Open;
              QFdaEq.Open;
            end;
      if frmImprimirfacturaSql = nil then
        Application.CreateForm(TfrmImprimirfacturaSql, frmImprimirfacturaSql);
      with frmImprimirFacturaSql do
      begin
        vgdesde := 1;  // Variable para que no se muestre la pantalla de seleccion del documento a imprimir
        if vptabla = 'MIMPOMAT' then tag := 1;
        if vptabla = 'MIMPOMAQ' then tag := 2;
        if vptabla = 'MEXPOPT'  then tag := 3;
        if vptabla = 'MEXPOMAQ' then tag := 4;
        FormShow(nil);
        ckbFacturaMexicana.Checked := False;
        ckbDescargas.Checked := False;
        ckbFraccionA.Checked := False;
        ckbSumary.Checked := False;
        ckbFacturaAmericana.Checked := True;
        BitBtn2.Click;
        try
          vlPaginas := inttostr(vgPaginas);
        except
          vlPaginas := '';
        end;
      end;
    end;
  finally
    vgdesde := 0;
    if frmImprimirfacturaSql <> nil then
    begin
       frmImprimirfacturaSql.free;
       frmImprimirfacturaSql := nil;
    end;
  end;
end;

pero me marca un error en frmImprimirfacturaSql.free;
dice que exception Eaccessviolation in module


alguien sabe que problema podria ser?

jachguate 26-02-2008 04:29:05

Es muy probable que en tu código, en alguna otra parte, haya una llamada a frmImprimirFracutra.Free sin su correspondiente asignación a nil.

Por eso es preferible, en lugar de llamar directamente al método Free, valerse del procedimiento FreeAndNil.

Por cierto, te recomiendo una lectura de la guía de estilo. Comprenderás que el 95% de los posts aquí podrían titularse "problema con aplicación"... y eso no ayuda en nada a las búsquedas, que son una de las principales actividades en estos foros.

Hasta luego.

;)

Dark_RavenM 26-02-2008 17:07:32

no en todo el codigo es el unico lugar en esa funcion donde se le manda crear la forma factura y donde se le da un .free, ese es el problema basicamente que no encuentro la logica

jachguate 26-02-2008 17:13:57

Si es el único lugar, tanto if está de mas, es mejor algo como:

Código Delphi [-]
var
  frmX: TfrmX;
begin
  frmX := TfrmX.Create(nil);
  try
    HacerAlgoCon(frmX);
  finally
    frmX.Free;
  end;
end;

Que tiene ventajas:
  • Al usar una variable local, se asegura que sea el único lugar del programa donde se tiene acceso a ella, sin efectos colaterales en otros sitios.
  • garantiza que el recurso asignado es liberado al usar try/finally

Si sigue dando error, quizás en otro sitio se esté jugando a liberar recursos que pertenecen a dicho formulario, lo que daría problema en su destructor, o quizás el problema se esté dando en un evento que se dispara como parte de la secuencia de destrucción: OnClose, OnDestroy, etc.

Hasta luego.

;)

Dark_RavenM 27-02-2008 05:10:40

Orale Gracias


La franja horaria es GMT +2. Ahora son las 10:58:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi