Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.06;
Скачать: CL | DM;

Вниз

Символ WideChar и сет в D2009   Найти похожие ветки 

 
Кто б сомневался ©   (2009-07-04 22:31) [0]

Есть простой код для D2009:

IllegalChars = ["\","/", "?", "*", "<", ">", ":", """, "|"];
var
 Newchr: char;
begin
 Result := Str;
 NewChr := "п" ; // русская буква п в юникоде (т.е. D 2009)
 if AnsiChar(NewChr) in IllegalChars then
     xxx            



Хочу заметить что сеты в D2009 всегда должны содержать ansi символы, иначе проект не скомпилируется.
В данном случае сравнение будет положительным, т.к. один старший байт урезается, при переводе WideChar в AnsiChar - получаем число однобайтное, которое в ANSI таблице обозначает вопросительный знак - ?.

А теперь если оставить все тоже самое, но убрать AnsiChar:

NewChr := "п" ; // русская буква п в юникоде (т.е. D 2009)
if NewChr in IllegalChars then
     xxx

Появится предупреждение - W1050 WideChar reduced to byte char in set expressions.  Consider using "CharInSet" function in "SysUtils" unit.

Но перехода не будет. Каким образом здесь идет сравнение? Во что превращается NewChar? Если бы он превращался в однобайтовый символ, то это был бы предыдущий вариант, и был бы переход. Возможно символы из сета  становятся двухбайтными (добавляется нулевой старший байт)? кто может подсказать? Я что то недопонял..


 
Кто б сомневался ©   (2009-07-04 22:37) [1]

Извиняюсь, просьба удалить топик. Протупил однако.. :)


 
DVM ©   (2009-07-04 22:45) [2]

Я заменил во всех проектах подобного рода SET-ы просто строкой, а IN заменил на Pos() имхо самый простой вариант.


 
Anatoly Podgoretsky ©   (2009-07-04 22:48) [3]

> Кто б сомневался  (04.07.2009 22:31:00)  [0]

Одно слово CPU


 
Anatoly Podgoretsky ©   (2009-07-04 22:53) [4]

> DVM  (04.07.2009 22:45:02)  [2]

Кроме записи, алфавит приходится вспоминать


 
Кто б сомневался ©   (2009-07-04 23:26) [5]


> Я заменил во всех проектах подобного рода SET-ы просто строкой,
>  а IN заменил на Pos() имхо самый простой вариант.


Это при условии что в сетах нужны юникод символы. а так пойдет и обычный вариант, if WideChar in IllegalChars.
Вариант с pos - ну по сравнению с сетом - это реальный тормоз, тем более с его встроенным try finally


 
Псалтырь ©   (2009-07-05 11:00) [6]

CharInSet надо юзать


 
Кто б сомневался ©   (2009-07-06 16:18) [7]


> CharInSet надо юзать


Можно и не юзать. if WideChar in IllegalChars. - Код комилируется корректно, сравнение выполняется также правильно.
Компилятор советует это для того чтобы разработчик заметил это изменение (вдруг он со старых версий Delphi). Т.к. молчать комплитору нельзя в данном случае. Я просто на этом участке отключил сообщения.



Страницы: 1 вся ветка

Текущий архив: 2009.09.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
6-1205471134
snake-as
2008-03-14 08:05
2009.09.06
Отправка письма через прокси


15-1247224234
Cyrax
2009-07-10 15:10
2009.09.06
Как называется передача по радио про здоровье и питание...


15-1246528418
DelphiN!
2009-07-02 13:53
2009.09.06
Определить замыкание 2х ножек com порта


15-1247134811
Василий Жогарев
2009-07-09 14:20
2009.09.06
Забавный сабж... )


1-1214057054
Jolik
2008-06-21 18:04
2009.09.06
Как добавить такую функциональность в ListView ...