Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error "Invalid pointer operation" en función contenida en DLL (https://www.clubdelphi.com/foros/showthread.php?t=45027)

Albano 20-06-2007 22:08:34

Error "Invalid pointer operation" en función contenida en DLL
 
Hola a todos! tengan un buen dia...
Trabajo con delphi 2005, hice una función que convierte un número flotante a Letra, incluyendo los centavos... Esta función la hice hace tiempo, sin darme cuenta que en los trucos de aqui, esta una parecida, pero como yo hice esta, me quedo con ella... bueno, aqui voy a pegar el código de la función, para el que le interese, por ahorita no he detectado errores en números menores a 1 millón, estoy trabajando para sacar la siguiente parte.
Bueno... ahora les explico mi error. Esta función la tengo en una DLL y cada vez que la mando llamar, me muestra un error que dice lo siguiente: "Invalid pointer operation". No estoy usando punteros en esta función y si la pongo directamente en mi programa, me funciona a la perfección, el error solo sale cuando la pongo en la DLL y la quiero usar. ¿Alguien sabe qué esta pasando?
Gracias de antemano, Dios les bendiga.
Código Delphi [-]
Function TFrameGui.ConvNumLetra(Numero: extended): string;
var
  k, u, m, unidad: integer;
  cadena, resultado, nuevo, unidadnueva, centavos: string;
  unidadpendiente, decenapendiente, mil, millon: boolean;
begin
  cadena := floattostr(numero);
  delete(cadena, pos(decimalseparator, cadena), maxint);
  centavos := floattostr((numero - strtofloat(cadena))* 100);
  delete(centavos, pos(decimalseparator, centavos), maxint);
  m := 0;
  u := 1;
  resultado := '';
  mil := false;
  unidadpendiente := false;
  decenapendiente := false;
  unidad := 0;
  millon := false;
  for k := length(cadena) downto 1 do
  begin
    nuevo := '';
    case u of
      1:
      begin
        unidadpendiente := true;
        decenapendiente := true;
        unidadnueva := '';
        unidad := 0;
        case cadena[k] of
          '1':
          begin
            unidadnueva := 'UN';
            if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
            unidad := 1;
            if millon = true then
            begin
              nuevo := nuevo + ' MILLON ';
              millon := false;
              mil := false;
            end;
          end;
          '2':
          begin
            unidadnueva := 'DOS';
            if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
            unidad := 2;
          end;
          '3':
          begin
            unidadnueva := 'TRES';
            if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
            unidad := 3;
          end;
          '4':
          begin
            unidadnueva := 'CUATRO';
            if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
            unidad := 4;
          end;
          '5':
          begin
            unidadnueva := 'CINCO';
            if (k > 1) and (cadena[k - 1] = '1') then unidadnueva := '';
            unidad := 5;
          end;
          '6': unidadnueva := 'SEIS';
          '7': unidadnueva := 'SIETE';
          '8': unidadnueva := 'OCHO';
          '9': unidadnueva := 'NUEVE';
          '0': unidadpendiente := false;
        end;
        if (cadena[k] in ['1'..'9']) and (mil = true) then
        begin
          nuevo := unidadnueva + ' MIL ';
          unidadnueva := '';
          mil := false
        end;
      end;
      2:
      begin
        case cadena[k] of
          '1':
          begin
            nuevo := 'DIECI';
            if cadena[k + 1] = '0' then nuevo := 'DIEZ';
          end;
          '2': nuevo := 'VEINTE';
          '3': nuevo := 'TREINTA';
          '4': nuevo := 'CUARENTA';
          '5': nuevo := 'CINCUENTA';
          '6': nuevo := 'SESENTA';
          '7': nuevo := 'SETENTA';
          '8': nuevo := 'OCHENTA';
          '9': nuevo := 'NOVENTA';
          '0': decenapendiente := false;
        end;
        if mil = true then
        begin
          nuevo := nuevo + ' MIL ';
          mil := false
        end;
      end;
      3:
      begin
        case cadena[k] of
          '1': nuevo := 'CIENTO ';
          '2': nuevo := 'DOSCIENTOS ';
          '3': nuevo := 'TRESCIENTOS ';
          '4': nuevo := 'CUATROCIENTOS ';
          '5': nuevo := 'QUINIENTOS ';
          '6': nuevo := 'SEISCIENTOS ';
          '7': nuevo := 'SETECIENTOS ';
          '8': nuevo := 'OCHOCIENTOS ';
          '9': nuevo := 'NOVECIENTOS ';
        end;
        if mil = true then
        begin
          nuevo := nuevo + ' MIL ';
          mil := false
        end;
      end;
    end;
    if u = 2 then //esta condición indica que estamos en decenas
    begin
      if unidadpendiente = false then  //esta condición indica que hay una unidad pendiente
      begin
        if nuevo = 'DIECI' then nuevo := 'DIEZ';
        resultado := nuevo + unidadnueva + resultado;
        unidadnueva := '';
      end
      else
      begin
        if nuevo = 'DIECI' then
        begin
          case unidad of
            1:
            begin
              nuevo := 'ONCE';
              unidadnueva := '';
            end;
            2:
            begin
              nuevo := 'DOCE';
              unidadnueva := '';
            end;
            3:
            begin
              nuevo := 'TRECE';
              unidadnueva := '';
            end;
            4:
            begin
              nuevo := 'CATORCE';
              unidadnueva := '';
            end;
            5:
            begin
              nuevo := 'QUINCE';
              unidadnueva := '';
            end;
          end;
          resultado := nuevo + unidadnueva + resultado;
        end
        else
        begin
          if nuevo <> '' then
            resultado := nuevo + ' Y ' + unidadnueva + resultado
          else resultado := nuevo + unidadnueva + resultado;
        end;
        unidadnueva := '';
      end;
    end
    else
    begin
      if decenapendiente = false then
      begin
        if nuevo = 'CIENTO ' then nuevo := 'CIEN ';
        resultado := nuevo + resultado;
      end
      else resultado := nuevo + resultado;
    end;
    if u < 3 then inc(u)
    else
    begin
      u := 1;
      case m of
        0:
        begin
          if numero > 999 then
            mil := true;
        end;
        1:
        begin
          if numero > 999999 then
            millon := true;
        end;
      end;
      if m = 0 then inc(m)
      else m := 0;
    end;
  end;
  if length(cadena) < 2 then resultado := unidadnueva;
  result := resultado + ' PESOS ' + centavos + '/100 M.N.';
end;

roman 20-06-2007 22:31:12

Si usas dlls con delphi, no puedes usar el tipo de datos string a no ser que incluyas la unidad ShareMem. Puedes usar PChar o bien ShortString. Este último te será más cómodo porque no tienes que estar asignando memoria, pero tiene un límite de 255 caracteres.

// Saludos

Albano 20-06-2007 23:01:31

Perfecto!!! eso era Roman, muchas gracias.


La franja horaria es GMT +2. Ahora son las 20:28:09.

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