Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-06-2007
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
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;
__________________
"Sé de tal manera y vive una vida tal, que si todos los hombres fueran como tú y vivieran como tú, nuestro mundo sería un paraíso terrenal"
Siempre hazlo con la ayuda de Dios
Responder Con Cita
  #2  
Antiguo 20-06-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 20-06-2007
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 20
Albano Va por buen camino
Perfecto!!! eso era Roman, muchas gracias.
__________________
"Sé de tal manera y vive una vida tal, que si todos los hombres fueran como tú y vivieran como tú, nuestro mundo sería un paraíso terrenal"
Siempre hazlo con la ayuda de Dios
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Me aparece el error "Insufficient memory for this operation." ilichhernandez Varios 5 23-07-2010 18:48:16
Acceso a Outlook 2003 Reminders y error "Invalid Variant Operation" saldanaluis Providers 2 24-05-2007 21:17:58
QR - Invalid Pointer Operation alapaco OOP 6 07-06-2006 22:43:31
Error "Invalid User/Password" al intentar conectar con dbexpress vivim82 Conexión con bases de datos 1 30-04-2004 03:22:49


La franja horaria es GMT +2. Ahora son las 17:38:58.


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
Copyright 1996-2007 Club Delphi