Проверка ввода на Кириллицу в DBGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проверка ввода на Кириллицу в DBGrid

Сообщение maksmkv » 05.02.2019 17:30:44

Всем привет. Толкового решения не нашел, может быть поделитесь. Суть, при вводе в ячейки DBGrid, должны отбрасываться символы Кириллицы.

Напрямую Lazarus не работает с русскими символами

Код: Выделить всё
  if not (Key in ['а'..'я', 'a'..'z', #32, #8]) then
    Key := #0

Выдает ошибку, попробовал еще одно решение, но в ячейки вообще ничего не ввести (((

Код: Выделить всё
  if (DBGrid1.SelectedField.FieldNo=2) then
   if not (key in [AnsiChar(224)..AnsiChar(255){Ascii 'а'..'я'},AnsiChar(192)..AnsiChar(223){Ascii 'А'..'Я'},AnsiChar(184){Ascii ё},AnsiChar(168){Ascii Ё}]) then
    begin
      key := #0;
    end;   


Что сможете посоветовать? Спасибо
maksmkv
новенький
 
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение Vadim » 05.02.2019 17:56:10

maksmkv писал(а):AnsiChar(224)

А с чего Вы решили, что это код русских букв? Уже сотни раз говорено, что в Lazarus используется кодировка UTF-8 и до сих пор находятся те, для кого это неожиданное открытие... ;-)
У Вас единственная, но принципиальная ошибка. Волшебный шар по имени "Дельфийский Оракул" говорит мне, что Вы используете событие OnKeyPress, которое годиться только для английского алфавита. Для всех других языков нужно применять OnUTF8KeyPress, где Вы совершенно спокойно можете применять первый вариант, естественно применяя правильный параметр этого события.
На всякий случай на будущее. Если как-нибудь обнаружите в DbGrid знаки вопроса вместо русских букв - не впадайте в панику. Просто Вы забыли про кодировку... ;-)
Удачи.
Vadim
долгожитель
 
Сообщения: 3586
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение maksmkv » 05.02.2019 18:06:49

Спасибо, данную инфу взял со стороннего офрума, по поводу '?' в принципе не удивился бы. А вот конструкция
Код: Выделить всё
procedure TForm1.DBGrid1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
begin
  if (DBGrid1.SelectedField.FieldNo=2) then
  if not (UTF8Key in ['а'..'я', 'a'..'z', #32, #8]) then
    UTF8Key := #0
end;   


Выдает туже самую ошибку: "unit1.pas(174,23) Error: Ordinal expression expected"
maksmkv
новенький
 
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение Vadim » 05.02.2019 19:27:02

maksmkv
А что там у нас на строке 174?
Vadim
долгожитель
 
Сообщения: 3586
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение maksmkv » 05.02.2019 19:32:17

if not (UTF8Key in ['а'..'я', 'a'..'z', #32, #8]) then конкретно курсор останавливает на ['а
maksmkv
новенький
 
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение Vadim » 05.02.2019 19:55:45

maksmkv
Ага, я вот тоже только сейчас заметил. :-)
Смотрите, тип TUTF8Char - string, а у Вас там одинарные кавычки стоят, Так что не зря компилятор возмущён до глубины души... ;-)
Vadim
долгожитель
 
Сообщения: 3586
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение maksmkv » 05.02.2019 19:58:40

Тогда не очень понятно, что использовать. Если просто массив, тогда UTF8Key in уже не канает (
maksmkv
новенький
 
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение Vadim » 05.02.2019 20:21:10

Можно создать строку символов. Туда поместить все нужные символы, а потом проверять с помощью функции Pos( UTF8Key, строка)>0.
Vadim
долгожитель
 
Сообщения: 3586
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение vada » 06.02.2019 17:57:26

UTF8Key in ['а'..'я', 'a'..'z', #32, #8] не проканает. В множесте SET байты, а UTF8 двубайтовый.
У меня реализован массивчик. В нем и ищу UTF8Key
Код: Выделить всё
InvalidUTF8KeyRu:  array[1..66] of TUTF8Char =
('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'щ', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я',
'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я');


Добавлено спустя 5 минут 54 секунды:
Забыл. Функция еще вот такая. Может не очень оптимально, но работает лет 5-6
Код: Выделить всё
function IsKeyInInvalidKeySetRu(const Key: Char): Boolean;
var
  I: Integer;
  S: UTF8String;
  C: Char;
begin
  Result := false;
  for I:=Low(InvalidUTF8KeyRu) to High(InvalidUTF8KeyRu) do
  begin
    S := InvalidUTF8KeyRu[I];
    C := S[1];
    if (C = Key)
    then begin
      Result := true;
      Break;
    End;
  end;
End;   
Аватара пользователя
vada
энтузиаст
 
Сообщения: 675
Зарегистрирован: 14.02.2006 13:43:17

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение maksmkv » 06.02.2019 18:32:52

Спасибо, что я не так делаю?

Добавил в глобальные переменные массив. Добавил в события на DBGrid

Код: Выделить всё
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: char);
begin
    if DBGrid1.SelectedField.FieldNo=2 then
       begin
             IsKeyInInvalidKeySetRu(Key);
       end;     


не работает ((( Все равно вводятся русские буквы (
maksmkv
новенький
 
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение Лекс Айрин » 06.02.2019 19:16:00

maksmkv, а ничего, что isKeyInInvalidKeySetRu это функция дающая в качестве выхлопа булево значение? А вот откидывать русские буквы тебе надо уже ручками, заменяя их на пустую строку в условном переходе.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5610
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение maksmkv » 06.02.2019 19:31:41

Вроде все верное - делаю на подобии Delphi, но такая конструкция тоже не работает.

if DBGrid1.SelectedField.FieldNo=2 then
If IsKeyInInvalidKeySetRu(Key) = true then Key:=#0;

Если отдельно переписать для цифр if not (key in['0'..'9',#8']) then key:=#0; , то работает
maksmkv
новенький
 
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение Vadim » 06.02.2019 19:42:41

maksmkv писал(а):DBGrid1KeyPress

Вроде бы с Вами мы про эту фигню уже говорили, нет?
Vadim
долгожитель
 
Сообщения: 3586
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение Лекс Айрин » 06.02.2019 19:56:54

maksmkv, символ 0 это конец строковой константы. Попробуй ''(две одиночные кавычки) ну или nil, но тут сомневаюсь.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5610
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проверка ввода на Кириллицу в DBGrid

Сообщение maksmkv » 06.02.2019 20:03:45

Лекс Айрин писал(а):maksmkv, символ 0 это конец строковой константы. Попробуй ''(две одиночные кавычки) ну или nil, но тут сомневаюсь.

Нет не работает (

Добавлено спустя 55 секунд:
Vadim писал(а):
maksmkv писал(а):DBGrid1KeyPress

Вроде бы с Вами мы про эту фигню уже говорили, нет?


Уже переделал на DBGrid1UTF8KeyPress - все равно не работает. В интернете про это вообще инфы никакой- такое ощущение, что на Lazarus БД никто не делает и проверкой не заморачивается )))
maksmkv
новенький
 
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Лекс Айрин и гости: 1

Рейтинг@Mail.ru
cron