Lazarus и onKeyPress

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

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

Re: Lazarus и onKeyPress

Сообщение swa1 » 25.01.2010 21:16:36

eevee писал(а):Данный код не работает совсем.

:shock:
Совсем, совсем?!!!
В чем же он не работает?!!! Что не так?


попробуйте вместо VK_A..VK_Z поставить 65..90
и "заюзать" LCLProc
Аватара пользователя
swa1
новенький
 
Сообщения: 80
Зарегистрирован: 25.09.2007 11:04:08
Откуда: Ялта

Re: Lazarus и onKeyPress

Сообщение eevee » 26.01.2010 10:17:34

Так еще веселее :D

По поводу LCLProc понятно - для UTF8Delete и UTF8Insert.
Теперь работает код, НО! Если вводить буквы медленно )))) То есть нажатие кнопки - пауза секунду, нажатие еще кнопки. Тогда да - замена происходит. Если вводить быстро, то проскакивают еще и оригинальные буквы ))))))

Вот примерный результат выполнения:
Код: Выделить всё
sadФsdФФФФФdsФsdФsdФsdФФsФФdФФФФФФФФФФФФФФФФФФaФФaФФasФФsФФsФФsФФsФФsФФФФФФ
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: Lazarus и onKeyPress

Сообщение wavebvg » 26.01.2010 11:28:26

Может быть это и прописная истина, но...
До меня наконец-то же дошло, что не так в TUTF8Char: там нулевой байт, заполнен кодом нажатой клавиши, а не размером string[7], т.е. там не 7, а хрень какая-то...
В смысле, это не нормально как-то
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Lazarus и onKeyPress

Сообщение eevee » 26.01.2010 12:59:14

Решил проблему, но не совсем... Помогите пожалуйста, голова не варит что то... :D
Код: Выделить всё
procedure TMainForm.MemoUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
var
  pos: TPoint;
  key_press: integer;
  str: string;
begin
  pos.X:=Memo.CaretPos.X;
  pos.Y:=Memo.CaretPos.Y;
  key_press := ord(Utf8ToAnsi(UTF8Key)[1]);

  if (key_press in [163,179,192..255]) then
  begin
    UTF8Key := '';
  end;

  if UTF8Key = '' then
  begin
    str := Memo.Lines[pos.Y];
    Insert(AnsiToUtf8(chr(key_press)),str,pos.X);
    Memo.Lines[pos.Y] := str;
    pos.X := pos.X + 1;
    Memo.CaretPos := pos;
  end;
end;                     

По идее курсор должен встать после вставляемого символа, но что то не так... Вставляется как угодно, только не так, как надо
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: Lazarus и onKeyPress

Сообщение Brainenjii » 26.01.2010 18:54:16

Код: Выделить всё
Procedure TForm1.Memo1UTF8KeyPress(Sender: TObject; Var UTF8Key: TUTF8Char);
Begin
  UTF8Key := #0;
  Memo1.Text := Memo1.Text + 'ф';
end;

Не совсем понял что было нужно... Но в линуксе сработало ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Lazarus и onKeyPress

Сообщение eevee » 27.01.2010 13:38:31

Brainenjii, надо было заменять символ при вводе на какой нибудь другой. Твой вариант добавляет только в конец, а я могу и в середину текста вставить символ :)

Проблему я решил, универсальность правда не делал, не нужно мне пока это :)

Была задача: Все вводимые символы должны быть заглавными независимо от того, нажата кнопка Shift, Caps Lock и тд и тп. Также при вводе русских букв ( ёЁ , ъЪ ), заменять их на ( Е , Ь ). Ограничение на длину строки должно быть 69 символов.

Вот мое решение, может кому поможет :)
Да, там есть переменная telegraf, которая принимает значения true и false по нажатию кнопки, т.е. если telegraf = true, то вводим символы согласно условия, если false - то как есть.
Код: Выделить всё
procedure TMainForm.MemoUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
var
  pos: TPoint;
  key_press: integer;
  key_res: TUTF8Char;
  str: string;
