powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обработать Shift+Left, Ctrl+Left, Alt+Left
23 сообщений из 23, страница 1 из 1
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32321370
У меня такая идея:
При нажатом Ctrl+Left происходят некие действия, а при Ctrl+Right некие другие действия. При нажатии просто на Left или Right ничего не делается.

Что-то не пойму как поймать событие Ctrl+Left при Form1.KeyPreview = true.
Событие Form1.KeyPress при нажатии на Left или Right не возникает, а Form1.KeyDown при нажатом Ctrl (Shift, Alt) тоже не происходит.
Как же тогда их отловить?
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32321547
Что никто не сталкивался с такой проблемой?
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32321590
Adony
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
if ((key=vk_left) and (ssCtrl in Shift)) then ...
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32321612
Именно так я и сделал.
Проблема в том, что если при нажатом Shift нажимать Left, то событие KeyDown не наступает, а KeyPress предназначено только для печатаемых символов.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32321637
Adony
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот проверил на новом проекте и на KeyDown
if ((key=vk_left) and (ssShift in Shift)) then label1.Visible:=not label1.Visible;
работает.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32321683
Дело в том что фокус находится на кнопке. Если брать форму без кнопок, то все работает.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32321954
Lana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
установи у формы KeyPreview:=true;
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32322458
Про KeyPreview я знаю.
И установил его в true в самом начале:
автор вопроса писал:Что-то не пойму как поймать событие Ctrl+Left при Form1.KeyPreview = true
Специально создал новый проект для экспериментов (показываю текст модуля):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
unit Unit1;

interface

uses
  Windows, Classes, Controls, Forms, Buttons, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if ((key=vk_left) and (ssShift in Shift)) then label1.Visible:=not label1.Visible;
end;

end.

Так вот если у Button1 TabStop стоит true, то ничего не работает.
А если установить его в false, то сначала работает, а после нажатия на кнопку фокус устанавливается на нее и все крендец.
Положил еще TEdit на форму. При фокусе в Edit1 все пашет.
Что-то не пойму как победить данную траблу.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32322489
Delphi 6, если это имеет значение.

to Lana
А тигра на фотке настоящая? :))
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32322682
Nemec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробуй назначить обработку на KeyUp, с KeyDown у меня тоже проблемы были.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32322704
Да, на KeyUp все работает.
Но я хотел в промежутке между KeyDown и KeyUp включать Timer...
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32322872
Nemec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если отлавливать WM_KEYDOWN ?
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32322881
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал сделать тоже самое. На KeyDown не работает, а на KeyUp работает. Думаю стоит попробывать заменить TButton на SpeedButton. С SpeedButton-ом все работает.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32323102
to Nemec
Приведи пожалуйста пример. а то я никогда так не делал.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32323482
Nemec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
объявляешь процедуру:
procedure MyWMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;

...
procedure MyWMKeyDown(var Message: TWMKeyDown);
begin
(твои операторы)
inherited;
(или здесь)
end;

а вообще Delphi\Source\Vcl\ - неистощимый источник информации :)
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32324640
Что-то ругается на директиву message . В uses я прописал Messages, но все равно ругается.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32324669
Song
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объявить надо в классе формы.

-----
Прежде чем сказать "Невозможно", подумай, прав ли ты?!
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32325808
Или я такой тупой или вы мне что-то недоговорили...
Вообще не заходит в процедуру MyWMKeyDown. Написал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure MyWMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
.............
implementation
var fl:boolean;
{$R *.dfm}
procedure TForm1.MyWMKeyDown(var Message: TWMKeyDown);
begin
     if (fl) and (Message.CharCode = vk_left) then
       label1.Visible:=not label1.Visible;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     //if ((key=vk_left) and (ssShift in Shift)) then label1.Visible:=not label1.Visible;
     if key=vk_shift then fl := true;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     //if ((key=vk_left) and (ssShift in Shift)) then label1.Visible:=not label1.Visible;
     if not (key=vk_shift) then fl := false;
end;
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32325813
Фотография Mihail R.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Tform1 = class (TForm)
  ....
private
  ....
public
  ......
  procedure MyWMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
  ........
end;
.............
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32325822
Была процедура написана перед private. Перенес в public - не помогло.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32325896
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что кричит ?
_____________
__
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32325902
Теперь уже ничего не кричит. Просто в эту процедуру даже не заходит. Сделал точку останова на if (fl) and (Message.CharCode = vk_left) then - точно не заходит. Что-то я никак не врублюсь в чем дело.
...
Рейтинг: 0 / 0
Обработать Shift+Left, Ctrl+Left, Alt+Left
    #32325957
Nemec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну значит форма действительно не получает это сообщение, потому и KeyDown не обрабатывается. что сказать? - глюк.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обработать Shift+Left, Ctrl+Left, Alt+Left
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]