Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-05-2006
Chalo78 Chalo78 is offline
Miembro
 
Registrado: ene 2006
Posts: 11
Poder: 0
Chalo78 Va por buen camino
Lightbulb Problemas con "COPY"

Hola Amigos del Foro,
Estoy desarrollando un programa que captura los datos de latitud y longitud (float) desde un GPS, datos que posteriormente los compara con una referencia que entrega el usuario. Si lo anterior es válido, en una carta digital que está georeferenciada, se genera un punto rojo que marca la posición del usuario dentro de dicha carta. Hasta ahí todo va bien, el problema lo tengo al tratar de editar el valor que me entrega el GPS para que sea un entero. Es decir, si la latitud en segundos es 35,43, necesito solo el 35 y si la longitud es 0,42, solo necesito el 0. Estos valores pueden variar en su longitud, ya que si bien el GPS solo entrega valores con 2 decimales significativos, los enteros pueden ser 1 o 2 como máximo (ejemplo: 59, 23 segundos ó en algunos casos 02,37). Luego de buscar en el foro, encontré funciones como trunc, RoundTo y otras, pero opté por usar “Copy”, de la forma en que se aprecia en el código de abajo, ya que las funciones me causaban problemas y mis conocimientos de Delphi son muy básicos. El programa compila bien y se genera el ejecutable, pero llegado el momento de realizar el redondeo de las cifras me arroja el siguiente error: “Raised Exception Class EConvert Error with message ‘ ‘’is not a valid Integer Value’. Process stopped. Use Step or Run to continue.” Según lo que entiendo, las comilla que encierran al separador (‘,’) me están causando el problema, pero lo cierto es que no sé como solucionarlo.
Les adjunto el código para que quede más claro y a ver si alguien más avezado me puede ayudar con este problema que ya me saca canas verdes. De antemano muchas gracias a quienes lean este mensaje.
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
 var
    strGPSMinL : String;
    strMinL : String;
    strMinG : String;
    strGPSMinG : String;
    intMinLat1 : Integer;
    intMinLong1 : Integer;
    intMinLat2 : Integer;
    intMinLong2 : Integer;
    intMinL : Integer;
    intMinG : Integer;
    pxl : Integer;
    pxg : Integer;
    begin
     strSecLat := FloatToStr(ZylGPSReceiver.GetLatitudeSecond); //Transformación de datos de Segundos de Latitud a String
     strSecLong := FloatToStr(ZylGPSReceiver.GetLongitudeSecond);//Transformación de datos de Segundos de Longitud a String
     strGPSMinL := FloatToStr(ZylGPSReceiver.GetLatitudeMinute); //Transformación de datos de Minutos de Latitud a String
     strGPSMinG := FloatToStr(ZylGPSReceiver.GetLongitudeMinute);//Transformación de datos de Segundos de Longitud a String
     strMinL := copy (strGPSMinL,0,2); //Datos de minutos de latitud con dos decimales significativos
     strMinG := copy (strGPSMinG,0,2); //Datos de minutos de longitud con dos decimales significativos
     Edit3.Text := strMinL;//visualización de los datos de minutos de latitud con dos decimales significativos
     Edit4.Text := strMinG;//visualización de los datos de minutos de longitud con dos decimales significativos
     intMinL := StrToInt(strMinL);//Transformación de de variable anterior a Integer
     intMinG := StrtoInt(strMinG);//Transformación de de variable anterior a Integer
     intMinLat1 := StrToInt(txtminlat1.Text);//Referencia geográfica de una carta digital para comparación con datos obtenidos del GPS
     intMinLong1 := StrToInt(txtminlong1.Text);//Referencia geográfica de una carta digital para comparación con datos obtenidos del GPS
     intMinLat2 := StrToInt(txtminlat2.Text);//Referencia geográfica de una carta digital para comparación con datos obtenidos del GPS
     intMinLong2 := StrToInt(txtminlong2.Text);//Referencia geográfica de una carta digital para comparación con datos obtenidos del GPS
     pos2 := (Copy(strSecLat,1,(Pos(',',strSecLat))-1));//***Rescate de la parte entera de la variable string "strSecLat"***  AQUÍ ESTÁ EL PROBLEMA
     pos1 := (Copy(strSecLong,1,(Pos(',',strSecLong))-1));//***Rescate de la parte entera de la variable string "strSecLat"***AQUÍ ESTÁ EL PROBLEMA
     Edit1.Text:=pos1 //visualización de la variable pos1=posición 1
     Edit2.Text := pos2//visualización de la variable pos2=posición 2
     mensajedeerror.Caption := ' ';//asigna un espacio en blanco en caso de no existir un error en la comparación de la línea siguiente
     if (intMinL <= intMinLat1) and (intMinG <= intMinLong1) and (intMinL <= intMinLat2) and (intMinG <= intMinLong2) then
      Begin
      if  (pos1 = '0') and (intMinL = intMinLat2) then
      pxl := 595;
      ... etc
Responder Con Cita
  #2  
Antiguo 13-05-2006
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
a veces marca el delphi los errores una linea despues de lo que causo el problema, porque no pruebas en lugar de strtoint la funcion strtointdef donde si no es valido el lo que le mandes a convertir, te da un numero por default, tal vez en los edits no lo estes dando valores y al no darselos no te convierte a cero, te marca el error que mencionas, insisto, que como prueba uses la funcion strtointdef, solo para descartar algun caracter invalido en la conversion
Responder Con Cita
  #3  
Antiguo 14-05-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Lo que ocurre es que no está cogiendo ningún número, es decir, la cadena vacía no es un entero válido.

strMinG := copy (strGPSMinG,0,2)

Para usar la orden copy debes empezar copiando en el índice 1, tú estas empezando en cero.

Para convertirlo, usa mejor tryStrtoInt, o bien StrToIntDef, así no tendrás fallos de conversión.

Personalmente usaría los Floats y despues usaría Trunc para coger la parte entera.

Ten en cuenta que delphi usa el punto como separador decimal así que una coma te dará errores.
- Puedes reemplazar la coma por punto usando StringReplace (delphi 6 o superior creo recordar)
- Puedes cambiar la variable SysUtils.DecimalSeparator para que funcione con la coma.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 15-05-2006
Chalo78 Chalo78 is offline
Miembro
 
Registrado: ene 2006
Posts: 11
Poder: 0
Chalo78 Va por buen camino
Chicos,
Gracias por la ayuda, voy a probar usando los consejos que me dan.
Saludos,
Chalo.
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
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 11:01:19
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16
Problema con funcion "COPY" (string) emeceuy Varios 6 28-05-2004 23:39:31
Tipo de Variable."String" ó "Double" UTECYBER OOP 7 15-12-2003 20:25:39


La franja horaria es GMT +2. Ahora son las 10:19:12.


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