HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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;


Cikksorozat

#IDKategóriaCikk címeSorozat
3333WindowsNet Shell parancsok1. rész
3367WindowsNet Shell parancsok2. rész
3396WindowsNet Shell parancsok3. rész


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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |