Delphi - Form-ok összeragasztása

forráskód letöltése
Képzeljen el két Form-ot, melyet akárhogy mozgat, akárhogy méretezi is át őket, minden esetben egymás mellett maradnak.

Két, vagy esetleg több ilyen Form felhasználási területe ott jelentkezhet, ahol például az egyes Form-okon különböző nyomógombokkal különféle funkciók végezhetők egy programon belül, de mondjuk nincs szükség mindig mindegyik Form-ra. Ha viszont egynél több van belőlük, akkor célszerű lenne, ha ezeket egy egységként együtt lehetne kezelni, mozgatni, stb.

A mellékelt példában két Form-ot "ragasztunk" össze, úgy hogy bármelyiket is mozgatva, illetve méretezve mindig egymás mellett maradnak. A feladat első nekifutásra egyszerűnek tűnhet, de fejlesztés során kiderül, hogy bizony jó néhány megoldandó problémába ütközünk.

Nézzük, hogyan is valósítható meg a fenti feladat.

Mivel mind a két Form-nál ugyanazokat a funkciókat kell megvalósítani, így elegendő, ha csak az egyiket nézzük végig.

Először is figyelnünk kell két eseményt: a Form mozgatását és annak a méretezését. Mind a két esetben a másik Form pozícióját hozzá kell igazítani az éppen változó Form-hoz.

Méretezésnél rendelkezésünkre áll a Form OnResize eseménye. Ezt egyszerűen felhasználhatjuk és itt beállíthatjuk a másik Form pozícióját úgy, hogy az igazodjon az aktuális Form-hoz.

A Form mozgatásához viszont már nekünk kell létrehozni egy eseménykezelőt, mely a WM_MOVE eseményre reagál. Ha ez bekövetkezik itt csak egyszerűen meghívjuk a Form OnResize eseménykezelő eljárását, hiszen ugyanazt a kódot kell végrehajtanunk.

A probléma ott keletkezik ennél a módszernél, hogy amikor létrejön az egyik Form-nál valamely fenti két esemény, akkor ugye mozgatjuk a másik Form-ot az előző Form-hoz képest, vagyis előidézünk a másik Form-nál is egy WM_MOVE eseményt, ahol szintén lefut az eseménykezelő és próbálja állítani az előző Form pozícióját és kezdődik minden elölről.

Az eredmény elég lesújtó így. Mivel előre nem tudhatjuk, hogy a felhasználó melyik Form-ot is fogja mozgatni, méretezni, így kénytelenek vagyunk mind a két Form esetében figyelni ezeket az eseményeket. Tehát nem szüntethetjük meg, hogy a fenti probléma elkerülhető legyen.

Megoldása az lenne, hogy amikor az egyik Form-on bekövetkezik ez az esemény, akkor amíg a másik Form pozícióját állítjuk, addig letiltjuk annál a Form-nál az eseménykezelést, így elkerülhető a hiba.

Ehhez viszont arra van szükségünk, hogy tudjuk, hogy melyik Form-nál mikor kezdődik és mikor fejeződik be a Form mozgatásának, méretezésének eseménye.

Szerencsére ehhez is találunk a Windows-ban két eseményt.
WM_ENTERSIZEMOVE esemény jön létre mikor a felhasználó elkezdi mozgatni, vagy méretezni a Form-ot és WM_EXITSIZEMOVE jön létre mikor befejezi azt.

Ezeket felhasználva egy belső logikai változót (EnabledMove) állítunk át mindig a másik Form-nál.

Ezt felhasználva már elkerülhető az említett probléma és a két Form tökéletesen össze lesz "ragasztva".