В прошлом месяце я стал счастливым обладателем лицензионной Delphi XE и вместе с ней был вынужден сделать шаг к Юникоду. Конечно переход на Юникод в Delphi продолжается уже несколько лет, но от этого он не стал менее болезненным. С такими вещами, как явное указание типов строк ShortString и AnsiString все более или менее понятно. Эти моменты разжевывались Embarcodero давно и подробно. Основная головная боль была с самодельным компонентом. Когда-то я придумал, что метод компонента будет возвращать значение, через изменяемый параметр функции, типа ShortString. Вот тут то я и попал, оказалось, что подобный параметр возвращает все, что угодно, кроме нужного результата. Выход конечно нашелся, но пришлось переделывать компонент, так что бы он возвращал результат в виде результата функции. Как не странно заработало, но три дня как не бывало.
Второй момент который меня существенно удивил, было отсутствие прямого и корректного преобразования переменной типа Char в переменную типа AnsiChar. Когда любой компонент из VCL возвращает нажатие клавиши, это буква помещается в Char, который по умолчанию (причем которое невозможно изменить) является символом Юникода. Мне же нужен был обычный символ в интервале от 0 до 255. Простое приведение
KeyA:=AnsiChar(Key)
дает совершенно фантастический результат. Я не стал глубоко копать, но похоже символы переводятся в интервал от 0 до 127, что для букв русского алфавита, мягко говоря, неприемлемо. В результате моих экспериментов и изысканий был написан следующий кусок кода, ужасный на вид, но тем не менее работающий.
var
StA : AnsiString ;
KeyA : AnsiChar ;
begin
StA:=Key ; // присваиваем Unicode символ строке AnsiString,
// при этом компилятор добавляет преобразование
// типа строки
KeyA:=StA[1] ; // берем 1-й символ получившейся строки
end ;