Delphi в мире Юникода
f65d50f6

Символьные множества


Наверное, самой распространенной идиомой, которая может создать проблемы компилятору, является использование символов в множествах. Раньше, когда символ занимал один байт, хранение символов в множествах не создавало никаких трудностей. Но теперь Char объявлен как WideChar, и поэтому больше не может храниться в множестве. Поэтому, если у Вас есть код наподобие этого: procedure TDemoForm.Button1Click(Sender: TObject); var   C: Char; begin   C := Edit1.Text[1];   if C in ['a'..'z', 'A'..'Z'] then   begin    Label1.Caption := 'It is there'; end; end;

и Вы скомпилируете его, то получите предупреждение, которое будет выглядеть примерно так: [DCC Warning] Unit1.pas(40): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.

Если хотите, можете оставить код неименным - компилятор будет "знать", что Вы пытаетесь сделать и сгенерирует правильный код. Однако, если Вы хотите избавиться от этого предупреждения, то можете использовать новую функцию CharInSet:   if CharInSet(C, ['a'..'z', 'A'..'Z']) then   begin    Label1.Caption := 'It is there';   end;

Функция CharInSet вернет булевское значение и код скомпилируется без предупреждений компилятора.



Содержание раздела