sexta-feira, 2 de outubro de 2020

Utilização da função CharInSet

 

As vezes nos deparamos com hints e warnings que o Delphi retorna para corrigirmos alguma coisa no fonte que possa causar problema.

E hoje vamos conversar sobre o seguinte warning:

 “WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.”

 

Que se originou deste código, que é responsável por impedir que seja digitado qualquer coisa diferente dos números 0 a 9, tecla backspace “chr(8)” ou espaço “chr(32)”.

 

if not(Key in ['0' .. '9', chr(8), chr(32) ]) then
  Key := #0;

Vamos entender o warning: Ele está nos dizendo que a expressão está convertendo WideChar em Byte char, e sugere que consideremos utilizar a função “CharInSet” que está na unit “SysUtils” para isto.

 

A Função “chr” retorna o caractere em ASCII, nesse link tem todos os caracteres ASCII caso queira entender melhor. https://pt.wikipedia.org/wiki/ASCII.

 

O “chr” também pode ser substituído por #.

 

Agora vamos ao "dito cujo" CharInSet.

 

A função CharInSet foi criada para que o tratamento dos caracteres de uma coleção fosse feito corretamente. E para utilizá-la devemos chamar a função e passar como parâmetro a variável que contém a tecla digitada, em seguida os caracteres que serão analisados. E a nossa rotina ficará assim.

 

if not (CharInSet(key,['0'..'9', #8, #32 ])) then
  Key := #0;

 

Veja que no lugar de Chr alteramos para #, que trará o mesmo resultado.

 

Dessa forma o warning desaparece e nosso código fica coerente.

 

Até a próxima.