Menük
Összetettebb programjaink megkövetelik,
hogy a végrehajtandó feladatokat részekre bontsuk. Tesszük ezt azért, hogy
egy-egy részt külön formon, a többitől elválasztva
kezeljünk. Ez megkönnyíti a vizuális tervezést. Mert igaz, hogy láthatóságok (Visible tulajdonság) állításával egyetlen formon is el lehetne helyezni a vizuális elemeket, de
szerkesztési időben mindegyik látható lenne, ami - elég sok elem esetén -
lehetetlenné tenné az elemek helyének, méretének egérrel történő beállítását.
Így a geometriai tulajdonságokat futási időben, értékadással lehetne csak
beállítani. Ez fölösleges és nehézkes is lenne.
A legcélravezetőbb megoldás erre az
esetre MDI alkalmazás készítése, melynek formjait
menüből hozzuk létre. Ebben a szakaszban lépésről lépésre leírom, hogyan kell
menüvezérelt MDI alkalmazást készíteni.
Indítsuk az IDE-t,
adjunk a fő-formunknak például fmMDIDemo
nevet. Kezdeményezzünk mentést, és az előre létrehozott MDIDemo
mappába mentsük ki a projektünket, UMDIDemo illetve PMDIDemo nevekkel. A form FormStyle tulajdonságát állítsuk be fsMDIForm-ra:
Adjunk a projectünkhöz két újabb formot.
Legyen a nevük fmA és fmB.
Mindkettő FormStyle tulajdonságát állítsuk fsMDIChild-re (gyermekablak). Mentsünk mindent (Save All), és az új formokhoz tartozó Unitokat nevezzük el UA illetve UB-vel.
A Standard palettáról helyezzünk egy MainMenu elemet a fmMDIDemo formra. Nevezzük el FoMenu-nek.
Ez a menü kétdimenziós. A fő-menüpontok mindig láthatók (ha egyébként nem
tesszük láthatatlanná). A fő-menüpontok a képernyő címsora alatt foglalnak
helyet. A formra helyezett MainMenu
elemen történő kettős kattintással lépjünk be a menüszerkesztőbe és adjunk
nevet az első fő-menüpontnak. Legyen ez miMDIDemo. A Caption tulajdonságát pedig állítsuk MDI Demo-ra:
Automatikusan létrejöttek a kétirányú továbbfejlesztés
lehetőségei, az első menüpont alatt az almenüpont, míg mellette a második
fő-menüpont helye. Az első almenüpont neve legyen miA
a Caption tulajdonsága
legyen: A.
A második almenüpont neve legyen miB,
Caption tulajdonsága pedig: B.
Gyakran előfordul, hogy az
almenüpontokat csoportokba célszerű sorolni. Az egymáshoz hasonló funkciókból
állíthatunk össze csoportokat. Itt most a programból való kilépés menüpontot
válasszuk el a formok kiválasztására alkalmas A és B menüponttól. Az elválasztás kialakítása: a harmadik
almenüpont neve legyen miElvalaszto, Caption tulajdonsága: -. Ennek a jelnek (mínusz vagy
elválasztójel) a hatására elválasztó vonal keletkezik az almenüpontok között.
Az utolsó almenüpont neve legyen miExit, Caption-ja pedig legyen Exit. A neve a funkcióját fogja tükrözni, ezzel ki lehet
majd lépni a programból.
Zárjuk be a menüszerkesztőt. Futtassuk a programot. A
menüpontok már megjelennek, csak még nem funkcionálnak:
Váltsunk át a fő-formunknál
kódnézetre, és a használatba veendő Unitok listáját bővítsük a két saját
Unittal.
Váltsunk újra form
nézetre, a formon a menük a futáshoz hasonlóan
jelennek meg és megnyílnak, csak értelemszerűen az
funkciójuk nem hajtódik végre. Sőt, a menüpontok kiválasztásával (egér klikk)
lehet a funkciókat elhelyezni a kódlistába. Legyen a menükiválasztás eredménye
a neki megfelelő form létrejötte és megjelenése. Ez a
következő kódrészlettel érhetjük el az fmA esetén:
Természetesen az előző lépést hajtsuk
végre az fmB esetén is. Ez követően futtassuk
programunkat. A következő látványban lesz részünk:
Evvel az állapottal a következő problémák vannak:
futtatáskor a gyermekablakok is létrejöttek, sőt ha be szeretnénk zárni, akkor
csak minimális méretig lehet eltüntetni őket (a bal alsó sarokba kerülnek,
mintha az a tálca lenne). Igaz még, hogy ha teljes méretet állítunk be rájuk,
akkor az egész formot takarják, nevük a címsorban szögletes zárójelben jelenik meg. Ha menüből újra
kiválasztjuk, akkor a gyermekablak új példánya jelenik meg. Ez utóbbiak nem
problémák, de tudni kell, hogy a rendszer ilyen beállításnál így működik.
Annak érdekében, hogy a gyermekablakok csak a
menüpontra való kattintás után jelenjenek meg, a következőt kell tenni. Nyissuk
meg az IDE Project menüpontja Options… menüpontját,
majd a gyermek formokat (fmA,
fmB) helyezzük át az Auto-Create
forms ablakból az Available
forms ablakba a >
feliratú nyomógomb segítségével:
Így most már csak akkor jelennek meg a
gyermekablakok, ha menüből aktiváljuk őket. A bezárási probléma megoldása a
következő. Váltsunk át az fmA form
formnézetére, majd az Object
Inspector Events részére és
kattintsunk kettőt az OnClose eseményen. Ennek
hatására a kódlistában a form zárásakor végrehajtandó
események beírására van lehetőségünk. Azt kellene
elérni, hogy a form záráskor valóban záródjon, a
lefoglalt memóriaterülete felszabaduljon. Ez a következő utasítással érhetjük
el:
Tegyük meg ugyanezt az fmB formmal is. Ezzel a menüpontok és a gyermekablakok MDI
alkalmazáson belüli összekapcsolását megoldottuk. Ha a formokra
még egy-egy címkével a nevüket is ráírjuk, akkor láthatóvá válik, hogy az egyes
formok egymástól függetlenül szerkeszthetők.
Utolsó lépésként az Exit
menüponthoz rendeljük hozzá a főform zárását.
Válasszuk a főform formnézetét,
kattintsunk a menün, azon belül az Exit menüponton és
a generált kódrészletbe írjuk be a Close parancsot:
Ennek
hatására az Exit menüpont a főform
zárására alkalmas.
A
főprogram és a két almodul listája:
unit UMDIDemo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, Menus, UA,UB;
type
TfmMDIDemo = class(TForm)
FoMenu: TMainMenu;
miMDIDemo: TMenuItem;
miA: TMenuItem;
miB: TMenuItem;
miElvalaszto: TMenuItem;
miExit: TMenuItem;
procedure miAClick(Sender: TObject);
procedure miBClick(Sender: TObject);
procedure miExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmMDIDemo: TfmMDIDemo;
implementation
{$R *.dfm}
procedure TfmMDIDemo.miAClick(Sender: TObject);
begin
fmA:= TfmA.Create(Self);
fmA.Show;
end;
procedure TfmMDIDemo.miBClick(Sender: TObject);
begin
fmB:= TfmB.Create(Self);
fmB.Show;
end;
procedure TfmMDIDemo.miExitClick(Sender: TObject);
begin
Close;
end;
end.
(***************************************)
unit UA;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmA = class(TForm)
lbA: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmA: TfmA;
implementation
{$R *.dfm}
procedure TfmA.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
end.
(*********************************************)
unit UB;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmB = class(TForm)
lbB: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmB: TfmB;
implementation
{$R *.dfm}
procedure TfmB.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
end.