Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2017, 08:53   #1
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
Вопрос отследить удерживание клавиши

Приветствую! Кто мне подскажет, как можно в мемо отследить удерживание клавиши? Я в мемо в начало строки вывожу символ ">", который нельзя удалять. Я отслеживаю нажатие кнопок клавиатуры влево, backspace, home, нажатие мыши. Например при нажатии backspace я отслеживаю положение курсора и не даю ему попасть левее символа ">". В общем должно быть разрешено делать все что можно в мемо (вводить символы, удалять, выделять), но только в последней строке, не заходя при этом за первый символ ">".
Но загвоздка в том, что если нажать backspace и удерживать, он всеравно уходит влево, все удаляет и даже переходит на другие строки выше.
Код:
procedure TForm1.sMemoLogKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case Key of
    VK_UP: begin
      Key:=0;
    end;

    VK_DOWN: begin
      Key:=0;
    end;

    VK_HOME: begin
    //если shift+Home, то выделяем
      if Shift=[ssShift] then
      begin
        sMemoLog.SelLength:=-CurPos.X+1;
      end
    //иначе просто в начало
      else
      begin
        CurPos.X:=1;
        sMemoLog.CaretPos:=CurPos;
      end;
      Key:=0;
    end;

    VK_LEFT: begin
      if Shift=[ssShift] then
      begin
        if sMemoLog.SelLength<-CurPos.X+1 then
        begin
          sMemoLog.SelLength:=-CurPos.X+1;
          Key:=0;
        end;
      end
      else if CurPos.X<=1 then Key:=0;
    end;
  end;//case
end;

procedure TForm1.sMemoLogKeyPress(Sender: TObject; var Key: Char);
var
  i,k: integer;
  s,s1: string;
begin
  case Key of
  //если нажали Enter
    Chr(VK_RETURN): begin
      if (sMemoLog.Lines.Count=0) or (sMemoLog.Lines[sMemoLog.Lines.Count-1]<>'>') then
        sMemoLog.Lines.Add('>');
      Key:=#0;
    end;

    Chr(VK_BACK): if CurPos.X<=1 then Key:=#0;
  end;//case
end;
Код не полный, я отслеживаю нажатие и других кнопок, но это не относится к конкретной теме.
fanlis вне форума Ответить с цитированием
Старый 26.01.2017, 16:28   #2
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Функция GetKeyState поможет.

Код:
var
  Form1: TForm1;
  k:TKeyboardState;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
   Label1.Caption:='        0  1  2  3  4  5  6  7  8  9'+#13#10+'0)     ';
   For i:=0 to High(k) do
   begin
      Label1.Caption:=Label1.Caption+IntToStr(GetKeyState(i))+'  ';
      If i mod 10=9 then
      begin
         Label1.Caption:=Label1.Caption+#13#10+IntToStr((i div 10)+1)+')   ';
         If i<90 then
            Label1.Caption:=Label1.Caption+'  ';
      end;
   end;
end;

end.
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 26.01.2017, 17:55   #3
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от fanlis Посмотреть сообщение
Но загвоздка в том, что если нажать backspace и удерживать, он всеравно уходит влево, все удаляет и даже переходит на другие строки выше
Замените ваше изобретение
Код:
Chr(VK_BACK): if CurPos.X<=1 then Key:=#0;
на
Код:
Chr(VK_BACK): if Memo1.CaretPos.X=1 then Key:=Chr(0);
kropotkina-alice вне форума Ответить с цитированием
Старый 01.02.2017, 08:33   #4
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
По умолчанию

newerow1989, не совсем понял что это и как связано с моей проблемой.

kropotkina-alice, все оказалось проще, чем казалось. Спасибо!
fanlis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отследить нажатие клавиши мыши? Урсула Общие вопросы Delphi 1 17.05.2016 20:27
delphi как отследить нажатие клавиши в другом приложении gufon Общие вопросы Delphi 6 29.06.2011 22:46
Отследить нажатие клавиши для отдельного окна Черничный Win Api 12 13.09.2008 20:47
Как отследить отпускание клавиши? Zefick Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 27.05.2008 19:14
как отследить нажатие клавиши Delete D-fens Общие вопросы Delphi 4 07.06.2007 23:58