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, MessagesSysUtilsVariantsClasses,

  GraphicsControlsForms,
  DialogsMenus, UA,UB;

type
  TfmMDIDemo = class(TForm)
    FoMenuTMainMenu;
    miMDIDemoTMenuItem;
    miATMenuItem;
    miBTMenuItem;
    miElvalasztoTMenuItem;
    miExitTMenuItem;
    procedure miAClick(SenderTObject);
    procedure miBClick(SenderTObject);
    procedure miExitClick(SenderTObject);
  private
    Private declarations }
  public
    Public declarations }
  end;

var
  fmMDIDemoTfmMDIDemo;

implementation

{$R *.dfm}

procedure TfmMDIDemo.miAClick(SenderTObject);
begin
  fmA:= TfmA.Create(Self);
  fmA.Show;
end;

procedure TfmMDIDemo.miBClick(SenderTObject);
begin
  fmB:= TfmB.Create(Self);
  fmB.Show;
end;

procedure TfmMDIDemo.miExitClick(SenderTObject);
begin
  Close;
end;

end.

 

(***************************************)

 

unit UA;

interface

uses
  Windows, MessagesSysUtilsVariantsClasses

  GraphicsControlsForms,
  DialogsStdCtrls;

type
  TfmA = class(TForm)
    lbATLabel;
    procedure FormClose(SenderTObjectvar ActionTCloseAction);
  private
    Private declarations }
  public
    Public declarations }
  end;

var
  fmATfmA;

implementation

{$R *.dfm}

procedure TfmA.FormClose(SenderTObjectvar ActionTCloseAction);
begin
  Action:= caFree;
end;

end.

 

(*********************************************)

 

unit UB;

interface

uses
  Windows, MessagesSysUtilsVariantsClasses

  GraphicsControlsForms,
  DialogsStdCtrls;

type
  TfmB = class(TForm)
    lbBTLabel;
    procedure FormClose(SenderTObjectvar ActionTCloseAction);
  private
    Private declarations }
  public
    Public declarations }
  end;

var
  fmBTfmB;

implementation

{$R *.dfm}

procedure TfmB.FormClose(SenderTObjectvar ActionTCloseAction);
begin
  Action:= caFree;
end;

end.