Delphi Unicode – entendo os avisos (warning) do compilar sua aplicação

A partir do Delphi 2009 foi implementado o suporte a Unicode em todo o Delphi, caso você não esteja familiarizado com Unicode leia este post. Ao compilar sua aplicação alguns avisos (warning) serão emitidos pelo compilador, neste post vou esclarecer estas mensagens e o que você deve fazer para que elas não apareçam mais.

O código abaixo até versões do Delphi 2007, compilado em versões igual ou superiores ao Delphi 2009, receberá esta mensagem ao compilar:

W1050 WideChar reduced to byte char in set expressions. Consider using ‘CharInSet’ function in ‘SysUtils’ unit

var
  Status : Char;
begin

  if Status in [ 'a', 's', 'c']  then
  begin
    ...
  end;

Para evitar este warning, você deverá passar a usar a função CharInSet.

var
  Status : Char;
begin

  if CharInSet(Status, ['a', 's', 'c']) then
  begin
    ...
  end;

O código abaixo irá gerar a mensagem W1057 Implicit string cast from ‘ShortString’ to ‘string’

var
  s : ShortString;
  u : string;
begin
  u := s;
end;

Para eliminar este mensagem basta fazer um cast da varíavel ShortString para String, este código será compatível com versões anteriores ao Delphi 2009.

var
  s : ShortString;
  u : string;
begin
  u := String(s);
end;

A mesma situação se aplica para variáveis AnsiString gerando a mensagem W1057 Implicit string cast from ‘AnsiString’ to ‘string’

var
  a : AnsitString;
  u : string;
begin
  u := s;
end;

Basta fazer um cast da variável AnsiString para String e a mensagem será eliminada.

var
  a : AnsitString;
  u : string;
begin
  u := AnsiString(s);
end;

A mensagem W1058 Implicit string cast with potential data loss from ‘string’ to ‘AnsiString’ precisa ser analizada com cuidado, podemos fazer o cast e resolver o problema, mas você precisa saber o que está fazendo.

var
  a : AnsitString;
  u : string;
begin
  u := s;
end;

Se você tem certeza que a variável a contém apenas caracteres Ansi, poderá fazer o cast sem problemas.

var
  a : AnsitString;
  u : string;
begin
  u := AnsiString(s);
end;

Até aqui vimos as mensagens geradas pelo compilador, Unicode vai muito mais além e se você quiser exportar sua aplicação para países asiáticos por exemplo, terá que suportar Unicode, existem 3 artifos no EDN que eu recomendo a leitura, são eles:

2 respostas
  1. Adilson Rumão
    Adilson Rumão says:

    Bom dia Andreano, desculpa estar pedindo sua ajuda aqui, mas estou com um problema que pode ser simples, mas não estou conseguindo resolver.
    tenho o seguinte trecho de código dando erro.
    [code]
    modoEdicao:= frmPrincipal.QryLogin.FieldByName(‘ESTADOS_I’).AsAnsiString +
    modoEdicao:= frmPrincipal.QryLogin.FieldByName(‘ESTADOS_A’).AsAnsiString +
    modoEdicao:= frmPrincipal.QryLogin.FieldByName(‘ESTADOS_E’).AsAnsiString;
    Executar:= exibeBotoes;
    [/code]
    Tenho uma TExecutar = (exibeBotoes);
    Uma Variável Global: modoEdicao: String;
    e na sequência o trecho de código:
    [code]
    procedure TfrmCadModelo.SetExecutar(const Value: TExecutar);
    begin
    FExecutar := Value;
    case value of
    {Exibe os botões de acordo com o Perfil do Usuário}
    exibeBotoes:
    begin
    if modoEdicao = ‘FFF’ then
    begin
    btnIncluir.Visible := False;
    btnAlterar.Visible := False;
    btnExcluir.Visible := False;
    btnMarcar.Visible := False;
    btnSalvar.Visible := False;
    btnCancelar.Visible:= False;
    Separador2.Visible := False;
    Separador3.Visible := False;
    end; // OBS o código não para aqui, ele continua, mas para economizar espaço coloquei só o começo.
    [/code]
    Pesquisando no Google, cheguei aqui e vi que é sobre a conversão de String para AsAnsiString. Só que não consegui fazer isso. Teria como você me dar uma ajuda?
    Desde já onrigado pela antenção.

    Responder

Trackbacks & Pingbacks

  1. […] This post was mentioned on Twitter by Andreano Lanusse, Adriano Santos. Adriano Santos said: RT @andreanolanusse: Blog post: Delphi Unicode – entendo os avisos (warning) do compilar sua aplicação http://bit.ly/65EC4M #delphi […]

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.