Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   ¿Interpreto mal TryStrToInt? (https://www.clubdelphi.com/foros/showthread.php?t=95579)

Angel.Matilla 21-02-2022 12:31:39

¿Interpreto mal TryStrToInt?
 
Estoy leyendo un fichero XML de recibos domiciliados. En un de los nodos está el número de recibos que se uncluyen en el fichero:
Cita:

<NbOfTxs>15</NbOfTxs>
y para leerlo hago esto:
Código:

iNode3 = iNode2->ChildNodes->FindNode("NbOfTxs");
if (iNode3 == NULL || !TryStrToInt(iNode3->Text, fForBln->Barra->MaxValue))
    continue;

El contenido del nodo, si ejecuto el cóidigo con el depurador, es el que he puesto arriba. No sé si es que estoy interpretando mal cómo trabaja TryStrToInt, pero aunque el nodo leído es el anterior al ejecutarse ese if el valor que me devuelve en MaxValue es 26 y no 15, valor que sí asigna si hago esto:
Código:

fForBln->Barra->MaxValue = StrToInt(iNode3->Text);
Barra es un TProgressBar que hay en otro formulario.

Casimiro Noteví 21-02-2022 12:40:10

Si he entendido bien sobra el '!', ya que devuelve true o false si ha podido, o no, convertir el texto en integer.
Cita:

TryStrToInt converts the string S, which represents an integer-type number in either decimal or hexadecimal notation, into a number, which is assigned to Value. If S does not represent a valid number, TryStrToInt returns False; otherwise TryStrToInt returns True.

Angel.Matilla 21-02-2022 19:38:15

Yo creo que no sobra porque además de hacer la conversión hay que evaluar si se ha hecho. Es parecido, entiendo yo, a StrToIntDef:
Código:

if (iNode3 == NULL || StrToIntDef(iNode3->Text, 0) < 1)
    continue;

Al menos lo entiendo así. Lo que me hace falta es que si no hace la conversión no siga ejecutando el resto del código.

Casimiro Noteví 21-02-2022 20:41:12

Ponlo entre paréntesis (!StrToIntDef(iNode3->Text, 0)), o prueba solo por separado cada comparación para comprobar qué falla.

escafandra 21-02-2022 22:26:05

Ten en cuenta que el entero que pasas es una referencia por lo que al intentar con propiedades de componentes VCL tendrás problemas de asignación. Una una variable de tipo int intermedia.
Código:

bool __fastcall TryStrToInt(const System::UnicodeString S,  int &Value);



Saludos.

Angel.Matilla 22-02-2022 11:45:47

Cita:

Empezado por escafandra (Mensaje 545510)
Ten en cuenta que el entero que pasas es una referencia por lo que al intentar con propiedades de componentes VCL tendrás problemas de asignación. Una una variable de tipo int intermedia.

Efectivamente esa es la solución. Gracias a los dos por la ayuda.


La franja horaria es GMT +2. Ahora son las 12:37:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi