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

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

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

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

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

Сообщение maksmkv »

Всем привет. Толкового решения не нашел, может быть поделитесь. Суть, при вводе в ячейки 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;   


Что сможете посоветовать? Спасибо
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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

Сообщение maksmkv »

Спасибо, данную инфу взял со стороннего офрума, по поводу '?' в принципе не удивился бы. А вот конструкция

Код: Выделить всё

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"
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

maksmkv
А что там у нас на строке 174?
maksmkv
новенький
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Сообщение maksmkv »

if not (UTF8Key in ['а'..'я', 'a'..'z', #32, #8]) then конкретно курсор останавливает на ['а
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

maksmkv
Ага, я вот тоже только сейчас заметил. :-)
Смотрите, тип TUTF8Char - string, а у Вас там одинарные кавычки стоят, Так что не зря компилятор возмущён до глубины души... ;-)
maksmkv
новенький
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Сообщение maksmkv »

Тогда не очень понятно, что использовать. Если просто массив, тогда UTF8Key in уже не канает (
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Можно создать строку символов. Туда поместить все нужные символы, а потом проверять с помощью функции Pos( UTF8Key, строка)>0.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

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;   
maksmkv
новенький
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Сообщение maksmkv »

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

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

Код: Выделить всё

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: char);
begin
    if DBGrid1.SelectedField.FieldNo=2 then
       begin
             IsKeyInInvalidKeySetRu(Key);
       end;     
 


не работает ((( Все равно вводятся русские буквы (
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

maksmkv, а ничего, что isKeyInInvalidKeySetRu это функция дающая в качестве выхлопа булево значение? А вот откидывать русские буквы тебе надо уже ручками, заменяя их на пустую строку в условном переходе.
maksmkv
новенький
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Сообщение maksmkv »

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

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

Если отдельно переписать для цифр if not (key in['0'..'9',#8']) then key:=#0; , то работает
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

maksmkv писал(а):DBGrid1KeyPress

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

Сообщение Лекс Айрин »

maksmkv, символ 0 это конец строковой константы. Попробуй ''(две одиночные кавычки) ну или nil, но тут сомневаюсь.
maksmkv
новенький
Сообщения: 22
Зарегистрирован: 29.08.2013 23:58:50

Сообщение maksmkv »

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

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

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

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


Уже переделал на DBGrid1UTF8KeyPress - все равно не работает. В интернете про это вообще инфы никакой- такое ощущение, что на Lazarus БД никто не делает и проверкой не заморачивается )))
Ответить