Többszintű objektumorientált felhasználói felület. Ez az, amit a pascalban dolgozók többsége TVision néven ismer. Az a felület is, amelyet ebben a cikksorozatban elkezdünk felépíteni valami hasonló lesz - grafikus módban. Van a piacon néhány "grafikus TVision" de ezek egyikéhez sem adnak forráskódot, ami megnehezíti a használatukat. A kialakítandó rendszerben nem tartom szem előtt a kompatibilitást a TVision-nel, hanem inkább úgy igyekszem kialakítani a rendszert, hogy az a lehető legkönnyebb használatú és legegyszerűbb felépítésű legyen.

Alapvető különbségek a régi XVision-höz képest.

A címben azt írtam, ez a felhasználói felület "többszintű". Ez azt jelenti, hogy lehetőségünk van például egy ablak objektumra rátenni egy gombot vagy más objektumot. Ennek több előnye is van:

  1. A rendszerben szereplő objektumokat együtt ill. csoportokban kezelhetjük.
  2. Lehetőségünk van több ablak egyidejű kezelésére
  3. Könnyebb az éppen aktuális objektumstruktúrát a program futása közben módosítani (a régi XVision-ben, ha át akartuk alakítani a képernyőt, akkor vagy külön-külön levettük az egyes objektumokat a képernyőről vagy egyben Done-oltuk a teljes rendszert és újrainicializáltuk az egészet de más objektumokkal.)

Nehézségek

Az előnyök érdekében szembe kell néznünk néhány nehézséggel:

  1. Tárolás a régi rendszerben a képernyőelemeket (objektumokat) egyszerűen listába rendeztük és a listában előre-hátra lépegetve megtaláltuk a keresett objektumokat.:



    A listás tárolási módszer itt nem fog működni, hiszen a felület többszintű, következésképp minden objektum "alatt" további objektumok sora következhet. A képernyőelemeket itt "fában" tároljuk, ami a következőképpen néz ki:

  2. Átfedő objektumok mivel az új XVision ablakos rendszerű, lehetséges az azonos szinten lévő objektumok közötti átfedés (pl: egy ablak egy másik előtt). Ez felveti azt a problémát, hogy ha olyan helyre kattintunk az egérrel, amely mindkét ablak része, melyik kapja a vezérlést. Logikus, hogy annak az ablaknak kell adni a vezérlést, amelyik följebb van mint a másik. Ebből következik, hogy az ablakok sorrendjét mindig az aktiválásuk sorrendjéhez kell igazítani, mert csak így érhető el, hogy mindig a megfelelő objektumra kerüljön a vezérlés.

  3. Tabulálás billentyűzetről mivel az objektumok sorrendje folyton változik, az objektumok között váltás nem valósítható meg olyan egyszerűen, ahogy XVision-ben tettük. Itt le kell tárolni, hogy az objektum hányadik a váltási listán és ennek a számnak az alapján lehet eldönteni, hogy melyik objektumra kell ugrani a TAB billentyű lenyomásakor. További probléma, hogy a TAB megnyomásakor mindig "le kell menni" a képernyőelemeket tároló fa lehetséges legalsó szintjére, de ha nincs több elem a lista aktuális szintjén, feljebb kell lépni.

  4. Képernyőelemek lebontása a régi XVision-ben, ha el akatunk távolítani egy objektumot a képernyőről, akkor egyszerűen kivettük a listából, töröltük a memóriából és újra kirajzoltuk a képernyőt. Ez az új rendszerben kicsit gázosabb: Ki kell venni a fából az eltávolítandó objektumot, le kell bontani az objektum alatt elhelyezkedő képernyőelemeket (rajzolás nélkül), törölni kell a memóriából az aktuális képernyőelemet majd újra kell rajzolni az aktuális képernyőelem feletti szintet.

  5. Rajzolás a rendszer csak úgy lesz hatékony, ha csak akkor rajzol objektumokat, ha az feltétlenül szükséges. pl: egy objektum törlésénél nem kell a teljes képernyőt újrarajzolni, csak azokat a részeket, amelyek üressé válnak az objektum eltűnésétől.

A fenti sok duma után úgy tűnhet, nem is érdemes ennyi vesződséget áldozni a rendszer megírásába, hiszen azzal, hogy többszintűvé tettük, egy csomó kisebb-nagyobb problémával kerültünk szembe. Igaz, hogy a rendszer nem lesz éppen egyszerű de megéri a fáradozást hiszen sokkal-sokkal jobban használható lesz mint régi, egyszintű elődje. 

Működés

Az új felület teljesen hasonló módon fog működni, mint a régi XVision, vagyis lesz egy alap-objektum, amit a nagy Begin-nagy End között inicializálunk majd a Run metódusát meghívva elindítjuk a rendszert (akárcsak a TVisionben). Tulajdonképpen a rendszer működése közben a program végig az alap-objektum egyik metódusában kering, figyeli az eseményeket és ha van esemény, eldönti, hogy melyik képernyőelem "jogosult" rá. Ha van ilyen, akkor meghívja az illető objektum HandleEvent metódusát melynek paraméterben átadja azt az eseményt, amelyik kiváltotta a procedúra meghívását. 

Úgy tűnik, a mostani számra csak az elméleti fejtegetés jutott de ígérem, a következő számban már lesz forráskód is!