 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Dom 29 Feb, 2004 7:18 pm Asunto: TLabels que desaparecen |
|
|
Hola,en mi aplicacion leo desde el puerto serie,pues resulta que he puesto que unas subcadenas de una cadena pasen a ser el caption de dos TLabel,cuando ejecuto la aplicacion conectada al gps(desde donde recibo las cadenas) los Tlabel desaparecen ( es posible que esto pase por estar vacias las subcadenas?) _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
_Viktor Master


Registrado: 20 Jul 2003Mensajes: 463Ubicación: Santiago, Los Angeles - Chile
|
Publicado: Lun 01 Mar, 2004 5:27 am Asunto: |
|
|
Has hecho una traza para ver si las cadenas vienen vacias ?. O solo para probar podrias hacer algo como:
| Código: | String sCadena = DeDondeVengaLaInfo();
if(!sCadena.Trim().Length())
ShowMessage("Vacia");
else
Label1->Caption = sCadena; |
Es decir solo probar que no venga vacia o con espacios en blanco...
Saludos! _________________ "Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez
Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!! |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Lun 01 Mar, 2004 9:59 am Asunto: He hecho esto |
|
|
veras Viktor he hecho esto para tomar el valor de las subcadenas,vacias estn,pq no tengo recepcion del gps, pero lo que me resulta extraño es que si no conecto el gps no desaparecen los TLabel y si lo conecto y las cadenas estan vacias me desaparecen,hoy he de probar de salir a la calle a ver si tengo cobertura y te digo que ha pasado.mientras tanto te paso el codigo que he puesto:
//No se tiene en cuenta cuanto texto ha entrado en MemoDatos(solo pueden
//32k)
frmPloteo->Flujodedatos->SetSelTextBuf(InBuff);
AnsiString InBuff;
int pos = InBuff.Pos(",");
AnsiString resto = InBuff.SubString(pos + 1, InBuff.Length()-pos-1);pos = resto.Pos(",");
Latitud = resto.SubString(1, pos -1);
Longitud = resto.SubString(pos + 1 , resto.Length()- pos - 1 );
//Con este codigo los label "lat y long" deben mostrar latitud y longitud
// recibidos por el puerto serie
frmPloteo->lblLatPos->Caption = Latitud;
frmPloteo->lblLongPos->Caption = Longitud;
Ahhh una cosa mas,recibo 8 cadenas distintas,Puedo hacer que AnsiString identifique que cadenas me interesan y cuales no?
todas empiezan de manera distinta, ejemplo:
$GPGLL,4151.249,N,00317.046,E,091328,A*22
$GPRMB,V,,,,,,,,,,,,V*66
$GPRMC,091329,A,4151.249,N,00317.045,E,001.9,282,230204,000,E*7B
$GPVTG,282,T,282,M,001.9,N,003.6,K*43
$GPAAM,V,V,,N,*38
$GPAPB,A,A,,,N,V,V,,M,,,M,,M*47
$GPBWC,091330,,,,,,T,,M,,N,*1E
$GPGGA,
de unas quiero la subcadena que me de la posicion,de otras la que me da la velocidad y de otras la que me da el rumbo.
Gracias machotes _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Lun 01 Mar, 2004 11:32 am Asunto: |
|
|
Hola Picard
Cero q es normal q los label te desaparezcan. A menos que hagas lo q dice Viktor:
| Código: |
if(!Latitud.Trim().Length())
frmPloteo->lblLatPos->Caption = "No hay datos...";
else
frmPloteo->lblLatPos->Caption = Latitud;
|
Con respecto a lo de hacer cosas distintas según la primera palabra de la cadena, yo capturaría la primera parte de la cadena con
| Código: |
// Teniendo ya en pos la posición de la primera coma
AnsiString tipoCadena = InBuff.SubString(1, pos - 1);
|
Y luego haría varias comparaciones
| Código: |
if (tipoCadena == "$GPGLL")
...
else if (tipoCadena == "$GPRMB")
...
|
Existen herramientas que hacen esto de forma más fina y elegante, como el lex, pero si no sabes usarlo vas a perder más tiempo aprendiendo que sacándole partido.
Por cierto, me imagino que es pq lo q has puesto es un extracto de tu código, pero eso de:
| Código: |
//No se tiene en cuenta cuanto texto ha entrado en MemoDatos(solo pueden
//32k)
frmPloteo->Flujodedatos->SetSelTextBuf(InBuff);
AnsiString InBuff;
int pos = InBuff.Pos(",");
...
|
Estás redeclarando InBuff como variable local después de usarla en la línea anterior. Por tanto a partir de esa línea InBuff no tiene el contenido que tú esperas, sino que se inicializa a vacío. Si InBuff ya existe como variable global no deberías volver a declararla pq se convierte en otra variable distinta. |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Lun 01 Mar, 2004 11:50 am Asunto: muchisimas gracias "Invitado" |
|
|
Muchisimas gracias "Invitado" con el codigo que me has dado ya consigo que me diga que no hay datos,con respecto a las declaraciones de las variables (InBuff) voy haciendo pruebas ya que me da errores(dobles declaraciones,indefiniciones,estamentos desaparecidos etc....)
Prometo no olvidarme,o mas bien teneros a todos en cuenta el dia que termine esta aplicacion (si llega alguna vez ese dia).
lo dicho,sois geniales _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Lun 01 Mar, 2004 4:32 pm Asunto: No hay manera |
|
|
no se si es pq no est declarado correctamente,pero ahora que no me desaparecen los TLabel el caption es No hay Gps,he probado con cobertura del gps y mediante Flujodedatos veo que las cadenas no estan vacias,pero aqui sigo mas liado que un pulpo en un garage.
#include <vcl.h>
#pragma hdrstop
#include "unitPort.h"
#include "unitPloteo.h"
AnsiString Latitud;
AnsiString Longitud;
extern HANDLE hComm;
char InBuff[100];
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TRead::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
__fastcall TRead::TRead(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TRead::DisplayIt()
{
//No se tiene en cuenta cuanto texto ha entrado en MemoDatos(solo pueden
//32k)
frmPloteo->Flujodedatos->SetSelTextBuf(InBuff);
AnsiString InBuff;
int pos = InBuff.Pos(",");
AnsiString resto = InBuff.SubString(pos + 1, InBuff.Length()-pos-1);pos = resto.Pos(",");
Latitud = resto.SubString(1, pos -1);
Longitud = resto.SubString(pos + 1 , resto.Length()- pos - 1 );
// Teniendo ya en pos la posición de la primera coma
AnsiString tipoCadena = InBuff.SubString(1, pos - 1);
//Con este codigo los label "lat y long" deben mostrar latitud y longitud
// recibidos por el puerto serie
if(!Latitud.Trim().Length())
frmPloteo->lblLatPos->Caption = "No hay Gps";
else
frmPloteo->lblLatPos->Caption = Latitud;
if
(!Longitud.Trim().Length())
frmPloteo->lblLongPos->Caption = "No hay Gps";
else
frmPloteo->lblLongPos->Caption = Longitud;
}
void __fastcall TRead::Execute()
{
//---- Place thread code here ----
DWORD dwBytesRead;
//Destruye el Thread cuando termina
FreeOnTerminate = true;
while(1)
{
//Intenta leer del puerto y si hay algo lo visualiza
ReadFile(hComm,InBuff,50,&dwBytesRead,NULL);
if(dwBytesRead)
{
InBuff[dwBytesRead] = 0; //Acaba la cadena en nulo
Synchronize(DisplayIt);
}
}
}
//--------------------------------------------------------------------------- _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Lun 01 Mar, 2004 4:34 pm Asunto: No hay manera |
|
|
no se si es pq no est declarado correctamente,pero ahora que no me desaparecen los TLabel el caption es No hay Gps,he probado con cobertura del gps y mediante Flujodedatos veo que las cadenas no estan vacias,pero aqui sigo mas liado que un pulpo en un garage.
#include <vcl.h>
#pragma hdrstop
#include "unitPort.h"
#include "unitPloteo.h"
AnsiString Latitud;
AnsiString Longitud;
extern HANDLE hComm;
char InBuff[100];
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TRead::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
__fastcall TRead::TRead(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TRead::DisplayIt()
{
//No se tiene en cuenta cuanto texto ha entrado en MemoDatos(solo pueden
//32k)
frmPloteo->Flujodedatos->SetSelTextBuf(InBuff);
AnsiString InBuff;
int pos = InBuff.Pos(",");
AnsiString resto = InBuff.SubString(pos + 1, InBuff.Length()-pos-1);pos = resto.Pos(",");
Latitud = resto.SubString(1, pos -1);
Longitud = resto.SubString(pos + 1 , resto.Length()- pos - 1 );
// Teniendo ya en pos la posición de la primera coma
AnsiString tipoCadena = InBuff.SubString(1, pos - 1);
//Con este codigo los label "lat y long" deben mostrar latitud y longitud
// recibidos por el puerto serie
if(!Latitud.Trim().Length())
frmPloteo->lblLatPos->Caption = "No hay Gps";
else
frmPloteo->lblLatPos->Caption = Latitud;
if
(!Longitud.Trim().Length())
frmPloteo->lblLongPos->Caption = "No hay Gps";
else
frmPloteo->lblLongPos->Caption = Longitud;
}
void __fastcall TRead::Execute()
{
//---- Place thread code here ----
DWORD dwBytesRead;
//Destruye el Thread cuando termina
FreeOnTerminate = true;
while(1)
{
//Intenta leer del puerto y si hay algo lo visualiza
ReadFile(hComm,InBuff,50,&dwBytesRead,NULL);
if(dwBytesRead)
{
InBuff[dwBytesRead] = 0; //Acaba la cadena en nulo
Synchronize(DisplayIt);
}
}
}
//--------------------------------------------------------------------------- _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mar 02 Mar, 2004 10:17 am Asunto: |
|
|
Hola Picard
Sigues teniendo el mismo fallo: estás redeclarando InBuff.
Fijate que lo tienes como variable global:
char InBuff[100];
q es la variable que contiene realmente los datos del GPS, y después en tu función lo redeclaras:
void __fastcall TRead::DisplayIt()
{
//No se tiene en cuenta cuanto texto ha entrado en MemoDatos(solo pueden
//32k)
frmPloteo->Flujodedatos->SetSelTextBuf(InBuff);
AnsiString InBuff;
...
}
Lo q tendrías q hacer es emplear una variable con nombre distinto dentro de la función pero que tenga el mismo contenido que InBuff. Eso lo consigues con un typecast:
| Código: |
AnsiString strInBuff = AnsiString(InBuff);
|
Luego usas esta variable para todo el tratamiento de la cadena en lugar de la variable global InBuff.
La única duda que me queda es que no te funcione el constructor de AnsiString con un array estático de char. En ese caso, tal vez puedas sustituir el código que te he puesto por:
| Código: |
AnsiString strInBuff;
strInBuff.printf("%s", InBuff);
|
Espero que te sirva esto. |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Mar 02 Mar, 2004 10:35 am Asunto: ya no se que hacer |
|
|
Si no redeclaro InBuff me da una serie de errores,si lo redeclaro no me los da,pero tampoco me toma las subcadenas para ponerlas en los TLabel
 _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Mie 03 Mar, 2004 8:58 pm Asunto: errores |
|
|
Cualquiera de los codigos que me dais me da este error:
[C++ Error] unitPort.cpp(39): E2294 Structure required on left side of . or .*
tambien me da el mismo error si no declaro: AnsiString InBuff; como variable local ademas de declararla globalmente
racias machotes _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Jue 04 Mar, 2004 10:16 am Asunto: |
|
|
Picard, te voy a poner el código completo de la función con la corrección que te sugerí, porque creo q no me estás entendiendo.
| Código: |
void __fastcall TRead::DisplayIt() {
//No se tiene en cuenta cuanto texto ha entrado en MemoDatos(solo pueden
//32k)
frmPloteo->Flujodedatos->SetSelTextBuf(InBuff);
AnsiString strInBuff = AnsiString(InBuff);
int pos = strInBuff.Pos(",");
AnsiString resto = strInBuff.SubString(pos + 1, strInBuff.Length()-pos-1);pos = resto.Pos(",");
Latitud = resto.SubString(1, pos -1);
Longitud = resto.SubString(pos + 1 , resto.Length()- pos - 1 );
// Teniendo ya en pos la posición de la primera coma
AnsiString tipoCadena = strInBuff.SubString(1, pos - 1);
//Con este codigo los label "lat y long" deben mostrar latitud y longitud
// recibidos por el puerto serie
if(!Latitud.Trim().Length())
frmPloteo->lblLatPos->Caption = "No hay Gps";
else
frmPloteo->lblLatPos->Caption = Latitud;
if (!Longitud.Trim().Length())
frmPloteo->lblLongPos->Caption = "No hay Gps";
else
frmPloteo->lblLongPos->Caption = Longitud;
}
|
A eso es a lo que me refiero con usa otra variable en lugar de la global para el proceso de la cadena. |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Jue 04 Mar, 2004 10:24 am Asunto: |
|
|
Por cierto, estoy viendo que tienes lagunas importantes con conceptos básicos de programación. Quizás es porque has intentado abarcar demasiado a la primera (Threads y cosas de ese estilo es como empezar la casa por el tejado). De todas formas, es normal, porque casi todos los que hemos empezado a programar siempre nos buscamos un programita que hacer para aprender y no siempre entra dentro de nuestras posibilidades.
Te recomiendo que busques en Internet los libros "Thinking in C++" de Bruce Eckel. Están en inglés (aunque creo q hay alguna traducción por ahí) pero son muy buenos, y empiezan desde un nivel más o menos bajo hasta explicarte verdaderos misterios del C++. Esto puede servirte para comprender un poco mejor lo que hay debajo del Builder y te hará superar problemas que sin esos conceptos parecen inabordables.
De cualquier manera, te animo a q t pelees lo q haga falta con tu programa para conseguir terminarlo. Sigue preguntando sin miedo y llegará un momento en que serás tú el que responda en el foro. |
|
| Volver arriba |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Jue 04 Mar, 2004 7:10 pm Asunto: Muchisimas gracias |
|
|
Gracias por todo,ahora ya veo los caption de los Tlabel,solo me queda ir discriminando que subcadenas me interesan y cuales no.
Haciendo referencia a tu comentario sobre empezar la casa por el tejado te dire que tienes toda la razon del mundo,pero todo tiene una explicacion,en mi caso dos.
la unica informacion que consegui para comunicarme con el puerto serie fue esta,mediante un ThRead. la segunda es la siguiente.creo que en programacion todos tenemos una tendencia sobre el tipo de aplicaciones que hacemos o queremos hacer al menos cuando me refiero a programar de forma no profesional,a mi entender a un cocinero se le ocurriria hacer una aplicacion por ejemplo sobre como gestinar una cocina para hacer mas facil su trabajo y el de sus compañeros, a un ingeniero de caminos una aplicacion encarada al mundo profesional en el que el se mueve,por suerte o por desgracia yo soy marinero y he querido hacer algo dirigido a mi sector profesional,si que es cireto que es mucjo proyecto para un programadorcillo tan simple como yo,pero como ya dije en otro topic,con algunos libros y vuestra ayuda lo sacare adelante (pero una y no mas santo tomas) asi que muchisimas gracias a todos por vuestra paciencia _________________ El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces) |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|