Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   ¡De Locos! Delphi 11 cambia el índice de las Strings (https://www.clubdelphi.com/foros/showthread.php?t=95435)

jhonalone 20-10-2021 19:45:20

¡De Locos! Delphi 11 cambia el índice de las Strings
 
Hola sufridores. (Quizá sea yo sólo el sufridor)
Otro problema. Al tratar de compilar App's antiguas con Delphi 11 compruebo que ha cambiado el índice de las Strings para compilaciones Android.

Antes estaba basado en 0 (cero) y ahora está basado en 1 (uno)

¿Que cómo lo he descubierto?

Muy sencillo: os reproduzco los cambios necesarios para que funcione la app con Delphi 11 (Con Delphi 10.3.3 todavía funcionaba)

Código anterior, Funcionando hasta delphi 10.3.3
Código Delphi [-]
S2 := Memo1.Text;


       while S2.IndexOf(' ')<>-1 // Quitamos Blancos
       do s2:= S2.Remove(S2.IndexOf(' '),1);

       // Cambiamos puntos por comas
       s2:= S2.Replace('.',',');

     
       EsNum := True;

       for xx:=0 to S2.Length - 1
       do  if not CharInSet(S2[xx], ['0'..'9', ',', '-'])
           then EsNum := False;
           if EsNum = False then ShowMessage(S2);

Con Delphi 11 dispara el mensaje con el valor de S2
Con esta corrección ya no dispara el mensaje y toma los valores correctos:
Código Delphi [-]
S2 := Memo1.Text;


       while S2.IndexOf(' ')<>-1 // Quitamos Blancos
       do s2:= S2.Remove(S2.IndexOf(' '),1);

       // Cambiamos puntos por comas
       s2:= S2.Replace('.',',');

     
       EsNum := True;

       for xx:=1 to S2.Length 
       do  if not CharInSet(S2[xx], ['0'..'9', ',', '-'])
           then EsNum := False;
           if EsNum = False then ShowMessage(S2);

ESTO ME OBLIGA A REVISAR CUALQUIER APP ANTERIOR SI LA COMPILO CON DELPHI 11

¿Alguien puede decirle a Embarcadero que ésto no debe hacerse?

Saludos a todos

dec 21-10-2021 08:02:58

Hola a todos,

Esta página en la Wiki de Embarcadero tal vez pueda ser de tu interés. Aparentemente, podrías utilizar lo siguiente para que los "strings indexes" siguiesen comenzando por cero:
Código Delphi [-]
{$ZEROBASEDSTRINGS ON}

jhonalone 21-10-2021 15:07:30

MUCHAS GRACIAS dec.

Me has ahorrado mucho trabajo.

Ya he visitado el enlace y lo he entendido.

Sin embargo, no deja de ser una faena de Embarcadero.

Además he visto que han cambiado otras cosas, lo que me oobligará a ir revisando las App's.

Dado que las aplicaciones tienen varios formularios y yo no suelo usar directivas especiales, (uso las que están por defecto, además de ser sólo un aficionado). No sé si tengo que usar la directiva en cada Form o sólo en el de arranque. Sácame de dudas, por favor. GRACIAS DE NUEVO.

Saludos cordiales.

jhonalone 21-10-2021 17:32:47

Vale dec.
No hace falta que me respondas.
He comprobado que la directiva {$ZEROBASEDSTRINGS ON} debe incluirse en cada Unit que lo necesite.
Saludos.

Ñuño Martínez 29-10-2021 12:20:30

Lo que me parece raro es que antes el índice estuviera basado en 0, cuando desde siempre en Pascal las cadenas empiezan en 1. El error fue ese.

dec 30-10-2021 10:10:04

Hola a todos,

Cita:

Empezado por jhonalone (Mensaje 543668)
Vale dec.
No hace falta que me respondas.
He comprobado que la directiva {$ZEROBASEDSTRINGS ON} debe incluirse en cada Unit que lo necesite.
Saludos.

¿Estás seguro de eso? Uno diría que si pones esa opción en el archivo del proyecto (DPR), debería surtir efecto en el resto de unidades y formularios. Tal vezl algún compañero me contradice con razón, pero, yo diría que no hace falta poner esa opción en cada una de las unidades, sino que bastaría hacerlo en el archivo del proyecto... suponiendo que no pueda hacerse desde las opciones... aunque yo casi que preferiría hacerlo en el archivo del proyecto.

P.D. No estoy seguro de si dicha opción podría ponerse en el archivo DPR después de haber incluido todas las unidades... o de si se podría y sería por tanto mejor hacerlo en el archivo del proyecto "arriba del todo", antes de que se incluyan el resto de unidades, con la idea (incluso para que quede más claro) de que la opción se aplique en todo el proyecto y en todas las unidades que dicho proyecto va a requerir después.


La franja horaria es GMT +2. Ahora son las 09:43:07.

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