0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 8
1

Горячие клавиши

30.11.2014, 14:03. Показов 14222. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, как прикрепить горячие клавиши к Button. Например есть процедура:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button2Click(Sender: TObject);
var
  s:real;
  i:integer;
begin
SumEdit.Text:=FloatToStr(0);
s:=0;
for i:=Memo1.Lines.Count-1 downto 0 do
if StrToFloat(Memo1.Lines[i])>=100 then
  begin
  s:=s+StrToFloat(Memo1.Lines[i]);
  SumEdit.Text:=FloatToStr(s)
  end
else
if SumEdit.Text=FloatToStr(0) then
SumEdit.Text:=('Íåò çíà÷åíèé!')
end;
Она прикреплена к button2, как сделать так, чтобы при нажатии клавиши, делфи выполнял процедуру?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2014, 14:03
Ответы с готовыми решениями:

Горячие клавиши
Здравствуйте скажите как можно реализовать горячие клавиши без таймера нужно что бы допустим...

Горячие клавиши
Вот такая проблемка. Нужно мне настроить горячие клавиши на "Exit" - esc, "About" - f1, "Open" -...

Горячие клавиши
Здраствуйте уважаемые программисты! У меня просьба, я вылаживаю исходники небольшой программки...

Горячие клавиши
Подскажите пожалуйста как мне назначить какоето действие на горячие клавиши : F1,F2..ну и тд..

18
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,133
30.11.2014, 14:26 2
Цитата Сообщение от kirosaki Посмотреть сообщение
как сделать так, чтобы при нажатии клавиши, делфи выполнял процедуру?
какой клавиши?
0
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 8
30.11.2014, 14:29  [ТС] 3
Любой клавиши, любого хот кей сочетания.
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,133
30.11.2014, 14:52 4
Во-первых, процедуру необязательно привязывать к кнопке. Ее можно просто отдельно оформить.
Delphi
1
2
3
4
5
6
7
8
9
10
type
  TForm1 = class(TForm)
    ...
  private
    { Private declarations }
  public
    { Public declarations }
    procedure MyProc; //например так
//ставим напротив названия процедуры курсор и нажимаем сочетание клавиш Shift+Ctrl+C.
//Будет создан шаблон процедуры. Добавьте в него свой код
Во-вторых, регистрируем ""горячие" клавиши.
Delphi
1
2
3
4
5
6
7
8
9
type
  TForm1 = class(TForm)
    ...
  private
    { Private declarations }
  public
    { Public declarations }
procedure MyProc;
    procedure hot_key(var Message: TMessage); message WM_HOTKEY;//для этой процедуры также создаем шаблон
При создании формы регистрируем команду ("горячую" клавишу):
Delphi
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterHotKey(Handle, 0, MOD_CONTROL, $41); // для команды Ctrl+A
end;
Внутри созданного шаблона для hot_key, вызываем первоначально созданную основную процедуру MyProc.

Delphi
1
2
3
4
5
procedure TForm1.hot_key(var Message: TMessage);
begin
    // обработчик
    MyProc;
end;
В этом случае, при нажатии клавиш Ctrl+A, будет вызываться Ваша процедура.

В-третьих, при закрытии формы обязательно удаляем зарегистрированную команду

Delphi
1
2
3
4
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    UnRegisterHotKey(Handle, 0);
end;
0
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
30.11.2014, 17:27 5
Альтернатива горячим клавишам http://msdn.microsoft.com/ru-R... s.85).aspx (в потоке, таймере).
0
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
01.12.2014, 02:54 6
Лучший ответ Сообщение было отмечено kirosaki как решение

Решение

Цитата Сообщение от kirosaki Посмотреть сообщение
Любой клавиши, любого хот кей сочетания.
1
Delphi
1
2
3
  private
    { Private declarations }
       procedure MyProc;
2.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.MyProc;
var
  s:real;
  i:integer;
begin
  SumEdit.Text:=FloatToStr(0);
  s:=0;
  for i:=Memo1.Lines.Count-1 downto 0 do
  if StrToFloat(Memo1.Lines[i])>=100 then
  begin
  s:=s+StrToFloat(Memo1.Lines[i]);
  SumEdit.Text:=FloatToStr(s)
  end
else
  if SumEdit.Text=FloatToStr(0) then
  SumEdit.Text:=('Нет значений!')
 
end;
3
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
   MyProc;
end;
4) На пример при нажатие F2 вызываю это процедуру
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
 If Msg.CharCode = 113 then  // F2
  begin
     MyProc;
     Handled := True;
  end
end;
Вложения
Тип файла: rar T1.rar (165.0 Кб, 39 просмотров)
1
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
04.12.2014, 19:59 7
Цитата Сообщение от kirosaki Посмотреть сообщение
Любой клавиши, любого хот кей сочетания
события OnShortCut смотрим и реализовать уже не сложно
Миниатюры
Горячие клавиши  
0
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2014, 20:53 8
...упускается тот момент, что определенные комбинации "горячих клавиш" уже могут быть заняты определенными программами, винампом/аимпом, к примеру.

И нюансы Работа в приложении с использованием клавиш
0
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
04.12.2014, 21:14 9
Цитата Сообщение от raxp Посмотреть сообщение
что определенные комбинации "горячих клавиш" уже могут быть заняты определенными программами
Как может заняты ? как это представить ?
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,133
04.12.2014, 21:24 10
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Как может заняты ? как это представить ?
А так, что определенная комбинация может повлиять на работу другой программы.
0
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
04.12.2014, 22:00 11
Цитата Сообщение от droider Посмотреть сообщение
А так, что определенная комбинация может повлиять на работу другой программы.
Нет, нечего не вляеть если форма активном режиме! То выполняется то операция который мы прописали . Я демонстрирую маленький пример . Повторяю если форма активное ! То выполняется ТОЛЬКО это деиствия который у меня написано
Delphi
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
33
34
35
36
37
38
39
40
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  If Msg.CharCode = 113 then // F2
  begin
    ShowMessage(' Вы нажали клавишу  F2 ');
    Handled := True;
  end
  else If Msg.CharCode = 114 then // VK_F3
  begin
    ShowMessage(' Вы нажали клавишу  F3 ');
    Handled := True;
  end
  else If Msg.CharCode = 115 then // VK_F4
  begin
    ShowMessage(' Вы нажали клавишу  F4 ');
    Handled := True;
  end
  else If Msg.CharCode = 116 then // VK_F5
  begin
    ShowMessage(' Вы нажали клавишу  F5 ');
    Handled := True;
  end
  else If Msg.CharCode = 117 then // VK_F6
  begin
    ShowMessage(' Вы нажали клавишу  F6 ');
    Handled := True;
  end
  else If Msg.CharCode = 118 then // VK_F7
  begin
    ShowMessage(' Вы нажали клавишу  F6 ');
    Handled := True;
  end
    else If Msg.CharCode = 20 then // Caps Lock
  begin
    ShowMessage(' Вы нажали клавишу  Caps Lock ');
    Handled := True;
  end
end;
 
end.
А вы меня покажите пожалуйста пример . когда и как он влияет ?
Вложения
Тип файла: rar Form_OnShortCut.rar (2.19 Мб, 47 просмотров)
0
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,468
04.12.2014, 22:46 12
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Нет, нечего не вляеть если форма активном режиме!
А нафига тогда горячие клавиши?
0
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
04.12.2014, 22:54 13
Цитата Сообщение от northener Посмотреть сообщение
А нафига тогда горячие клавиши?
Вы наверно не поняли о чем мы раговориваем . и смотрите только ShowMessage(' .................. '); да ? почитайте #8 и #10

Не по теме:

Добавлено через 2 минуты

Цитата Сообщение от northener Посмотреть сообщение
А нафига
(А нафига и Пофига) вы скажите ваших друзей !!!!!!!!! КОМУ ЭТО НРАВИТСЯ .... А СДЕСЬ МЫ ПРОСТО ОБСУЖДАЕМ что то элементарный и следите за ваши ЯЗИКЕ

0
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,468
04.12.2014, 22:54 14
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Вы наверно не поняли о чем мы раговориваем
Я понимаю. Это вы не понимаете возражения в постах 8 и 10. А также не понимаете чем отличается горячая клавиша от шортката.
0
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
04.12.2014, 23:06 15
Цитата Сообщение от northener Посмотреть сообщение
чем отличается горячая клавиша от шортката.
Что вы понимайте ? Ну покажите как он ( повлиять на работу другой программы )

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от northener Посмотреть сообщение
А также не понимаете чем отличается горячая клавиша от шортката
Рассказчик рассказывает сказку :D понятное дела

0
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
04.12.2014, 23:42 16
А вы меня покажите пожалуйста пример . когда и как он влияет ?
Вложения Form_OnShortCut.rar
запустите любую программу, в которую можно назначить горячие клавиши, винамп, к примеру (конфигурация/настройки/установки/клавиатура). Назначьте клавишу на PLay/Pause - F6. Теперь запустите Project1.exe из архива, нажмите F6 - будет работать только для винампа, а в программе никакой реакции, работать не будет, в фокусе она или нет.

Следует различать глобальные "горячие" клавиши и локальные "горячие" клавишы. В винампе регистрируются глобальные и эти клавиши будут работать для того приложения, которое первое встало (кто раньше встал - того и тапки) вне зависимости от того свернуто оно или нет, а ваше приложение обломается, ибо запустилось позже и мало того, не регистрировало глобально.

Ссылку я не просто так выше давал, почитали бы, а то спор тут развели.
1
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
05.12.2014, 00:08 17
Цитата Сообщение от raxp Посмотреть сообщение
примеру (конфигурация/настройки/установки/клавиатура). Назначьте клавишу на PLay/Pause - F6. Теперь запустите Project1.exe из архива, нажмите F6 -
На Winamp да . Правильно так и есть . Даа вы меня удивили
Цитата Сообщение от raxp Посмотреть сообщение
Ссылку я не просто так выше давал
Почитаю
0
Эксперт Pascal/Delphi
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,566
05.12.2014, 12:41 18
Цитата Сообщение от raxp Посмотреть сообщение
Следует различать глобальные "горячие" клавиши и локальные "горячие" клавишы. В винампе регистрируются глобальные и эти клавиши будут работать для того приложения, которое первое встало (кто раньше встал - того и тапки) вне зависимости от того свернуто оно или нет
Да Вы прав . Вот зарегисстрировал F6 и действительно (кто раньше встал - того и тапки) если открыть моего приложения в начале то он работаеть , А если открыть Winamp то он работает .
1)
Delphi
1
2
3
4
  private
    { Private declarations }
     id1, id2, id3, id4, F6: Integer;
     procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
2)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
 if Msg.HotKey = id1 then
     ShowMessage('Ctrl + A pressed !');
   if Msg.HotKey = id2 then
     ShowMessage('Ctrl + Alt + R pressed !');
   if Msg.HotKey = id3 then
     ShowMessage('Win + F4 pressed !');
   if Msg.HotKey = id4 then
     ShowMessage('Print Screen pressed !');
    if Msg.HotKey = F6 then
   ShowMessage('Вы нажали F6 !');
end;
3)
Delphi
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
procedure TForm1.FormCreate(Sender: TObject);
// Different Constants from Windows.pas
const
   MOD_ALT = 1;
   MOD_CONTROL = 2;
   MOD_SHIFT = 4;
   MOD_WIN = 8;
   VK_A = $41;
   VK_R = $52;
   VK_F4 = $73;
   VK_F6 = $75; //   F6
begin
 // Register Hotkey Ctrl + A
  id1 := GlobalAddAtom('Hotkey1');
   RegisterHotKey(Handle, id1, MOD_CONTROL, VK_A);
 
   // Register Hotkey Ctrl + Alt + R
  id2 := GlobalAddAtom('Hotkey2');
   RegisterHotKey(Handle, id2, MOD_CONTROL + MOD_Alt, VK_R);
 
   // Register Hotkey Win + F4
  id3 := GlobalAddAtom('Hotkey3');
   RegisterHotKey(Handle, id3, MOD_WIN, VK_F4);
 
   // Globally trap the Windows system key "PrintScreen"
  id4 := GlobalAddAtom('Hotkey4');
   RegisterHotKey(Handle, id4, 0, VK_SNAPSHOT);
   // Register Hotkey Win + F6 +++++++++++++++++++++++++++++++++++++
  F6 := GlobalAddAtom('Hotkey5');
   RegisterHotKey(Handle, F6, 0, $75);
 
end;
4)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.FormDestroy(Sender: TObject);
begin
   UnRegisterHotKey(Handle, id1);
   GlobalDeleteAtom(id1);
   UnRegisterHotKey(Handle, id2);
   GlobalDeleteAtom(id2);
   UnRegisterHotKey(Handle, id3);
   GlobalDeleteAtom(id3);
   UnRegisterHotKey(Handle, id4);
   GlobalDeleteAtom(id4);
   GlobalDeleteAtom(F6); //+++++++++++
end;
Это беспредел ) Надо как то придумать так, что всегда работал мой приложения .
Вложения
Тип файла: rar системную горячую клавиш.rar (2.20 Мб, 37 просмотров)
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,133
05.12.2014, 13:24 19
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Это беспредел
Это не беспредел. Просто ShortCut и HotKey - это разные понятия.

Не по теме:

ТС' у видно это тоже все равно

0
05.12.2014, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2014, 13:24
Помогаю со студенческими работами здесь

Горячие клавиши
Как сделать так, чтобы, например, по нажатию нескольких клавиш открывалось диалоговое окно...

Горячие клавиши
Как прописать вызов горячих клавиш? Например, вызов печати на CTRL+P или поиска на CTRL+F? ...

Горячие клавиши
Как сделать что бы при нажатии клавиш Ctrl+Z выполнялось a:=a+1;

Горячие клавиши
Всем привет. Есть вопрос - можно ли в Delphi использовать комбинации клавиш Alt+1, Alt+2, Alt+3,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru