Delphi/Menu

Z Wikibooks, biblioteki wolnych podręczników.

Menu[edytuj]

Spora część aplikacji Windows używa menu. Rozróżnia się zasadnicze dwa typy menu: menu główne (w postaci paska tekstowego tuż pod paskiem tytułowym okna) oraz wyskakujące menu, w postaci bloczku wyświetlanego zwykle przez użytkownika za pomocą prawego przycisku myszki. W tej części omówimy oba te rodzaje menu i pokażemy, jak je stosować.

Menu główne[edytuj]

Menu główne (MainMenu) jest komponentem, który zawiera inne komponenty - elementy menu. Każde menu główne jest związane z jednym oknem formularza i zawiera (niedostępne dla Ciebie) metody, które odpowiadają za jego rysowanie.

Utwórz nowy projekt i dodaj do formularza menu główne.

W przeciwieństwie do przycisków czy etykiet, menu nie pojawiło się na formularzu - jedynie jego ikonka. Ikonka będzie widoczna tylko w trybie edycji programu. Jeśli uruchomisz program, ikonka zniknie.

Menu zostało utworzone, ale nie zawiera żadnych elementów. Jak je dodać?

Kliknij dwukrotnie na ikonkę menu znajdującą się na formularzu. Otworzy się edytor menu. Większość właściwości jest oczywista lub dostępna w pomocy, dlatego omówimy tu tylko te najważniejsze.

Menu składa się z elementów, które również są komponentami, o nazwie MenuItem. Każdy komponent MenuItem może zawierać inne elementy, tym samym tworząc podmenu. Najwyższe w hierarchii elementy tworzą poziomą belkę pod paskiem tytułowym, podrzędne - pionowe bloki menu. Załóżmy, że twoja aplikacja ma standardowe menu: "Plik", "Edycja" oraz "Pomoc".

Każdy element menu musi mieć swoją nazwę. W tej chwili znajdujemy się w najwyższym punkcie hierarchii. Dodamy menu "Plik".

Wpisz w Name elementu (w Inspektorze Obiektu) np. "MenuPlik". Nadaliśmy nazwę temu elementowi, teraz dodamy opis - Caption, czyli to, co zobaczy użytkownik. Wpisz "&Plik" w pole Caption. Znak "&" będzie niewidoczny i oznacza, że następna litera jest jednocześnie skrótem klawiszowym do tego elementu menu (ta litera będzie podkreślona, a użytkownik może wcisnąć Alt-P, żeby uruchomić to menu). To samo dotyczy właściwości Caption wszystkich komponentów, np. przycisku, etykiety itd.

Zauważ, że gdy dodałeś opis, pojawił się on zarówno w edytorze menu, jak i na formularzu. Teraz dodamy menu "Edycja". Kliknij na sąsiednie pole obok "&Plik" i nadaj nazwę nowemu elementowi (np. "MenuEdycja") i opis: "&Edycja". Tak samo utwórz menu "Pomoc" (Caption np. "Pomo&c").

Teraz kliknij (ciągle w edytorze) na menu "Plik".

Kilknij teraz na pusty element, który się pojawił. Powiedzmy, że ten element będzie tworzył nowy dokument. Wpisz więc nazwę (np. "MenuNowy") i opis ("&Nowy"). Możesz też wpisać od razu opis, a Delphi wstawi nazwę automatycznie.

Każdy element ma właściwość "ShortCut". Utwórz w menu Plik element "Otwórz" i przypisz mu kombinację klawiszy Ctrl-O. Wciśnięcie Ctrl-O będzie tożsame z wybraniem elementu "Otwórz" z menu.

Menu ma również właściwość "Bitmap" - jest to wskaźnik na bitmapę (por. poprzedni rozdział), która pojawi się obok tekstu. Możesz wykorzystać to do zrobienia ładniejszej aplikacji. Oczywiście pamiętaj, aby bitmapa nie była zbyt duża.

Właściwość Enabled określa, czy element menu jest aktywny czy nie. Utwórz element "Zapisz", który ustaw na nieaktywny - załóżmy, że na początku programu żaden dokument nie został utworzony, więc nie ma sensu go zapisywać. Zawsze możesz włączyć element podczas wykonywania programu; po prostu ustawisz tę właściwość na True.

Jeżeli zamiast Caption wpiszesz znak minusa ("-"), utworzysz pusty element (separator) - poziomą kreskę oddzielającą bloki tematyczne.

Dodaj jeszcze element umożliwiający wyjście z programu.

