Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2012, 01:00   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию W1050 WideChar reduced to byte char in set expressions.

Доброго времени суток!

Delphi негодует
Цитата:
W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.
...по поводу кода:
Код:
procedure TRuleEditForm.AffinityEditKeyPress(Sender: TObject; var Key: Char);
begin
  if not(Key in ['0' .. '9', ',',Chr(8)]) then
    Key := #0;
end;
Синим выделил причину негодования.

Данный код призывает использовать только символы от 0 до 9, знак запятой, и посимвольное удаление backspace(он же chr(8)).

Вопрос:
Как именно применить CharInSet функцию
Код:
type
{ Standard Character set type }
  TSysCharSet = set of AnsiChar;
...
function CharInSet(C: WideChar; const CharSet: TSysCharSet): Boolean;
begin
  Result := C in CharSet;
end;
...и какой диапазон указать во втором её параметре?

Спасибо за внимание!
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2012, 09:49   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
причину негодования
причина гораздо проще: елементами множества не могут буть значения, которые не вписываются в байт по диапазону. Т.е. скомпилировать такое не получится:

Код:
if (i in [256]) then ...
соответсвенно и WideChar урезается до AnsiChar, о чем компилятор и предупреждает.

Цитата:
какой диапазон указать во втором её параметре?
ну это очевидно:

Код:
if (not CharInSet(Key, ['0' .. '9', ',',Chr(8)])) then ...
менее очевидно, что такой финт ушами просто успокаивает компилятор, но никак не решает исходную проблему: множество не может содержать элементы, не вписывающиеся в байт. Т.е. если у нас в Key будут юникодные символы, которые не отображаются на ANSI множество, никакой CharInSet() не поможет. Только case.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.06.2012, 10:51   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Спасибо, проблему понял.
эмм Chr(8) это код клавиши backspace, она имеет юникодность?
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2012, 12:02   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

да, код 0008, BACKSPACE
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.06.2012, 12:16   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А как быть, если CharInSet даст False?
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2012, 12:29   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А #8 вместо chr(8) не катит в обоих случаях?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.06.2012, 12:39   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Думаю разницы не будет.
Chr и вернет мне #8. Так сделано для удобства, компилятор заменит вызов #8 на Chr(8) т.к. он не знает, откуда взять символ #8.
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2012, 13:30   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

да, кстати, проблема не с той стороны, что я думал

пока символьные константы вписываются в ANSI, из них без проблем строится множество.

а если не вписываются, то компилятор выдает другое предупреждение:

Код:
W1061 Narrowing given WideChar constant (#$xxxx) to AnsiChar lost information
в исходном коде проще привести Key к AnsiChar:

Код:
if not(AnsiChar(Key) in ['0' .. '9', ',',Chr(8)]) then
чем переписывать под CharInSet(), смысла в которой вобще наблюдается.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.06.2012, 20:57   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Благодарю, за решение.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
widechar VS. ansichar virtuhay266 Общие вопросы Delphi 2 14.12.2011 09:10
Проблема с программой. Нельзя преобразовать тип set of char к char Lasso Помощь студентам 5 07.06.2011 12:03
unsigned char в array<Byte> Artemprodigy Visual C++ 0 23.03.2011 11:19
Помогите решить проблему с WideChar Inqizitor Общие вопросы Delphi 12 06.08.2009 14:01
W1050 WideChar reduced to byte char in set expressions. Что делать? SkAndrew Общие вопросы Delphi 3 01.11.2008 07:51