Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отображение ShortCut(Accelerator) в главном меню [Delphi]


Mist ©   (2004-02-13 11:28:00) 

Привет всем.
Суть. (используется библиотека 1.90)
Пункты главного меню привязаны к ActionList в котором заданы Accelerator.
В режиме разработки отображение нормальное, а в запущенном приложении
пункт меню выглядит примерно так: "Вырезать Ctrl+PAlt+BackspaceShift+Del"
Т.е. собираются все сочетания (находящиеся в ActionList) до "Ctrl".
Такой эффект наблюдается для всех клавиш не содержаши "Ctrl".
Если Accelerator добавлен в свойствах самого меню то все ОК.

И еще, так разные мелочи:

1. Клавиши Insert, Delete, PageUp, PageDown (возможно и др.) приходится
вводить вручную т.к. свойством Accelerator воспринимаются их сокращенные
названия Ins, Del, PgUp и PgDown соответственно, а ввод по нажатию клавиш дает из полное названи.

2. При установке Action для пунков меню свойство caption получает
название с Accelerator: "&Вырезать|Shift+Ins". Может конечно так
задумано, но мне потом приходиться это исправлять.

3. Accelerator в меню связанного с ActionList отображается и в случае
установки свойства showShortCuts=False компонента TKOLMainMenu.


Владимир Кладов   (2004-02-22 13:21:00) [1]

Во втором разве полностью? Так я беру первый вариант?


RA   (2004-02-21 15:56:00) [2]

Пожалуйста.

2Kladov Может внести эти поправки в следующую версию KOL?


Mist   (2004-02-17 14:21:00) [3]

Спасибо, все получилось.
Чтобы поправить проблему
>Клавиши Insert, Delete, PageUp, PageDown (возможно и др.)
>приходится
Использовал 2 вариант - пусть названия клавишь выводятся полностью.


RA{Upgrate for mirror.pas}   (2004-02-17 12:15:00) [4]

Решение проблемы с выводом ShortCut. Надо поправить mirror.pas

function TKOLAccelerator.AsText: String;
var S: String;
begin
 asm
   jmp @@e_signature
   DB '#$signature$#', 0
   DB 'TKOLAccelerator.AsText', 0
 @@e_signature:
 end;
  Result:='';//Добавить {RA}
 if kapControl in Prefix then
   Result := 'Ctrl+';
 if kapAlt in Prefix then
   Result := Result + 'Alt+';
 if kapShift in Prefix then
   Result := Result + 'Shift+';

Чтобы поправить проблему
>Клавиши Insert, Delete, PageUp, PageDown (возможно и др.) >приходится
>вводить вручную т.к. свойством Accelerator воспринимаются их >сокращенные
>названия Ins, Del, PgUp и PgDown соответственно, а ввод по >нажатию клавиш дает из полное названи.

Есть 2 варианта:
1) в mirror.pas исправить код, чтобы выглядел так:
// Maxim Pushkar:
const VirtualKeyNames: array [TVirtualKey] of string =
             ( '', 'Back'{'BackSpace'}, 'Tab', 'CLEAR', 'Enter', 'Pause', 'CapsLock',
                 'Escape'{'Esc'}, 'Space', 'PageUp', 'PageDown', 'End', 'Home', 'Left',
                 'Up', 'Right', 'Down', 'SELECT', 'EXECUTE', 'PrintScreen',
                 'Ins', 'Delete'{'Del'}, 'Help'{'?'}, '0', '1', '2', '3', '4', '5',
                 '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
                 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                 'U', 'V', 'W', 'X', 'Y', 'Z', 'LWin', 'RWin', 'APPS',
                 'Numpad0', 'Numpad1', 'Numpad2', 'Numpad3', 'Numpad4',
                 'Numpad5', 'Numpad6', 'Numpad7', 'Numpad8', 'Numpad9',
                 '*', '+', '|', '-', '.', '/', 'F1', 'F2', 'F3', 'F4',
                 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12', 'F13',
                 'F14', 'F15', 'F16', 'F17', 'F18', 'F19', 'F20', 'F21',
                 'F22', 'F23', 'F24', 'NumLock', 'ScrollLock', 'ATTN', 'CRSEL',
                 'EXSEL', 'EREOF', 'PLAY', 'ZOOM', 'PA1', 'OEMCLEAR');

2) Или же править в mckAccEditor.inc процедуру
procedure TKOLAccEdit.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var S, K: String;
begin
 if (Key = VK_CONTROL) or (Key = VK_SHIFT) or (Key = VK_MENU) then Exit;
 if Shift * [ ssShift, ssAlt, ssCtrl ] = [ ] then Exit;
 S := '';
 if ssCtrl in Shift then S := S + 'Ctrl+';
 if ssAlt in Shift then S := S + 'Alt+';
 if ssShift in Shift then S := S + 'Shift+';
 case Key of
 VK_CANCEL       : K := 'Cancel'            ;
 VK_BACK         : K := 'BackSpace'{'Back'}              ;
 VK_TAB          : K := 'Tab'               ;
 VK_CLEAR        : K := 'Clear'             ;
 VK_RETURN       : K := 'Enter'             ;
 VK_PAUSE        : K := 'Pause'             ;
 VK_CAPITAL      : K := 'CapsLock'          ;
 VK_ESCAPE       : K := 'Escape'{'Escape'}            ;
 VK_SPACE        : K := 'Space'             ;
 VK_PRIOR        : K := 'PgUp'              ;
 VK_NEXT         : K := 'PgDn'              ;
 VK_END          : K := 'End'               ;
 VK_HOME         : K := 'Home'              ;
 VK_LEFT   : K := 'Left'              ;
 VK_UP           : K := 'Up'                ;
 VK_RIGHT        : K := 'Right'             ;
 VK_DOWN         : K := 'Down'              ;
 VK_SELECT       : K := 'Select'            ;
 VK_EXECUTE      : K := 'Execute'           ;
 VK_SNAPSHOT     : K := 'PrintScreen'       ;
 VK_INSERT       : K := 'Insert'            ;
 VK_DELETE       : K := 'Del'{'Delete'}            ;
 VK_HELP         : K := '?'{'Help'}              ;

P.S. Первый вариант точно работает, но и втрой должен работать


RA   (2004-02-14 17:44:00) [5]

У меня та же проблема в 1.86, думал, что уже исправлено и исправлять не стал. придется исправлять.


Наверх

Титульная страница Поиск, карта сайта Написать письмо