Jeżeli pomylisz się, klawiszem "Del" możesz usunąć dany element menu.

Zauważ, że podczas edycji menu na oknie formularza zawsze możesz podejrzeć, jak ono będzie wyglądać.

W analogiczny sposób możesz uzupełnić menu Edycja i Pomoc.

Jak utworzyć podmenu? Dodaj do menu Edycja jakiś element, np. "Wklej". Powiedzmy, że Twój program będzie mógł wklejać na dwa sposoby: np. tekst sformatowany i bez formatowania. Wybierz element "Wklej" w edytorze menu, kliknij prawym przyciskiem myszy i wybierz "Create Submenu" ("utwórz podmenu").

Dalsze tworzenie menu jest analogiczne. Samodzielnie dodaj dwa elementy, np. "Bez formatowania" i "Z formatowaniem".

Jesli chcesz, uruchom teraz program i zobacz, w jaki sposób działa Twoje menu.

Teraz należy dodać obsługę wyboru każdego elementu menu. Każdy element ma zdarzenie OnClick, które możesz oprogramować analogicznie do tego samego zdarzenia w przycisku. Zdarzenie OnClick jest wywoływane również wtedy, gdy użytkownik użyje skrótu klawiaturowego przypisanego do danego elementu (w tym przykładzie Ctrl-O dla elementu "Otwórz").

PopupMenu[edytuj]

Drugi rodzaj menu to popup menu (menu wyskakujące). Dodaj do swojego formularza PopupMenu. Edycja jego elementów jest analogiczna jak menu głównego. Dodaj kilka elementów.

Teraz musimy programowi powiedzieć, kiedy to menu ma się pojawiać. Zwykle spotykanym rozwiązaniem jest, że użytkownik klika prawym przyciskiem myszki na oknie, a menu pojawia się.

Formularz ma właściwość PopupMenu: wskaźnik na dane menu. Możesz przypisać swoje menu do formularza w Inspektorze Obiektu. W dalszej części tekstu nie będziemy używać tej opcji; wszystko zrobimy "ręcznie".

Aby wykryć, kiedy użytkownik kliknął prawym przyciskiem myszki, użyjemy zdarzenia OnMouseDown formularza. Wybierz formularz, znajdź jego zdarzenie OnMouseDown i otwórz je do edycji.

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
end;

W odróżnieniu od poznanego już zdarzenia OnClick, ta metoda ma nieco więcej parametrów. Zmienna Button mówi, który przycisk myszki został wciśnięty. Shift określa, który ze specjalnych klawiszy był wciśnięty (Shift, Alt, Ctrl) - Twój program może inaczej reagować; X i Y są współrzędnymi kursora na formularzu - Twój program może robić różne rzeczy w zależności od klikniętego miejsca.

Nas interesuje najbardziej zmienna Button. Jeżeli został wciśnięty prawy klawisz myszki, to pokaż PopupMenu. Gdzie? Najlepiej tam, gdzie znajduje się myszka:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbRight then
PopupMenu1.Popup(X,Y); // pokaż PopupMenu1
end;

Uruchom. Tu wyszła jedna rzecz: X i Y określają współrzędne względem formularza (a ściślej: obszaru klienta, czyli bez ramki, paska tytułowego itd.), a metoda Popup naszego wyskakującego menu wymaga współrzędnych ekranowych. Przeliczmy więc:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbRight then
PopupMenu1.Popup(ClientOrigin.X+X,ClientOrigin.Y+Y);
end;

Właściwość ClientOrigin zawiera współrzedne ekranowe lewego górnego obszaru klienta, czyli obszaru, na którym działa nasz prawy klawisz myszki i którego dotyczą zmienne X i Y.

Zauważ, że po wybraniu elementu z menu wyskakującego jest ono automatycznie chowane.

Reakcję programu na kliknięcie elementu można umieścić (analogicznie jak w menu głównym) w metodzie OnClick elementu.

Elementy menu można również tworzyć dynamicznie. Każde menu i każdy element menu mają wewnątrz siebie obiekt Items. Do poszczególnych elementów znajdujących się w danym (pod)menu można się odwoływać przez Items[0], Items[1], Items[2] itd. Menu i MenuItem mają także metodę Add, która dodaje element w danym menu na końcu listy.

Spróbuj napisać program, korzystający z pustego menu głównego, który przy tworzeniu formularza utworzy menu "Elementy" i 10 elementów wewnątrz niego (o opisie "element 1", "element 2" itd.).

(rozwiązanie)


« Poprzednia lekcjaSpis treściNastępna lekcja »