Strona g│≤wna

 

Projektowanie menu

Ka┐dy wie co to jest menu, ale czy ka┐dy wie wiedzieµ jak je zaprojektowaµ? Ostatnio menu jest do╢µ czΩsto u┐ywane w programach zw│aszcza, gdy piszemy jaki╢ edytor czego╢ :). Najlepiej, jak wiecie, zrobiµ program, kt≤ry bΩdzie wygl▒da│ i dzia│a│ tak samo jak inne programy. To czemu nasze menu ma byµ inne? W tym tek╢cie opiszΩ jak zaprojektowaµ menu, ale nie tylko projektowanie krok po kroku od pocz▒tku, ale te┐ jak np.: oddzieliµ pozycjΩ w menu od innych (tak▒ kresk▒ ;)).

Na pocz▒tek uruchamiamy Delphi (tak, tak... kliknij na ten przycisk Start...). Robimy nowy program lub otwieramy ten, w kt≤rym chcemy zrobiµ menu. Wstawiamy obiekt TMainMenu i klikamy na niego podw≤jnie, ┐eby w│▒czyµ edytor naszego menu (lub w Object Inspektorze klikamy na Items). W Object Inspektorze pojawiaj▒ siΩ w│a╢ciwo╢ci menu. »eby stworzyµ nowe menu rozwijane w w│a╢ciwo╢µ Caption wpisujemy np.: Plik. Tak stworzyli╢my nowe menu. Po prawej stronie pojawia siΩ miejsce na nowe menu, ale nas na razie interesuj▒ pozycje w menu Plik. WiΩc klikamy na Plik (dalej w Edytorze Menu). Rozwinie siΩ nam poni┐ej zawarto╢µ tego menu. Jak na razie jest puste (ale ju┐ tylko przez chwilkΩ...). Wybieramy pierwsz▒ woln▒ (i jedyn▒) pozycjΩ. Tutaj tak samo jak w tworzeniu Menu, ┐eby utworzyµ now▒ pozycjΩ musimy wpisaµ albo text do wy╢wietlenia, albo nawΩ pozycji (jΩsli wpiszesz nazwΩ to nasza pozycja bΩdzie bez textu, natomiast jak wpiszesz do Caption to nazwa zostanie automatycznbie utworzona. Zazwyczaj jest to, to samo co text pozycji tyliko, ┐e z pominieniem polskich font≤w i na ko±cu jest dodawana cyfra). My na razie wpisujemy tam Nowy. Po wpisaniu i klikniΩciu Enter pojawi siΩ nowa i utworzona przez nas pozycja z textem Nowy i pusta pozycja pod ni▒. Spoko jej nie bΩdzie je╢li nie podasz jej nazwy lub w│a╢ciwo╢ci Caption. Teraz utw≤rz pozycje: Otw≤rz i Zapisz. Przyda│oby siΩ teraz zrobic pozycjΩ Wyj╢cie, ale najpierw kliknij na menu w Delphi (File) i zobacz, gdzie znajduje siΩ pozycja Exit. Na ko±cu, prawda (te┐ mi odkrycie), ale przed ni▒ jest jeszcze... taka kreska! My te┐ j▒ zrobimy, ┐aden problem. Kliknij na ostatni▒ woln▒ pozycjΩ w Menu i w Caption wpisz: - (my╢lnik lub jak kto woli znak odj▒µ). Naci╢nij Enter. Co widzisz? Powsta│a ta kreseczka (tzw. seperator), a pod ni▒ znowu puste miejsce! I w│a╢nie tam wpisz Wyj╢cie. Nasze menu zaczyna przybieraµ jakie╢ kszta│ty, ale ┐eby jeszcze czego╢ Was nauczyµ zrobimy co╢ takiego: gdy kto╢ kliknie na Nowy rozwinie siΩ mu menu obok. Pewnie teraz szukasz pozycji w Object Inspektorze lub w kodzie, ale tam nic nie znajdziesz.... ┐eby utworzyµ takie menu od pozycji Nowy musimy: klikn▒µ na pozycjΩ Nowy (oczywi╢cie dalej w Edytorze) i teraz klikn▒µ prawym klawiszem (klawiatury :)) myszki na pozycjΩ Nowy. Poika┐e siΩ nam menu, a z niego musimy wybraµ "Create Submenu". I teraz widzimy jak obok naszego "Nowy" pojawia siΩ strza│ka i nowy pasek rozwijania. Teraz tak samo musimy utworzyµ nowe pozycje. Za│≤┐my, ┐e bed▒ one takie: Plik txt i Plik BMP (nie przyszed│ mi do g│owy ┐aden inny przyk│ad). Wszystko gra. Jednak jak wiemy niekt≤rzy wol▒ u┐ywµ skr≤t≤w z klawiatury. WiΩc, kliknijmy na kt≤r▒╢ pozycjΩ w naszym menu i w Object Inspektorze znajd╝my w│a╢ciwo╢µ ShortCut. Tam wybierzemy skr≤t z klawiatury nam odpowiadaj▒cy (nie trzeba bawiµ siΩ kodzie aby te skr≤ty dzia│a│y, Delphi sam to zrobi). To wszytsko jΩsli chodzi o skr≤t, ale co siΩ stanie jak kto╢ woli np.: nacisn▒µ lewy Alt+P (zerknij w Delphi, ┐e aby rozwin▒µ menu File starczy nacisn▒µ Alt + F. "F" jest podkre╢lone). WiΩc kliknij na kt≤r▒╢ z opcji i w w│a╢ciwo╢ci Caption wpisz (ten przyk│ad jest oparty na pozycji Plik) &Plik. DziΩki temu "P" bΩdzie podkre╢lone i po naci╢niΩciu Alt + P rozwiniemy menu Plik. Nie musisz tego generowaµ w kodzie, Delphi sam to zrobi, jednak nigdzie tego nie znajdziesz.
Zanim om≤wimy resztΩ rzeczy trzeba wiedzieµ jak tworzyµ zdarzenia do naszych pozycji. Nic prostszego. Mo┐emy to zrobiµ na dwa sposoby. Pierwszy to: nowe menu pojawia siΩ w formularzu, wiΩc starczy wybraµ interesjuj▒c▒ nas pozycje i... po prostu klikn▒µ. Reszta dzieje siΩ jak w innych obiektach. Drugim sposobem jest wej╢cie do edytora menu, wybranie przez nas interesuj▒cej pozycji i... niestety trzeba klikn▒µ a┐ dwa razy ;).
Teraz, gdy Was wtajemniczy│em mogΩ powiedzieµ t▒ resztΩ. Mianowicie chodzi mi (po g│owie :)) o w│a╢ciwo╢ci TMenuItem, czyli jeszcze kilka rzeczy, kt≤re mog▒ Wam siΩ przydaµ w projektowaniu menu.


Add - metoda Add dodaje do naszego menu now▒ pozycjΩ na ko±cu menu.
Przyk│adzik:

var
  NowaPozycjaMenu: TMenuItem;
begin
  NowaPozycjaMEnu := TMenuItem.Create(Self);
  NowaPozycjaMenu.Caption := 'Nowa Pozycja';
{Tutaj ustaw jeszcze inne w│a╢ciwo╢ci}
  Plik1.Add(NowaPozycjaMenu);
end;


Break - w│a╢ciwo╢µ Break okre╢la czy menu dzieli siΩ na kolumny i w jaki spos≤b. Je╢li dzieli siΩ, to pozycja z kt≤rej zosta│o menu podzielone idzie do nowo utworzonej kolumny.
Przyk│adzik: (najlepiej to robiµ w Object Inspektorze)

Zapisz1.Break := mbBarBreak;

Je╢li Break bΩdzie r≤wna│o siΩ mbNone, to nie bΩdzie podzia│u na kolumny. Je╢li Break r≤wne jest mbBreak, to menu jest podzielone na kolomny, ale bez seperatora jak siΩ dzieje, gdy Break r≤wne jest mbBarBreak. Domy╢lnie jest mbNone. Rzadko ta w│a╢ciwo╢µ jest stosowana


Checked - w│a╢ciwo╢µ okre╢la czy pozycja jest zaznaczona takim, jakgdyby "V" ;).
Przyk│adzik:

Zapisz1.Checked := True;


Count - pod t▒ w│a╢ciwo╢ci▒ jest podstawiona liczba pozycji w menu.
Przyk│adzik:

var
  ilosc:Integer;
begin
  ilosc := Plik1.Count;
 
{teraz usuwamy ostatni▒ pozycjΩ w menu}
 
Plik1.Delete(ilosc);
end;


Default - pozycja, kt≤ra ma t▒ w│a╢ciwo╢µ ustawion▒ na True, powoduje, ┐e po klikniΩciu na menu dwukrotnie uruchamia swoj▒ procedurΩ OnClick. Jest to rzadko spotykane w programach, wiΩc lepiej z tego nie korzystaj.
Przyk│adzik: (najlepiej to robiµ w Object Inspektorze)

Zapisz1.Default := True;


Delete - dziΩki temu usuwamy pozycjΩ w menu. Niestety musimy znaµ jej numer.
Przyk│adzik:

var
  ilosc:Integer;
begin
  ilosc := Plik1.Count;
 
{teraz usuwamy ostatni▒ pozycjΩ w menu}
 
Plik1.Delete(ilosc);
end;


Enabled - w│a╢ciwo╢µ ta okre╢l czy pozycja / menu jest aktywne.
Przyk│adzik:

Zapisz1.Enabled := False; //ustaw na nieaktywne


IndexOf - w│a╢ciwo╢µ ta zawiera po│o┐enie pozycji w menu.
Przyk│adzik:

var
ilosc:Integer;
begin
ilosc := Plik1.IndexOf(Zapisz1);
Plik1.Delete(ilosc);
end;


Insert - wstawia now▒ pozycjΩ w danym miejscu.
Przyk│adzik:

var
NowaPozycjaMenu: TMenuItem;
ilosc:Integer;
begin
NowaPozycjaMEnu := TMenuItem.Create(Self);
NowaPozycjaMenu.Caption := 'Nowa Pozycja';
{Tutaj ustaw jeszcze inne w│a╢ciwo╢ci}
ilosc := Plik1.Count;
//mo┐esz tu wstawiµ inn▒ liczbΩ, inaczej pozycja zostanie dodana na ko±cu
Plik1.Insert(ilosc,NowaPozycjaMenu);
end;


Items - jest tablic▒ pozycji w menu.
Przyk│adzik:

if Plik1.Items[3].Caption = 'Zapisz' then Plik1.Delete(3);


RadioItem - w│a╢ciwo╢µ okre╢la czy pozycja jest zaznaczona przyciskiem radiowym.
Przyk│adzik:

Zapisz1.Enabled := True;


Remove - usuwa z emnu pozycjΩ.
Przyk│adzik:

Plik1.Remove(Zapisz1);


Visible - okre╢la czy pozycja / menu jest widoczne.
Przyk│adzik:

Zapisz1.Visible := False;



I tak w ko±cu opisa│em prawie wszystkie w│a╢ciwo╢ci, a mia│em zrobiµ kr≤tki text ;). Oczywi╢cie wiΩkszo╢µ z tych rzeczy, kt≤re tu napisa│em, mog▒ byµ u┐yte w TPopupMenu, a nie tylko w MainMenu.

PC