Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.219.217] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Добрый день.
Установлен Delphi XE5 Для запрета ввода символов кроме цифр использую код: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in['0'..'9', #8]) then key:=#0; end; При компиляции выскакивает: Цитата W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit. Поправил код так: if not(AnsiChar(Key) in ['0' .. '9', Chr(8)]) then Key:=#0; Ошибка пропала, проект собрался. Проверил все буквы в английской раскладке - запрет срабатывает. Переключился на русскую раскладку, а вот тут почему-то печатаются эти символы Цитата йегзваджиб Что сделал не так и где ошибка ? |
Сообщ.
#2
,
|
|
|
if not(WideChar(Key) in ['0' .. '9', Chr(8)]) then Key:=#0; Добавлено Ты хочешь привести 16 битное число к 8 битному, отсюда переполнение диапазона и сравнение идет с этим переполнением. |
Сообщ.
#3
,
|
|
|
Попробовал:
if not(WideChar(Key) in ['0' .. '9', Chr(8)]) then Key:=#0; Вылетает снова ошибка: Цитата W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit. |
Сообщ.
#4
,
|
|
|
if not ((Key < #$0100) and (AnsiChar(Key) in['0'..'9', #8])) then Key:=#0; |
Сообщ.
#5
,
|
|
|
Используй код:
if not CharInSet(key, [#8, '0'..'9']) then key:=#0; В Delphi XE тип Char теперь 2-х байтовый. А AnsiChar - один байт. AnsiChar(Key) - делает не то что вы подумали. Она просто усекает. К примеру хостинг картинок для форумов |
Сообщ.
#6
,
|
|
|
Цитата Pavia @ if not CharInSet(key, [#8, '0'..'9']) then key:=#0; Нашел цитаты с соседнего форума: Цитата менее очевидно, что такой финт ушами просто успокаивает компилятор, но никак не решает исходную проблему: множество не может содержать элементы, не вписывающиеся в байт. Т.е. если у нас в Key будут юникодные символы, которые не отображаются на ANSI множество, никакой CharInSet() не поможет. Только case. Попробовал тогда вот так: case Key of '0'..'9': ; #8 : ; else Key :=Chr(0); end; Работает нормально. |
Сообщ.
#7
,
|
|
|
CharInSet - использует embarcadero для своего парсера.
|
Сообщ.
#8
,
|
|
|
Цитата Pavia @ if not CharInSet(key, [#8, '0'..'9']) then key:=#0; Понял, спасибо. Буду тогда использовать данный код :-) |
Сообщ.
#9
,
|
|
|
Цитата Myrus @ У TEdit есть свойство NumericOnly (ЕМНИП). Для запрета ввода символов кроме цифр |
Сообщ.
#10
,
|
|
|
Цитата У TEdit есть свойство NumericOnly (ЕМНИП). Про это решение знаю, но оно мне не подходит ввиду того что необходимо вводить не только целые числа, т.е. надо ставить '.' или ',' |
Сообщ.
#11
,
|
|
|
Цитата Myrus @ Вылетает снова ошибка: В 10 берлине работает. |
Сообщ.
#12
,
|
|
|
Цитата В 10 берлине работает. В 10-м работает, в XE уже нет :-( |
Сообщ.
#13
,
|
|
|
Поправка: CharInSet работает как надо, юзаем его, как и рекомендует компилятор. |
Сообщ.
#14
,
|
|
|
Цитата CharInSet у Эмбры действительно корявый, правильный вариант приведен в #4 Пробовал оба варианта: 1. if not ((Key < #$0100) and (AnsiChar(Key) in['0'..'9', #8])) then Key:=#0; 2. if not CharInSet(key, [#8, '0'..'9']) then key:=#0; Оба варианта рабочие, ради интереса переклацал всю клавиатуру на обоих примерах. Все блокируется нормально. |
Сообщ.
#15
,
|
|
|
Поправка: не все так просто |