Ir al contenido


Foto

[RESUELTO] Invalid Pointer Operation


  • Por favor identifícate para responder
10 respuestas en este tema

#1 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 23 febrero 2010 - 09:44

Hola Amigos, un gusto saludarlos, el motivo del post es el siguiente:

Estoy trabajando con Delphi5 Update1/Oracle/WinXP SP3 y es una aplicación un poco compleja y pesada (30Mb el ejecutable), cero librerías de terceros.

Mi problema viene dado cuando se ejecuta un query sobre una tabla de oracle (este query trae a lo mucho 20k registros) y a partir de este query se crea uno o varios archivos de texto. El proceso tiene varios while/for andados y en algún momento de estos ciclos recibo el siguiente error: Invalid Pointer Operation el cual me tira mi aplicación.

He estado investigando las posibles causas y soluciones de este problema, el cual por lo general viene dado por accesos a localidades de memoria que no están usadas, o algún problema con alguna clase, pero en el procedimiento yo no uso clases, mis variables están bien declaradas y no doy pié con bola. Además, el problema nunca surge siempre en el mismo lugar, es decir, a veces surge antes de entrar a los ciclos, otras veces al ejecutar un query, otras veces al momento de llamar a un messagebox, y lo más desconcertante, a veces no sale el mugroso error.

Espero que me puedan echar un cable porque llevo ya varios dias con esto, y después de usar el EurekaLog, el MadException y algunas otras monerias que hallé en la red eto sigue sin solucionarse.

Agradezco mucho la atencion.

Fernando Castro
México, D.F.

  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 febrero 2010 - 09:53

¿seguro dentro de esos ciclos no se están manejando punteros?, normalmente ese tipo de error está relacionados con punteros.
  • 0

#3 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 23 febrero 2010 - 10:05

¿seguro dentro de esos ciclos no se están manejando punteros?, normalmente ese tipo de error está relacionados con punteros.


Hola Ecumene y mil gracias por la respuesta. No utilizo punteros, lo más que utilizo son dos objetos públicos los cuales no me han dado problema. Uso unos TStringList los cuales después de leer en algún lado los destruyo y los vuelvo a crear. Si gustas puedo poner el código para ver si 4 ojos ven mejor que dos.

Saludos!! y mil gracias

FCG
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 febrero 2010 - 10:12

Pues eso sería excelente mi estimado (y).
  • 0

#5 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 23 febrero 2010 - 10:40

Es extenso, pero pues ojalá se pueda entender bien. Ecumene te agradezco mucho la ayuda, y estoy al pendiente por si tienes alguna duda al respecto del código.


Saludos!!



delphi
  1. Procedure TWIprProces.CrearArchivo(pOper: String);
  2. Var
  3.   vI, vJ, vK, cont: Integer;
  4.   vL, vC, res: TStrings;
  5.   indice: Integer;
  6.   vCad, vTipo, vLong, vDeci, sCampo, sLinea, vId_Cia, vCve_t_cia, vddmm, vaa, vNombre, vObliga: String;
  7.   vNumero: Double;
  8.   bProcesar, bCrear, bCero: Boolean;
  9.   fTxt : TextFile;
  10.   aTot : Array of Extended;
  11.   vlDump: String;
  12.   vCi: TStrings;
  13.   sCadenaSQL : String;
  14. Begin
  15.   memArch.Lines.Clear;
  16.   edTotal.Text := '0';
  17.   memArch.Repaint;
  18.   edTotal.Repaint;
  19.   bCrear := False;
  20.   bCero := False;
  21.   cont := 0;
  22.   {Obtener la configuaracion general de la compañia}
  23.   vddmm := copy(edFFinPer.Text, 1,2)+ copy(edFFinPer.Text, 4,2);
  24.   vaa := copy(edFFinPer.Text, 9,2);
  25.   If qOpen.Active Then
  26.     qOpen.Close;
  27.   qOpen.Sql.Clear;
  28. {$IFDEF SPOT_MULTIEMPRESA} (*
  29.   * El nuevo código para soportar multiempresa *)
  30.   qOpen.Sql.Text := 'SELECT * '+
  31.                       'FROM IPR_CONFIG_GRAL '+
  32.                       'WHERE IPR_Id_Arch = '+ kmSs(vgArch_Global) +
  33.                       ' AND Id_Empresa = ' + Objeto.DameEmpresa;                                  // RJM 26/11/07
  34. // 26/09/2008  SPT-LMBC
  35. {$ELSE} (*
  36.   * El código original *)
  37.           qOpen.Sql.Text := 'SELECT * '+
  38.                       'FROM IPR_CONFIG_GRAL '+
  39. //                      'WHERE IPR_Id_Arch = '+ kmSs('IPR');
  40.                       'WHERE IPR_Id_Arch = '+ kmSs(vgArch_Global);                                  // RJM 26/11/07
  41. {$ENDIF}
  42.   Try
  43.     qOpen.Open;
  44.     If Not qOpen.IsEmpty Then Begin
  45.       vId_Cia := qOpen.FieldByname('IPR_ID_CIA').AsString;
  46.       vCve_t_cia := qOpen.FieldByname('IPR_CVEL_T_CIA').AsString;
  47.     End;
  48.   Finally
  49.     qOpen.Close;
  50.     qOpen.Sql.Clear;
  51.   End;
  52.  
  53.   SetLength(aTot, 30);
  54.   For vI := 0 To (vgArchivos.Count - 1) Do Begin
  55.     bProcesar := False;
  56.  
  57.  
  58.  
  59.  
  60.     bProcesar := (vgArchivos.Strings[vI] <> cgICC);
  61.     If Not((FindComponent(vgLstDanSum.Strings[vI] ) As TCheckBox).Checked) Then
  62.       bProcesar := False;
  63.  
  64.  
  65.  
  66.     If bProcesar Then Begin
  67.  
  68.       vL  := TStringLIst.Create;
  69.       vC  := TStringLIst.Create;
  70.       vCi := TStringLIst.Create;
  71.       res := TStringLIst.Create;
  72.  
  73.      
  74.       If qOpen.Active Then
  75.         qOpen.Close;
  76.       If qArchivo.Active Then
  77.         qArchivo.Close;
  78.       {Leer lineas del archivo}
  79. {$IFDEF SPOT_MULTIEMPRESA} (*
  80.   * El nuevo código para soportar multiempresa *)
  81.       qArchivo.Sql.Text := 'SELECT /*+ INDEX IPR_ARCHIVO(PK_IPR_ARCHIVO) */ '+
  82.                                   '* '+
  83.                               'FROM IPR_ARCHIVO '+
  84.                                 'WHERE IPR_F_FIN_PER  = '+ ToDate__(edFFinPer.Text)+
  85.                                   'AND ID_EMPRESA      = '+ Objeto.DameEmpresa+
  86.                                   'AND IPR_ID_ARCH    = '+ kmSs(vgArchivos.Strings[vI])+
  87.                                   'AND IPR_CVEL_T_OPER = '+ kmSs(pOper)+
  88.                                   'AND IPR_CVEL_ORIGEN = '+ kmSs(vgOrig_Out)+
  89.                                 'ORDER BY 5 ';
  90. // 30/09/2008  SPT-LMBC
  91. {$ELSE} (*
  92.   * El código original *)
  93.       qArchivo.Sql.Text := 'SELECT /*+ INDEX IPR_ARCHIVO(PK_IPR_ARCHIVO) */ '+
  94.                                   '* '+
  95.                               'FROM IPR_ARCHIVO '+
  96.                                 'WHERE IPR_F_FIN_PER  = '+ ToDate__(edFFinPer.Text)+
  97.                                   'AND IPR_ID_ARCH    = '+ kmSs(vgArchivos.Strings[vI])+
  98.                                   'AND IPR_CVEL_T_OPER = '+ kmSs(pOper)+
  99.                                   'AND IPR_CVEL_ORIGEN = '+ kmSs(vgOrig_Out)+
  100.                                 'ORDER BY 5 ';
  101. {$ENDIF}
  102.       qArchivo.Open;
  103.       bCero := False;
  104.       While Not qArchivo.Eof Do Begin
  105.         sLinea := qArchivo.FieldByName('IPR_Datos_1').AsString;
  106.         If Trim(sLinea) = '0' Then
  107.           bCero := True;
  108.         If pos('|', sLinea) > 0 Then Begin
  109.           sLinea := StringReplace(sLInea, '|', cgSC, [rfReplaceAll]);
  110.         End;
  111.         vC.Add(qArchivo.FieldByName('IPR_Datos_1').AsString);
  112.         vCi.Add(qArchivo.FieldByName('IPR_Id_Consec').AsString+ '\1'); // GFCG
  113.         If Length(qArchivo.FieldByName('IPR_Datos_2').AsString) > 0 Then
  114.           vC.Add(qArchivo.FieldByName('IPR_Datos_2').AsString);
  115.           vCi.Add(qArchivo.FieldByName('IPR_Id_Consec').AsString+ '\2'); // GFCG
  116.         If Length(qArchivo.FieldByName('IPR_Datos_3').AsString) > 0 Then
  117.           vC.Add(qArchivo.FieldByName('IPR_Datos_3').AsString);
  118.           vCi.Add(qArchivo.FieldByName('IPR_Id_Consec').AsString+ '\3'); // GFCG
  119.         qArchivo.Next;
  120.       End;
  121.       vNombre := Objeto.Nombre_Arch(vgArchivos.Strings[vI], vId_Cia, pOper, vddmm, vaa, vCve_t_cia);
  122.       Try
  123.         Rewrite_Archivo_Txt(vgRuta, vNombre, fTxt);
  124.         If vC.Count > 0 Then Begin
  125.           {Leer configuracion del formato}
  126.           If qOpen.Active Then
  127.             qOpen.Close;
  128.           If qFormato.Active Then
  129.             qFormato.Close;                                                                          // RJM 20/01/09
  130.           {Leer lineas del archivo}
  131.           {$IFDEF SPOT_MULTIEMPRESA} (*
  132.             * El nuevo código para soportar multiempresa *)
  133.                       qFormato.Sql.Text := 'SELECT * '+
  134.                                 'FROM IPR_CONFIG_ARCH '+
  135.                                 'WHERE IPR_Id_Arch '+  '= '+ kmSs(vgArchivos.Strings[vI])+
  136.                                 'AND ID_EMPRESA = ' + Objeto.DameEmpresa +
  137.                                 'AND IPR_Id_Arch_Glob = '+ kmSs(vgArch_Global);                  // RJM 26/11/07
  138.           {$ELSE} (*
  139.             * El código original *)
  140.                   qFormato.Sql.Text := 'SELECT * '+
  141.                                   'FROM IPR_CONFIG_ARCH '+
  142.                                   'WHERE IPR_Id_Arch '+  '= '+ kmSs(vgArchivos.Strings[vI])+
  143.                                       'AND IPR_Id_Arch_Glob = '+ kmSs(vgArch_Global);                  // RJM 26/11/07
  144.           {$ENDIF}
  145.           qFormato.Open;
  146.           vCad := qFormato.FieldByName('IPR_FMTO_CAMPOS').AsString;
  147.  
  148.  
  149.  
  150. Try
  151.           If Not bCero Then Begin
  152.             For vJ := 0 To (qFormato.FieldByName('IPR_NUM_CAMPOS').AsInteger - 1) Do Begin
  153.             indice := pos(cgSR, vCad);
  154.               vL.Add(copy(vCad, 1, indice));
  155.               vCad := copy(vCad, indice+ 1, Length(vCad));
  156.               aTot[vJ] := 0;
  157.               qFormato.Next;
  158.             End;
  159.             vJ  := 0;
  160.             vCad := '';
  161.             While vJ < vC.Count Do Begin
  162.               sLinea := '';
  163.               For vK := 0 To (qFormato.FieldByName('IPR_NUM_CAMPOS').AsInteger - 1) Do Begin
  164.                 If Length(vCad) = 0 Then
  165.                   vCad := vC.Strings[vJ];
  166.                 sCampo  := ObtPosCampo_sSep(vCad, vJ, vK, (qFormato.FieldByName('IPR_NUM_CAMPOS').AsInteger - 1));
  167.                 If ObtPosCampo(vL.Strings[vK], 2) = 'CONTROL' Then Begin
  168.                   aTot[vK] := -1234567890987654321;
  169.                 End Else Begin
  170.                   vTipo  := ObtPosCampo(vL.Strings[vk], 3);        //Tipo de Dato
  171.                 vLong  := ObtPosCampo(vL.Strings[vk], 4);        //Longitud
  172.                   vDeci  := ObtPosCampo(vL.Strings[vk], 5);        //Número decimales
  173.                   vObliga := ObtPosCampo(vL.Strings[vk], 7);        //Campo Obligatorio
  174.                 If          vTipo = 'C' Then Begin
  175.                     If Trim(vLong) <> '' Then Begin
  176.                     If (((vgArchivos.Strings[vI]        = 'DGAUI') Or
  177.                           (vgArchivos.Strings[vI]        = 'DGAUF')  ) And
  178.                           (ObtPosCampo(vL.Strings[vK], 2) = 'ESTATUS')  And
  179.                           (Length(sCampo)                = 2)          And
  180.                           (vLong                          = '2')            ) Then
  181.                         sCampo := copy(sCampo, 2, 1)
  182.                       Else
  183.                         sCampo := copy(sCampo, 1, StrToInt(vLong));
  184.                   End;
  185.                     If ((vObliga      =  'T') or
  186.                         (Trim(sCampo) <> '')    ) Then Begin
  187.                     aTot[vK] := aTot[vK] + 1;
  188.                     End;
  189.                   End Else If vTipo = 'F' Then Begin
  190.                     If Trim(sCampo) <> '' Then Begin
  191.                       {formatear la fecha}
  192.                       sCampo := FormatMaskText('##/##/####', sCampo);
  193.                     End;
  194.                     If ((vObliga      =  'T') or
  195.                         (Trim(sCampo) <> '')    ) Then Begin
  196.                       aTot[vK] := aTot[vK] + 1;
  197.                     End;
  198.                   End Else If vTipo = 'N' Then Begin
  199.                     vNumero := 0;
  200.                     If Trim(vDeci) = '' Then Begin
  201.                       vDeci := '0';
  202.                     End;
  203.                     If          Trim(sCampo) <> '' Then Begin
  204.                       vNumero := StrToFloat(sCampo);
  205.                       sCampo := Format('%'+ vLong+ '.'+ vDeci+ 'f', [vNumero]);
  206.                     End Else If vObliga = 'T' Then Begin
  207.  
  208.                       sCampo := Format( '%1'+ '.'+ vDeci+ 'f', [0.00]);
  209.  
  210.                     End;
  211.  
  212.                     aTot[vK] := Redondear((aTot[vK] + vNumero), StrToInt(vDeci));
  213.  
  214.                   End;
  215.  
  216.                   sCAmpo := Trim(sCampo);
  217.  
  218.                   sLinea := sLinea+ sCampo+ '|';
  219.  
  220.                 End;
  221.  
  222.               End; //for vK
  223.  
  224.               If          UpperCase(Objeto.ClassName) = 'TIPRPROCES' Then Begin
  225.                 sLinea := copy(sLinea, 1, Length(sLinea) - 1)+ ';';
  226.               End Else If UpperCase(Objeto.ClassName) = 'TSES07PROC' Then Begin
  227.                 sLinea := sLinea+ ';';
  228.               End;
  229.               WriteLn(fTxt, sLinea);
  230.             End; //for vJ
  231.             If UpperCase(Objeto.ClassName) = 'TSES07PROC' Then Begin
  232.               sLinea := '';
  233.               For vK := Low(aTot) To (qFormato.FieldByName('IPR_NUM_CAMPOS').AsInteger - 1) Do Begin
  234.                 If aTot[vK] <> -1234567890987654321 Then
  235.                   sLinea := sLinea+ FloatToStr(aTot[vK])+ '|';
  236.               End;
  237.               sLinea := sLinea+ ';';
  238.               WriteLn(fTxt, sLinea);
  239.             End;
  240.  
  241.           memArch.Lines.Add(vNombre);
  242.  
  243.  
  244.           End Else Begin
  245.             sLinea := '0';
  246.             WriteLn(fTxt, sLinea);
  247.           End;
  248.           cont := cont+ 1;
  249.           edTotal.Text := IntToStr(cont);
  250.           edTotal.Repaint;
  251.           memArch.Repaint;
  252.           bCrear := True;
  253.  
  254.  
  255.  
  256. {$IFDEF SPOT_MULTIEMPRESA} (*
  257.   * El nuevo código para soportar multiempresa *)
  258.  
  259.  
  260.           sCadenaSQL :=  'UPDATE IPR_PROCESO '+
  261.                                     ' SET IPR_NOM_ARCH = '+ QuotedStr(vNombre)+
  262.                                     ' WHERE IPR_F_FIN_PER  = '+ ToDate__(edFFinPer.Text)+
  263.                                     ' AND ID_EMPRESA      = '+ Objeto.DameEmpresa+
  264.                                     ' AND IPR_ID_ARCH    = '+ kmSs(vgArchivos.Strings[vI])+
  265.                                     ' AND IPR_CVEL_T_OPER = '+ kmSs(pOper);
  266.  
  267.           Application.ProcessMessages;
  268.           RunSQL(sCadenaSQL,Objeto.Apli.DataBaseName, Objeto.Apli.SessionName, True);
  269.  
  270.  
  271.  
  272. {$ELSE} (*
  273.   * El código original *)
  274.  
  275.           sCadenaSQL :=  'UPDATE IPR_PROCESO '+
  276.                         ' SET IPR_NOM_ARCH = '+ QuotedStr(vNombre)+
  277.                         ' WHERE IPR_F_FIN_PER  = '+ ToDate__(edFFinPer.Text)+
  278.                         ' AND IPR_ID_ARCH    = '+ kmSs(vgArchivos.Strings[vI])+
  279.                         ' AND IPR_CVEL_T_OPER = '+ kmSs(pOper);
  280.  
  281.           Application.ProcessMessages;
  282.           RunSQL(sCadenaSQL,Objeto.Apli.DataBaseName, Objeto.Apli.SessionName, True);
  283.  
  284.  
  285. {$ENDIF}
  286.  
  287.           If vgArch_Global = 'SES07' Then Begin
  288.             Try
  289. {$IFDEF SPOT_MULTIEMPRESA} (*
  290.   * El nuevo código para soportar multiempresa *)
  291.  
  292.             sCadenaSQL :=  ' INSERT INTO IPR_ARCHIVO '+
  293.                           ' (IPR_F_Fin_Per, ID_EMPRESA,  IPR_Id_Arch,  IPR_CveL_T_Oper, '+
  294.                           ' IPR_CveL_Origen, IPR_Id_Consec, IPR_Datos_1) '+
  295.                           ' VALUES ('+ ToDate__(edFFinPer.Text)+ ', '+
  296.                             Objeto.DameEmpresa+', '+
  297.                             kmS(vgArchivos.Strings[vI])+ ', '+
  298.                             kmS(pOper)+ ', '+
  299.                             kmS(cgSuma)+ ', '+
  300.                           ' 1, '+
  301.                             kmS('SUMATORIA GENERADA')+ ')';
  302.  
  303.             Application.ProcessMessages;
  304.             RunSQL(sCadenaSQL,Objeto.Apli.DataBaseName, Objeto.Apli.SessionName, True);
  305.  
  306. {$ELSE} (*
  307.   * El código original *)
  308.  
  309.             sCadenaSQL :=  ' INSERT INTO IPR_ARCHIVO '+
  310.                           ' (IPR_F_Fin_Per,  IPR_Id_Arch,  IPR_CveL_T_Oper, '+
  311.                           ' IPR_CveL_Origen, IPR_Id_Consec, IPR_Datos_1) '+
  312.                           ' VALUES ('+ ToDate__(edFFinPer.Text)+ ', '+
  313.                             kmS(vgArchivos.Strings[vI])+ ', '+
  314.                             kmS(pOper)+ ', '+
  315.                             kmS(cgSuma)+ ', '+
  316.                           ' 1, '+
  317.                             kmS('SUMATORIA GENERADA')+ ') ';
  318.  
  319.             Application.ProcessMessages;
  320.             RunSQL(sCadenaSQL,Objeto.Apli.DataBaseName, Objeto.Apli.SessionName, True);
  321.  
  322. {$ENDIF}
  323.             Except
  324.  
  325.  
  326.             End;
  327.  
  328.           End;
  329.  
  330.  
  331. Except
  332. //ShowMessage(vlDump+ kr+ '>'+ vCi.Strings[vJ]+ '<');
  333. Raise;
  334. End;
  335.         End; //of .count > 0
  336.       Finally
  337.         CloseFile(fTxt);
  338.       End;
  339.  
  340.     FreeAndNil(vL);
  341.     FreeAndNil(vC);
  342.     FreeAndNil(res);
  343.     FreeAndNil(vCi);
  344.  
  345.     End;
  346.  
  347.  
  348.  
  349.  
  350.   End; //for
  351.   If vgArch_Global = 'IPR' Then Begin
  352.     //Crear Archivo ICC
  353.     If qArchivo.Active Then
  354.       qArchivo.Close;
  355.     {Leer lineas del archivo}
  356. {$IFDEF SPOT_MULTIEMPRESA} (*
  357.   * El nuevo código para soportar multiempresa *)
  358.     qArchivo.Sql.Text := 'SELECT * '+
  359.                             'FROM IPR_ARCHIVO '+
  360.                             'WHERE IPR_F_FIN_PER  = '+ ToDate__(edFFinPer.Text)+
  361.                               'AND ID_EMPRESA      = '+ Objeto.DameEmpresa+
  362.                               'AND IPR_CVEL_T_OPER = '+ kmSs(pOper)+
  363.                               'AND IPR_CVEL_ORIGEN = '+ kmSs(vgOrig_Out)+
  364.                               'AND IPR_ID_ARCH    = '+ kmSs(cgICC)+
  365.                             'ORDER BY IPR_ID_CONSEC';
  366. {$ELSE} (*
  367.   * El código original *)
  368.     qArchivo.Sql.Text := 'SELECT * '+
  369.                             'FROM IPR_ARCHIVO '+
  370.                             'WHERE IPR_F_FIN_PER  = '+ ToDate__(edFFinPer.Text)+
  371.                               'AND IPR_CVEL_T_OPER = '+ kmSs(pOper)+
  372.                               'AND IPR_CVEL_ORIGEN = '+ kmSs(vgOrig_Out)+
  373.                               'AND IPR_ID_ARCH    = '+ kmSs(cgICC)+
  374.                             'ORDER BY IPR_ID_CONSEC';
  375. {$ENDIF}
  376.     qArchivo.Open;
  377.     res.Clear;
  378.     While Not qArchivo.Eof Do Begin
  379.       sLinea := qArchivo.FieldByName('IPR_DATOS_1').AsString;
  380.       sLinea := StringReplace(sLinea, cgSC, '|', [rfReplaceAll]);
  381.       sLinea := StringReplace(sLinea, cgSR, ';', [rfReplaceAll]);
  382.       res.Add(sLinea);
  383.       qArchivo.Next;
  384.     End;
  385.     If Not DirectoryExists(vgRuta) Then
  386.       CreateDir(vgRuta);
  387.     vNombre := cgICC+ vId_Cia+ pOper+  vddmm+ '.'+ vaa+ vCve_t_cia;
  388.     res.SaveToFile(vgRuta+ vNombre);
  389.     memArch.Lines.Add(vNombre);
  390.     cont := cont+ 1;
  391.     edTotal.Text := IntToStr(cont);
  392.     edTotal.Repaint;
  393.     memArch.Repaint;
  394.  
  395.     qArchivo.Close;
  396.  
  397.   End;
  398.   If bCrear Then
  399.     LlamaMsg(Objeto.Apli,1,102,'Creación Archivos IPR para '+ pOper)
  400.   Else
  401.     Application.MessageBox(pchar('No existe información necesaria para crear archivos.'), 'Information', MB_OK);
  402.  


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 febrero 2010 - 10:55

wow, es extenso si :s, pues tendremos que tomarnos el tiempo de revisarlo al paso. :D

  • 0

#7 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 23 febrero 2010 - 11:04

Saludos.

FerCastro no entiendo correctamente como se puede producir el error.  Pero a manera de consejo te invito a que Subdividas más tu código.

Me refiero a que uses más funciones o procedimientos en el lugar adecuado, así hasta para conseguir un Bug es mucho mas sencillo de corregir y para entender también.
  • 0

#8 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 23 febrero 2010 - 11:16

¡¡Mapacheeee!!, qué gusto encontrarte nuevamente en un foro de Delphi.

Bueno, al grano. Creo que podrías ponerle un poco de menos trabajo a la memoria si le pones dentro de alguno de los ciclos un "Application.ProcessMessages" para que no "sufra" el procesador con tanta carga.

Creo que AlGonzález me mostró alguna vez un SQL que tenía embebido un ProcessMessages, o fue Onti, la verdad no recuerdo. Pero te puedo asegurar que si lo pones, no te vas a arrepentir, y hasta podría ser que resuelvas tu caso insoluble.

Saludines, Inge.
  • 0

#9 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 23 febrero 2010 - 11:28

Mi estimado Jelipe!!

Muchas gracias por la respuesta. Puse unos antes de ejecutar unos querys al final, pero voy a menter unos más dentro de los ciclos principales,  a ver que tal furula.

Y si, estoy dividiendo mi código (que no es mio, más bien me aventaron este torito).

Saludos!! y muchas gracias por las respuestas

Fernando C
Mapache
México, D.F
  • 0

#10 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 25 febrero 2010 - 12:51

Hola al foro de nuevo

Por fin pude resolver el problema del Invalid Pointer Operation. Estuve depurando linea por linea y bloque por bloque hasta que por fin vi que el querido Delphi 5 tiene problemas con lo siguiente:

aTot : Array of Extended;



delphi
  1. aTot : Array of Extended; // Declaración de un arreglo extended
  2.  
  3. aTot[vJ] := 0;




Al momento de hacer una asignación sobre algún elemento de este arreglo el sistema me marcaba invalid pointer operation, no se por qué simplemente lo hacía.

Como lo resolví?? creeé un record:



delphi
  1. type
  2.   TTotales = Record
  3.     nTotal : Extended;
  4.   end;
  5.  
  6. // Y ya nadamas fué llamar a el campo del mismo
  7.  
  8. aTotales[vJ].nTotal := 0;




Y listo. Caso para la araña, pues al llamar al array de valores error, al llamar al arrar de records listo.


Gracias!! las sugerencias fueron realmente buenas.
  • 0

#11 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 25 febrero 2010 - 01:31

Hola al foro de nuevo

Por fin pude resolver el problema del Invalid Pointer Operation. Estuve depurando linea por linea y bloque por bloque hasta que por fin vi que el querido Delphi 5 tiene problemas con lo siguiente:

aTot : Array of Extended;



delphi
  1. aTot : Array of Extended; // Declaración de un arreglo extended
  2.  
  3. aTot[vJ] := 0;




Al momento de hacer una asignación sobre algún elemento de este arreglo el sistema me marcaba invalid pointer operation, no se por qué simplemente lo hacía.

Como lo resolví?? creeé un record:



delphi
  1. type
  2.   TTotales = Record
  3.     nTotal : Extended;
  4.   end;
  5.  
  6. // Y ya nadamas fué llamar a el campo del mismo
  7.  
  8. aTotales[vJ].nTotal := 0;




Y listo. Caso para la araña, pues al llamar al array de valores error, al llamar al arrar de records listo.


Gracias!! las sugerencias fueron realmente buenas.


Sigo pensando amigo que es un error de lógica, por que he usado arreglos dinámicos y cuando tengo errores es por una mala asignación de memoria.

Pero, me alegra que se haya solucionado tu problema, un saludo cordial


  • 0




IP.Board spam blocked by CleanTalk.