Політ: книга програмера  
0. Вступ
1. Особливості політівських програм
2. Події та їх обробники
3. Елементи керування: принципи, Button, Label, Check, Radio,
InpLine, PicCtl, Header, Progress, Track, TimerCtl, Notebook,
SpinEdit, PopupBtn, Switcher, MainMenu, Splitter, Memo, ListBox

Сайт Польоту
 

Елементи керування
Головне меню - MainMenu (модуль Ctl)

Політівське головне меню - це ряд кнопок, кожна з яких відкриває меню. Тобто технічно цей елемент керування дуже, просто дуже схожий на кнопку-меню. Тільки тут багаторівневе меню перетворюється на набір кнопок-меню: елементи меню першого рівня стають кнопками, а другого і далі потрапляють у меню відповідних кнопок. Про роботу з меню, а тим більш ієрархічними, я ще не розповідав. Зробимо так само, як і з кнопкою меню - тут я наведу маленький приклад, а по-справжньому меню ми розглянемо потім.



Створити головне меню
Function MainMenu_Create(Prog:PProg; VMenu:PMenuItem;
  VPicturePos:TPicturePos): PControl;
  • VMenu - вказівник на меню.
  • VPicturePos - положення картинок на кнопках, з яких складатиметься меню. Так само, як і для кнопок (Button), може бути ppLeft (зліва від текста) або ppTop (над текстом).


Намалювати головне меню
Procedure MainMenu_Paint(Me:PControl; VX1, VY1, VX2:Integer);
  • VX1, VY1 - координати лівого верхнього кута меню (рядка кнопок)
  • VX2 - зараз ігнорується :\.


Приклад, кажете... Зараз щось придумаємо. Давайте зробимо формочку з досить стандартним для Windows-них програм меню: File (New, Open, Save, Exit), Edit (Cut, Copy, Paste), Help (Help Topics, About). Отже робимо заготовочку на ім'я TestMmn, додаємо в Uses модуль Popup, заводимо змінні:
MnuTest: PMenuItem; { власне меню }
MmnMain: TMainMenu;
Заводимо процедуру створення меню:
Procedure MakeMenu(Me:PProg);
Var
  TempMenu: PMenuItem;
Begin
  With Me^, TTestMmnData(Me^) Do
  Begin
    MnuTest:=Popup.CreateMenu;

    TempMenu:=Popup.AddSubmenu(MyMenu, 'File', '', Nil, True);
      
      Popup.AddCommand(TempMenu, 'New', 'Ctrl+N', '', 
        Nil, True, Popup.DummyProc);
      Popup.AddCommand(TempMenu, 'Open...', 'Ctrl+O', '', 
        Nil, True, Popup.DummyProc);
      Popup.AddCommand(TempMenu, 'Save', 'Ctrl+S', '', 
        Nil, True, Popup.DummyProc);
      Popup.AddSpace(TempMenu);
      Popup.AddCommand(TempMenu, 'Exit', 'Alt+F5', '', 
        Kernel.PicClose, True, Popup.DummyProc);

    TempMenu:=Popup.AddSubmenu(MyMenu, 'Edit', '', Nil, True);

      Popup.AddCommand(TempMenu, 'Cut', 'Ctrl+X', '', 
        Kernel.PicCut, True, Popup.DummyProc);
      Popup.AddCommand(TempMenu, 'Copy', 'Ctrl+C', '', 
        Kernel.PicCopy, True, Popup.DummyProc);
      Popup.AddCommand(TempMenu, 'Paste', 'Ctrl+V', '', 
        Kernel.PicPaste, True, Popup.DummyProc);
		
    TempMenu:=Popup.AddSubmenu(MyMenu, 'Help', '', Nil, True);

      Popup.AddCommand(TempMenu, 'Help Topics', 'F1', '', 
        Nil, True, Popup.DummyProc);
      Popup.AddCommand(TempMenu, 'About', '', '', 
        Nil, True, Popup.DummyProc);
  End
End;
Ну і нарешті в OnInit пишемо:
MakeMenu(Me);
MmnMain:=Ctl.MainMenu_Create(Me, MyMenu, ppLeft);
Все, можна запускати та дивитись. А після цього пропоную уважніше подивитись на процедурку MakeMenu. Наскільки я розумію, мені доведеться дещо в ній пояснити :).

Ну, по-перше, це принцип створення вкладених (ієрархічних) меню. Для цього в модулі Popup є така функція:
Function AddSubmenu(Var Parent:PMenuItem; VName,VHint:String;
  VIcon:Pointer; VEnabled:Boolean): PMenuItem;
Ми передаємо їй звичайні параметри (меню Parent, назву VName та хінт VHint, іконку VIcon та флажок доступності VEnabled), а вона повертає нам вказівник на створене підменю. Тепер щоб додати елементи саме в це підменю, ми викликаємо AddCommand із цим вказівником. Тобто кажемо юніту Popup: "додай нам командочку в меню, тільки не в наше основне меню, а в ось це підменю".

По-друге я ще не розповідав про процедурку Popup.AddSpace. Насправді тут і розповідати нічого - вона додає в меню роздільник (порожнє місце).

Ну і по-третє вас міг здивувати запис типу Kernel.PicClose на місці іконки елемента меню. Особливо через те, що це працює :) і в меню дійсно додаються іконки. Отже, політівський кернел намагається зробити програмерам маленьку послугу та при запуску завантажує кілька іконок загального призначення:
  • Kernel.PicOK - іконка "OK" (галочка)
  • Kernel.PicApply - іконка "Спробувати" (кружечок)
  • Kernel.PicClose - іконка "Закрити" (хрестик)
  • Kernel.PicCut - іконка "Вирізати" (ножиці)
  • Kernel.PicCopy - іконка "Зкопіювати" (два листочки)
  • Kernel.PicPaste - іконка "Вставити" (дошка та листочок)