Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Uso de CharInSet (https://www.clubdelphi.com/foros/showthread.php?t=86769)

jafera 30-09-2014 10:20:06

Uso de CharInSet
 
Hola de nuevo a todos.

Despues de unos dias sin tocar Delphi, he retomado la conversión de un proyecto D6 a DXE7 y al compilar, todo sale correcto pero me envia el warning siguiente:

[dcc32 Warning] Principal.pas(227): W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.

El codigo es el siguiente:

Código Delphi [-]
if ((Sender as TJvDBGrid).SelectedField.FieldName = 'DIVENDRES') then
        begin
                if(UpCase(Key) in ['N','S']) then      //Esta es la linea 227
                        Key:= UpCase(Key)
                else
                        Key:= #0;
        end;

Entiendo que me propone que cambie una funcion pero no acabo de entenderlo.

Muchas gracias por adelantado.

Josep

ElKurgan 30-09-2014 12:19:43

Todo viene a cuenta de la inclusión de Unicode a partir de Delphi 2009. Te aconsejan utilizar la función CharInSet porque funciona con esos tipos de cadenas de forma más eficiente.

Saludos

jafera 30-09-2014 12:43:04

Gracias por la respuesta, pero sigo sin aclararme.

Debo cambiar el tipo de campo en la tabla?
Debo añadir la fguncion al uses?

Saludos

Josep

engranaje 30-09-2014 13:27:52

Si no me equivoco lo que te está recomendando es que hagas

Código Delphi [-]
  if CharInSet (UpCase(Key), ['N','S']) then

en lugar de

Código Delphi [-]
  if(UpCase(Key) in ['N','S']) then

CharInSet está en sysutils por lo que si no lo tuvieras en el uses tendrías que añadirla.

gatosoft 30-09-2014 14:39:16

Cita:

Empezado por jafera (Mensaje 482339)
D6 a DXE7 y al compilar, todo sale correcto

Increible...!! yo he hecho un par de migraciones de éste tipo y nunca fue tan sencillo. D2009 introdujo varios cambios importantes que obligaron a revisar todos los programas, sobre todo en el tema de cadenas... creo que fue a partir de ésta versión que comenzamos a hablar de Unicode, Generics, Anonymous Methods, Records con properties.... Datasnap libre de COM.

Un ejemplo clásico es el de las variables globales de configuración regional (como: ShortDateTime, DecimalSeparator....) que pasaron a convertirse en un objeto que debe instanciarse en cada programa (ya no son variables o registros globales)

También, recuerdo que después de XE3 vinieron cambios que pusieron problemas a algunas migraciones... Funciones que desaparecieron o se reorganziaron en otras librerías, llegaron los Helpers, por ejemplo

Has un doble check a los otros warnings, amigo Josep... por si acaso

jafera 30-09-2014 16:12:47

Cita:

Empezado por engranaje (Mensaje 482350)
Si no me equivoco lo que te está recomendando es que hagas

Código Delphi [-] if CharInSet (UpCase(Key), ['N','S']) then

No le gusta, dice que CharInSet no se puede usar con estos argumentos, he probado a ponerlo todo entre parentesis y tampoco.

Gracias

Josep

gatosoft 30-09-2014 17:03:32

http://docwiki.embarcadero.com/Libra...tils.CharInSet

Revisa hacer un Type Cast con AnsiChar

Código Delphi [-]
if CharInSet (AnsiChar(UpCase(Key)), ['N','S']) then

No tengo delphi ahora para poderte confirmar, pero revisa tambien la opcion de AnsiUpperCase en lugar de UpCase

Código Delphi [-]
if CharInSet (AnsiUpperCase (Key), ['N','S']) then

El tema es que todas las funciones que recibian parametros String o Char cambiaron para WideString, AnisChar, AnsiString...

saludo,

jafera 30-09-2014 17:49:13

Cita:

Empezado por gatosoft (Mensaje 482362)
http://docwiki.embarcadero.com/Libra...tils.CharInSet

Revisa hacer un Type Cast con AnsiChar

Código Delphi [-]if CharInSet (AnsiChar(UpCase(Key)), ['N','S']) then

Muchas gracias.

Esta opcion es la que ha funcionado perfectamente, ya no da el "warning" al compilar

Saludos

Josep

jafera 30-09-2014 18:04:53

Y este otro warning

Código Delphi [-]
[dcc32 Warning] Arbitres.pas(942): W1057 Implicit string cast from 'AnsiString' to 'string'

Es algo parecido?

Saludos

Josep

gatosoft 30-09-2014 22:04:41

Es solo un warning para que analices y optimices tu código, en el cual te indica que en esa linea de código el compilador hace un tratamiento de AnsiString a una cadena que defines como string (o viceversa).

Al igual que el warning que da origen a este hilo.. que te sugiere que consideres modificar tu código para que no hayan problemas de compatibilidad en ciertos casos.

En lo personal, siempre intento atender los warnings, pero no son obligatorios


La franja horaria es GMT +2. Ahora son las 11:01:22.

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