Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2010, 16:01
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию Горячие клавиши

Здравствуйте. Возникла следующая потребность:
Нужно пользователю сделать выбор горячих клавиш. То есть сам код их уже есть в настройках нужно указать только горячую клавишу. Разъясню на примере:
Пользователю нужно, что бы на Tab переходило на новую строку. В настройках уже код этого есть, но там по стандарту стоит enter. Дак вот, пользователь может нажать в настройках допустим на клавишу tab и теперь он может tab'ом переходить между строк. Так называемый key bindings.
Ответить с цитированием
  #2  
Старый 04.10.2010, 16:14
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Код:
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
Как сделать так, чтобы при минимизации приложения в Tray его можно было вызвать определённой комбинацией клавиш, например Alt-Shift-F9 ?
 
 
//В обработчике события OnCreate
//основной формы создаём горячую клавишу:
 
if not RegisterHotkey(Handle, 1, MOD_ALT or MOD_SHIFT, VK_F9) then
  ShowMessage('Unable to assign Alt-Shift-F9 as hotkey.');
 
//В событии OnClose удаляем горячую клавишу:
UnRegisterHotkey( Handle, 1 );
 
//Добавляем обработчик в форму для сообщения
//WM_HOTKEY:
 
private // в секции объявлений формы
  procedure WMHotkey( var msg: TWMHotkey ); message WM_HOTKEY;
 
procedure TForm1.WMHotkey( var msg: TWMHotkey );
begin
  if msg.hotkey = 1 then
  begin
    if IsIconic( Application.Handle ) then
      Application.Restore;
    BringToFront;
  end;
end;

Это пример вставки гарячих клавиш, взял с делфи ворда, дак вот, если ты хочешь, чтоб в даном примере например место alt+shift+f9 поменять на ctrl+shift+f9, то измени строчку
Код:
1
2
3
4
5
if not RegisterHotkey(Handle, 1, MOD_ALT or MOD_SHIFT, VK_F9) then
 
НА
if not RegisterHotkey(Handle, 1, MOD_CTRL or MOD_SHIFT, VK_F9) then
// собственно здесь мы и изменяем гарячие клавиши... экспериментируй...
__________________
Помогаю за Спасибо
Ответить с цитированием
  #3  
Старый 04.10.2010, 21:33
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Мне не совсем это надо. Если я в ручную буду перебирать все сочетания, то это не реально. Пользователь может зажать любые клавиши, которые и станут горячими, хоть ENTER, хоть Q+1. Можно ли такое реализовать?
Ответить с цитированием
  #4  
Старый 04.10.2010, 22:37
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Почему нереально?
В настройках (или где тебе надо изменять гарячие клавиши) создаешь едит (например), в который пользователь будет вводить 3 клавишу (пример: Alt+Shift (обязательные) + его клавиша (может быть например F2)), и есть глобальная переменная (допустим q: integer), и когда пользователь нажимает "сохранить настройки" пишешь в buttonsaveClick:
Код:
1
2
3
4
5
  q := Edit.Text;
...
 
а потом собственно изменяешь:
if not RegisterHotkey(Handle, 1, MOD_CTRL or MOD_SHIFT, q) then

Где q - сама клавиша (коды клавиш можешь найти в инете)...
__________________
Помогаю за Спасибо
Ответить с цитированием
  #5  
Старый 05.10.2010, 03:21
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Спасибо, жаль что только через ктрл шифт, думал можно и обычные клавиши устанавливать.
Ответить с цитированием
  #6  
Старый 05.10.2010, 04:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

можно любые. делай через Action's.
Ответить с цитированием
  #7  
Старый 05.10.2010, 14:39
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Решил делать первым способом, только возникла проблема. Мне надо сделать так: Когда человек нажимает ctrl+shift+f1, то происходит одно действие, когда ctrl+shift+f2, то другое. Дак вот как определить какую именно клавишу нажал человек и передать это процедуре TForm1.WMHotkey( var msg: TWMHotkey ); ?
Ответить с цитированием
  #8  
Старый 05.10.2010, 16:26
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Ты каждой гарячей клавише даешь "номер (id)", дак вот с ним и работай, пример:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
// вот, смотри на 2 параметр, вот твой id
if not RegisterHotkey(Handle, 1, MOD_CTRL or MOD_SHIFT, q) then
...
 
procedure TForm1.WMHotkey( var msg: TWMHotkey );
begin
/// вот внимание:
  if msg.hotkey = 1 then // и сдесь...
  begin
    if IsIconic( Application.Handle ) then
      Application.Restore;
    BringToFront;
  end;
end;

Надеюсь понял
__________________
Помогаю за Спасибо
Ответить с цитированием
  #9  
Старый 06.10.2010, 09:34
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Понял, попробую, спасибо.

Upd. Решил сделать через массив, получилось такое, мне просто надо, что бы было забито от F1 до F9.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
s:string;
q:integer;
begin
script.Clear;
for i:=1 to 9 do begin
s:='VK_F'+Inttostr(i);
q:=Strtoint(s);
if not RegisterHotkey(Handle, i, MOD_ALT or MOD_SHIFT, q) then
  end;
  end;

Когда компилю выдаёт еррор, но не в привычной форме, т.е. внизу, а еррор типа как в ексе виндоуса:
Project1.exe raised expection class EConvertError with messgae "VK_F1' is not a valid integer value'

Последний раз редактировалось Мяфк, 06.10.2010 в 09:58.
Ответить с цитированием
  #10  
Старый 06.10.2010, 12:04
Аватар для Sky.NET
Sky.NET Sky.NET вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 49
Версия Delphi: XE
Репутация: 12
Радость

Правильно. Ты пытаешься текст 'VK_F1' перевести в число.
Вообще VK_F1 и т.п. это константы целого типа. И VK_F1 = 112 и далее +1 до VK_F24 = 135
Приведённый выше код это пример использования ГЛОБАЛЬНЫХ горячих клавиш, т.е. твоя программа будет отлавливать их даже если у тебя активно окно совсем другой программы. И если будут использоваться популярные сочетания горячих клавиш, то когда включена данная программа, эти же сочетания не будут работать в других программах, твоя программа будет их просто перехватывать.
Если тебе не нужен глобальный перехват горячих клавиш, то используй события:
OnKeyPress (Клавиша нажата)
OnKeyDown (Клавиша зажата)
OnKeyUp (Клавиша отпущена)
Обычно 2 последних события используются для обработки модификационных клавиш (Alt, Ctrl, Shift)
Приведу код использования из моей курсовой :
Код:
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
41
42
43
44
procedure TForm1.OnKeyPress(Sender: TObject; var Key: Char);
begin
  // Обработчик нажатий клавиш
  case Key of
    '0': B_0Click(Sender); // Если нажат символ 0, вызываем процедуру B_0Click и т.п.
    '1': B_1Click(Sender);
    '2': B_2Click(Sender);
    '3': B_3Click(Sender);
    '4': B_4Click(Sender);
    '5': B_5Click(Sender);
    '6': B_6Click(Sender);
    '7': B_7Click(Sender);
    '8': B_8Click(Sender);
    '9': B_9Click(Sender);
    #13: B_EnterClick(Sender); // клавиша Enter (код 13)
  end;
end;
 
procedure TForm2.OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  // Обработчик нажатий клавиш с Shift, Ctrl, Alt
  if ssAlt in Shift then // если зажата клавиша Alt
  Begin
    FlagF := true;
    E_2ndF.Text := '2ndF';
    if chr(Key) = 'M' then // И если нажат символ M
      B_MemAddClick(Sender);
  end;
  if ssShift in Shift then // если зажата клавиша Shift
    if chr(Key) = 'M' then
      B_MemShowClick(Sender);
  if ssCtrl in Shift then // если зажата клавиша Ctrl
    if chr(Key) = 'M' then
      B_MemClearClick(Sender);
end;
 
procedure TForm2.OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if not(ssAlt in Shift) then // если отпущена клавиша Alt
  Begin
    FlagF := false;
    E_2ndF.Text := '';
  end;
end;
Необходимые моменты я прокомментировал. Также вместо символов ('x') можешь использовать код клавиш (#X)
__________________
IDE := Embarcadero.RADStudio.XE.Architect
// Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук ©

Последний раз редактировалось Sky.NET, 06.10.2010 в 13:13.
Ответить с цитированием
  #11  
Старый 08.10.2010, 00:13
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Спасибо, но проблема. Сделал такой код под себя:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var i:integer;
  var e1,e2:Tedit;
begin
  For i := 1 to 9 Do
    Begin
       e1 := FindComponent('LabeledEdit'+IntToStr(I)+'.text') As TEdit;
       e2 := FindComponent('edit'+IntToStr(i)+'.text') As TEdit;
  if ssAlt in Shift then
    if chr(Key) = e2.text then
      script.lines.add (e1.Text);
end;
end;
Но при нажатии к примеру alt+1 ничего не происходит.
Ответить с цитированием
  #12  
Старый 08.10.2010, 09:21
Аватар для Sky.NET
Sky.NET Sky.NET вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 49
Версия Delphi: XE
Репутация: 12
По умолчанию

Должен быть активен объект с ссылкой на эту процедуру в событии. Можешь задать ссылки на эту процедуру для всех объектов.
__________________
IDE := Embarcadero.RADStudio.XE.Architect
// Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук ©
Ответить с цитированием
  #13  
Старый 08.10.2010, 17:05
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Не понял какой именно объект rich edit что ли?
Ответить с цитированием
  #14  
Старый 08.10.2010, 18:21
Аватар для Sky.NET
Sky.NET Sky.NET вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 49
Версия Delphi: XE
Репутация: 12
По умолчанию

Любой объект. Ведь ты по умолчанию используешь объект Form, а если ты нажимаешь на кнопку, или вводишь значение в Edit, то они становятся активными...
Sorry, не так выразился
Наводится на них фокус. И если у этого объекта есть событие по нажатию клавиш, то процедура сработает.
Чтобы сработало везде, нужно всем объектам, которые могут иметь фокус, сделать ссылку на процедуру в событии.

P.S.
Возможно можно сделать, чтобы объекты перенимали события от формы как дочерние, но можно ли вообще так сделать я не знаю.

P.P.S.
А кстати, хороший вопрос А действительно, можно ли так сделать?
__________________
IDE := Embarcadero.RADStudio.XE.Architect
// Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук ©

Последний раз редактировалось Sky.NET, 08.10.2010 в 18:24.
Ответить с цитированием
  #15  
Старый 08.10.2010, 18:25
Мяфк Мяфк вне форума
Начинающий
 
Регистрация: 30.05.2010
Сообщения: 102
Репутация: 10
По умолчанию

Сделал я у рич едита событие, других фокусов нету. Но всё равно не срабатывает, пытался и с альтом и с контром
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:26.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025