|
A mellékelt példaprogram megnyitása előtt a DropDownPanel.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A DropDownPanel komponens, mint a neve is mutatja hasonlóképpen viselkedik, mint egy Panel komponens. A legfontosabb különbség az, hogy mindig a bal felső sarokban jelenik meg a Caption, a jobb felsőben pedig egy gomb, amivel a panelt lehet legördíteni, illetve becsukni. Szerkesztési időben a panel mérete tetszés szerint állítható, és azon komponensek helyezhetők el. Futási időben viszont, ha a DroppedDown property értéke hamis, akkor a panel bezárt állapotban van, vagyis a mérete csak akkora, hogy a Caption és a gomb látszik, a többi komponens nem. Amikor a DroppedDown property értéke igaz lesz, akkor a panel magassága automatikusan akkorára változik, hogy az arra helyezett összes komponens látható legyen. A komponens Align property-jének értéke alapértelmezetten alTop, így az egymás alá helyezett komponensek úgy fognak látszani, mint egy lista, amelynek elemei kinyithatók.
A komponenst a TCustomControl osztályból származtatjuk. Bár más komponenseket is tartalmazhat, önmaga is birtokolhatja a fókuszt, amit jelez is. Amikor a komponens birtokolja a fókuszt, akkor bármelyik billentyű leütésére lehet a panelt nyitni és zárni. Ebből a két mondatból következik, hogy a WMSetFocus, WMKillFocus és WMKeyDown eljárásokat felül kell írnunk. A panel dupla kattintással is nyitható-zárható, ehhez viszont a WMLButtonDblClick eljárásra is szükség lesz.
Az AdjustHeight eljárás végzi el a komponens magasságának kiszámítását és beállítását. Bezárt állapotban a komponens magassága a gomb képének magasságával egyezik meg, ellenkező esetben a komponensen található kontrolok pozíciójából és magasságából számítódik ki az a magasság, aminél minden komponens megfelelően látszik. Ez utóbbi esetben van szerepe a BottomBorderHeight property-nek, ami ehhez a magassághoz még hozzáadódik.
A ButtonCursor property-ben megadhatjuk, hogy amikor a gomb fölé ér az egér, akkor milyen képe legyen. Ez alapértelmezetten a crHandPoint, ami egyből jelzi a felhasználónak, hogy ide kell kattintania. A gomb tulajdonképpen egy TImage komponens, amelynek OnClick eseményéhez hozzá van rendelve a ButtonClick eljárás. Ez utóbbi a DroppedDown property értékét változtatja az ellenkezőjére. A gombhoz tartozó két property még a Glyph és a NumGlyphs. Mivel a gomb tulajdonképpen egy kép, ezért gondoskodunk róla, hogy a Glyph property mindig tartalmazzon egy bitképet, ehhez viszont erőforrásként tárolunk egyet. Ezt a képet a SetDefaultGlyph eljárás állítja be.
A Glyph property megtalálható több komponensnél is, melyek képeket is tartalmaznak (pl. SpeedButton). Jellemzője, hogy ez egy olyan kép, amely legalább 1, maximum pedig 4 egyforma méretű képet tartalmaz egymás mellett elhelyezve, melyek közül mindig csak az egyik látható. A képek számát határozza meg a NumGlyphs property. A Glyph property felhasználása egy kicsit eltér a többi komponensnél alkalmazott módszernél. A Glyph mind a négy képe (ha ennyi van) felhasználásra kerül. Az első két kép a bezárt, a második kettő pedig a legördített állapotokat mutatja. A páratlan számú képek akkor jelennek meg, amikor az Enabled property értéke igaz, a páratlanok pedig ellenkező esetben.
A megfelelő kép beállítása a SetActiveGlyph eljárásban történik, amikor a képet a gomb Picture property-jébe másoljuk.
A Panel fejlécének szövegét a Caption property-ben adhatjuk meg. A CaptionBold ehhez kapcsolódik. Ezzel egyszerűen beállíthatjuk, hogy a cím vastag (igaz érték), vagy normál betűtípussal legyen kiírva.
Egy fontos dologról gondoskodni kell. Amikor a panel bezárt állapotban van, akkor a rajta lévő komponensek (amelyek ugye nem látszanak) nem lehetnek aktívak, vagyis amikor a felhasználó a Tab billentyűt használja, akkor ezekre a komponensekre nem kerülhet a fókusz.
Ezt legegyszerűbben úgy kerülhetjük el, hogy ha DroppedDown property értékének megváltozásakor ezek Visible property-jének értékét igazra, vagy hamisra állítjuk. Ezzel még csak félig oldottuk meg a dolgot, mert mi van akkor, ha futási időben van létrehozva egy komponens a panelen, és közben a DroppedDown property értéke nem változik. Ennek elkerülésére felülírjuk a CMControlListChange eljárást, ami akkor fut le, amikor egy komponens a panelra kerül, vagy éppen törölve lesz róla. A Message paraméter lParam mezőjének értéke egy logikai érték, aminek értéke igaz, ha hozzáadás, és hamis, ha törlés történik. A wParam mező a komponens objektumának címét tartalmazza. Az eljárásban szintén a Visible property értékét állítjuk be, az aktuális állapotoktól függően.
|