На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Запрет на ввод символов кроме цифр , Некорректно работает
    Добрый день.
    Установлен Delphi XE5
    Для запрета ввода символов кроме цифр использую код:
    ExpandedWrap disabled
      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.

    Поправил код так:
    ExpandedWrap disabled
       if not(AnsiChar(Key) in ['0' .. '9', Chr(8)]) then Key:=#0;

    Ошибка пропала, проект собрался. Проверил все буквы в английской раскладке - запрет срабатывает. Переключился на русскую раскладку, а вот тут почему-то печатаются эти символы
    Цитата
    йегзваджиб

    Что сделал не так и где ошибка ? :)
      ExpandedWrap disabled
        if not(WideChar(Key) in ['0' .. '9', Chr(8)]) then Key:=#0;


      Добавлено
      Ты хочешь привести 16 битное число к 8 битному, отсюда переполнение диапазона и сравнение идет с этим переполнением.
        Попробовал:
        ExpandedWrap disabled
          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.
          ExpandedWrap disabled
            if not ((Key < #$0100) and (AnsiChar(Key) in['0'..'9', #8])) then
                 Key:=#0;
            Используй код:
            ExpandedWrap disabled
              if not CharInSet(key, [#8, '0'..'9']) then key:=#0;


            В Delphi XE тип Char теперь 2-х байтовый.
            А AnsiChar - один байт.
            AnsiChar(Key) - делает не то что вы подумали. Она просто усекает.
            К примеру
            user posted image
            хостинг картинок для форумов
            Сообщение отредактировано: Pavia -
              Цитата Pavia @

              ExpandedWrap disabled
                  if not CharInSet(key, [#8, '0'..'9']) then key:=#0;

              Нашел цитаты с соседнего форума:
              Цитата

              менее очевидно, что такой финт ушами просто успокаивает компилятор, но никак не решает исходную проблему: множество не может содержать элементы, не вписывающиеся в байт. Т.е. если у нас в Key будут юникодные символы, которые не отображаются на ANSI множество, никакой CharInSet() не поможет. Только case.


              Попробовал тогда вот так:
              ExpandedWrap disabled
                case Key of
                    '0'..'9': ;
                    #8 : ;
                    else Key :=Chr(0);
                  end;

              Работает нормально.
              Сообщение отредактировано: Myrus -
                CharInSet - использует embarcadero для своего парсера.
                Сообщение отредактировано: Pavia -
                  Цитата Pavia @
                  if not CharInSet(key, [#8, '0'..'9']) then key:=#0;


                  Понял, спасибо. Буду тогда использовать данный код :-)
                    Цитата Myrus @
                    Для запрета ввода символов кроме цифр
                    У TEdit есть свойство NumericOnly (ЕМНИП).
                      Цитата
                      У TEdit есть свойство NumericOnly (ЕМНИП).

                      Про это решение знаю, но оно мне не подходит ввиду того что необходимо вводить не только целые числа, т.е. надо ставить '.' или ','
                      Сообщение отредактировано: Myrus -
                        Цитата Myrus @
                        Вылетает снова ошибка:

                        В 10 берлине работает.
                          Цитата
                          В 10 берлине работает.


                          В 10-м работает, в XE уже нет :-(
                            CharInSet у Эмбры действительно корявый, правильный вариант приведен в #4
                            Поправка: CharInSet работает как надо, юзаем его, как и рекомендует компилятор.
                            Сообщение отредактировано: Fr0sT -
                              Цитата
                              CharInSet у Эмбры действительно корявый, правильный вариант приведен в #4


                              Пробовал оба варианта:
                              1.
                              ExpandedWrap disabled
                                if not ((Key < #$0100) and (AnsiChar(Key) in['0'..'9', #8])) then Key:=#0;

                              2.
                              ExpandedWrap disabled
                                 if not CharInSet(key, [#8, '0'..'9']) then key:=#0;

                              Оба варианта рабочие, ради интереса переклацал всю клавиатуру на обоих примерах. Все блокируется нормально.
                                Myrus, возможно, в более поздних версиях исправили, как минимум вплоть до ХЕ2 там тупое урезание до ansi
                                Поправка: не все так просто
                                Сообщение отредактировано: Fr0sT -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0663 ]   [ 17 queries used ]   [ Generated: 25.04.24, 10:34 GMT ]