begin
  pos.X:=Memo.CaretPos.X;
  pos.Y:=Memo.CaretPos.Y;
  if pos.X < 68 then
  begin
    if telegraf then
    begin
      key_press := ord(Utf8ToAnsi(UTF8Key)[1]);
      if (key_press in [97..122]) then
      begin
        UTF8Key[1] := chr(key_press-32);
      end
      else
      begin
        case key_press of
          163: begin
                 key_res := 'Е';
                 UTF8Key := '';
               end;
          179: begin
                 key_res := 'Е';
                 UTF8Key := '';
               end;
          192: begin
                 key_res := 'Ю';
                 UTF8Key := '';
               end;
          193: begin
                 key_res := 'А';
                 UTF8Key := '';
               end;
          194: begin
                 key_res := 'Б';
                 UTF8Key := '';
               end;
          195: begin
                 key_res := 'Ц';
                 UTF8Key := '';
               end;
          196: begin
                 key_res := 'Д';
                 UTF8Key := '';
               end;
          197: begin
                 key_res := 'Е';
                 UTF8Key := '';
               end;
          198: begin
                 key_res := 'Ф';
                 UTF8Key := '';
               end;
          199: begin
                 key_res := 'Г';
                 UTF8Key := '';
               end;
          200: begin
                 key_res := 'Х';
                 UTF8Key := '';
               end;
          201: begin
                 key_res := 'И';
                 UTF8Key := '';
               end;
          202: begin
                 key_res := 'Й';
                 UTF8Key := '';
               end;
          203: begin
                 key_res := 'К';
                 UTF8Key := '';
               end;
          204: begin
                 key_res := 'Л';
                 UTF8Key := '';
               end;
          205: begin
                 key_res := 'М';
                 UTF8Key := '';
               end;
          206: begin
                 key_res := 'Н';
                 UTF8Key := '';
               end;
          207: begin
                 key_res := 'О';
                 UTF8Key := '';
               end;
          208: begin
                 key_res := 'П';
                 UTF8Key := '';
               end;
          209: begin
                 key_res := 'Я';
                 UTF8Key := '';
               end;
          210: begin
                 key_res := 'Р';
                 UTF8Key := '';
               end;
          211: begin
                 key_res := 'С';
                 UTF8Key := '';
               end;
          212: begin
                 key_res := 'Т';
                 UTF8Key := '';
               end;
          213: begin
                 key_res := 'У';
                 UTF8Key := '';
               end;
          214: begin
                 key_res := 'Ж';
                 UTF8Key := '';
               end;
          215: begin
                 key_res := 'В';
                 UTF8Key := '';
               end;
          216: begin
                 key_res := 'Ь';
                 UTF8Key := '';
               end;
          217: begin
                 key_res := 'Ы';
                 UTF8Key := '';
               end;
          218: begin
                 key_res := 'З';
                 UTF8Key := '';
               end;
          219: begin
                 key_res := 'Ш';
                 UTF8Key := '';
               end;
          220: begin
                 key_res := 'Э';
                 UTF8Key := '';
               end;
          221: begin
                 key_res := 'Щ';
                 UTF8Key := '';
               end;
          222: begin
                 key_res := 'Ч';
                 UTF8Key := '';
               end;
          223: begin
                 key_res := 'Ь';
                 UTF8Key := '';
               end;
          255: begin
                 key_res := 'Ь';
                 UTF8Key := '';
               end;
        end;
      end;
    end;
    if UTF8Key = '' then
    begin
      str := Memo.Lines[pos.Y];
      UTF8Insert(key_res,str,pos.X+1);
      Memo.Lines[pos.Y] := str;
      pos.X := pos.X + 1;
      Memo.CaretPos := pos;
    end;
  end
  else
  begin
    if (ord(Utf8ToAnsi(UTF8Key)[1]) <> 13) and (ord(Utf8ToAnsi(UTF8Key)[1]) <> 8) then
      UTF8Key := '';
  end;
end;


P.S. OS Gentoo Linux; locale KOI8-R
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: Lazarus и onKeyPress

Сообщение swa1 » 27.01.2010 21:54:45

eevee писал(а):Тогда да - замена происходит. Если вводить быстро, то проскакивают еще и оригинальные буквы ))))))

Ну тут все проще. Я же писал про очередность событий. Так вот , если клавишу нажать и удерживать или одновременно нажать вторую клавишу не отпустив первую (т.е. KeyUp еще не отработало, а опять вывели символ) , то так и будет. Для этого в события KeyPress и KeyDown нужно добавить обработку.
О... что то похоже на РТА
Аватара пользователя
swa1
новенький
 
Сообщения: 80
Зарегистрирован: 25.09.2007 11:04:08
Откуда: Ялта

Re: Lazarus и onKeyPress

Сообщение Padre_Mortius » 28.01.2010 00:25:09

Может стоило функцией UpperCase или UTF8UpperCase воспользоваться?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Lazarus и onKeyPress

Сообщение eevee » 28.01.2010 10:13:38

Может быть... Пока не пробовал еще :-)
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: Lazarus и onKeyPress

Сообщение kosteek » 09.03.2010 22:59:01

Ребята простите может я не правильно понял, но у меня вот так все работает
Код: Выделить всё
procedure TForm1.Memo1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
begin
  if UTF8Key=SysToUTF8('Ф') then memo1.text:=memo1.text+' '+UTF8ToSys(UTF8Key);
end;

В коде буква "Ф" большая, и процедура обрабатывается именно при нажатии шифта и буквы "ф".
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Lazarus и onKeyPress

Сообщение eevee » 10.03.2010 12:18:25

kosteek, имелось в виду не отслеживание нажатия, а замена нажатой русской буквы на другую русскую. Отследить нажатие можно и по коду клавиши
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: Lazarus и onKeyPress

Сообщение Yurakl » 28.05.2010 09:03:37

а если дело обстоит в линуксе в консольной программе, которая выполняется в цикле.
и мне надо среагировать на нажатую комбинацию клавиш. если она нажата, то произвести действие, если она не нажата, то продолжить цикл программы
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Пред.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 43

Рейтинг@Mail.ru