|
|
Form méretezésének szabályozása
|
|
Példaprogram letöltése
5380 bájt
|
Ebből a példából megtudhatjuk, hogy hogyan készíthetünk olyan Form-ot, amelynek az átméretezése adott lépésközönként történik, hasonlóan mint például a Delphi Object Inspector-a.
A mellékelt példaprogram futtatásához szükség van a Delphi által alapesetben feltelepített Vendors.db nevű példa adatbázisra, amely a DBDEMOS alias alatt érhető el.
A programban egy TDBCtrlGrid komponenst helyeztünk a Form-ra, amin megjelenítjük az adatbázis rekordjait. A Form átméretezésénél a függőleges méret a TDBCtrlGrid paneljainak magassága szerinti lépésközönként változik.
A megvalósításhoz a WM_WINDOWPOSCHANGING üzenethez készítettünk egy üzenetkezelő eljárást. Ez az üzenet akkor jön létre, amikor a felhasználó átméretezi vagy eltolja a Form-ot. Az átméretezés illetve eltolás közben folyamatosan kapjuk az üzenetet és az információt a Form jelenlegi pozíciójáról és méretéről.
procedure WMWindowPosChanging(var msg: TMessage); message WM_WINDOWPOSCHANGING;
Ennek az eljárásnak msg paraméterében kapjuk meg a Form aktuális pozícióját és méretét. Arra figyelni kell, hogy amikor átméretezés történik, akkor az X és Y pozíció értéke mindig 0! Az Msg paraméter lParam mezője egy pointer, amely egy TWindowPos rekordra mutat. Ennek a rekordnak az X és Y mezőjéből kiolvasható az ablak aktuális koordinátája, de csak akkor, ha az ablakot mozgatják, és nem átméretezik. Az ablak méretét a CX és CY mezőkből olvashatjuk ki. Ezt minden esetben megtehetjük, eltoláskor és átméretezéskor egyaránt.
Ha a rekord mezőinek értékét megváltoztatjuk, akkor ennek megfelelően változik a Form pozíciója és mérete.
Most nézzük, hogy a fenti feladatot hogyan lehet ennek a lehetőségnek a kihasználásával megoldani. Létrehozunk egy TWindowPos rekordra mutató pointer típusú változót WindowPos névvel.
procedure TForm1.WMWindowPosChanging;
var WindowPos:^TWindowPos;
rowc:integer;
begin
Beállítjuk a WindowPos pointerünket, hogy az lParam-ban tárolt memóriaterületre mutasson.
WindowPos:=pointer(Msg.lParam);
A rowc változóban kiszámoljuk, hogy az ablak aktuális magassága mellett hány sor fér el. Előzőleg az FHeight változóban eltároltuk a nem-kliens terület magasságát (fejléc+alsó- és felső keret). A számításnál úgy járunk el, hogy a teljes magasságból kivonjuk a nem-kliens terület magasságát (FHeight), és ezt elosztjuk a sor magasságával. Az eredményt a matematika szabályainak megfelelően kerekítjük a Round függvény segítségével.
rowc:=Round((WindowPos.cy-FHeight) / 18);
Ezután a kapott eredménnyel visszaszorozzuk a sor magasságát, és hozzáadjuk a nem-kliens terület magasságát. Ennek eredménye lesz az ablak magassága. Ezután már csak a DBCtrlGrid sorainak számát kell beállítani, és készen is vagyunk.
WindowPos.cy:=rowc*18+FHeight;
WindowPos.cx:=415;
DBCtrlGrid1.RowCount:=rowc;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 293. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|