Az előző rész enyhén szólva elméletire sikeredett, úgyhogy most egy kicsit gyakorlatiasabbra vesszük a figurát - elkezdjük megírni azt, amiről a múlt alkalommal rizsáztam.

Kezdjük az alapobjektumnál!

Az egész rendszer (a régi XVision-nel ellentétben) egyetlen alapobjektumra épül, vagyis maga a rendszer is egy képernyőelem (éppen az, amelyik legfelül van).

Az alapobjektum felépítése:

PView = ^TView;
TView = Object
    Prev, Next: PView;
    Owner: PView;
    Child, LChild: PView;
    Options: Word;
    X, Y, W, H: Integer;
    EventMask: Word;
    TabNum: Integer;
    Constructor Init(ax, ay, aw, ah: Integer);
    Procedure Insert(P: PView); Virtual;
    Procedure HandleEvent(var Event: TEvent); Virtual;
    Procedure Draw; Virtual;
    Procedure DrawIt; Virtual;
    Procedure DrawView; Virtual;
    Procedure GetVideoArea(var xx, yy: Integer);
End;
 
Azt hiszem, a fenti kis deklaráció némi magyarázatra szorul:

Mezők:

 Metódusok:

Constructor Init(ax, ay, aw, ah: Integer);

Procedure Insert(P: PView); Virtual; Procedure TView.Insert(P: PView);
Var
  MaxNum: Integer;
  Q: PView;

Begin
  P^.Owner := @Self;
  if Child <> Nil then
  Begin
    Child^.Prev := P;
    P^.Next := Child;
    Child := P;
  End
  Else
  Begin
    Child := P;
    LChild := P;
  End;
  if P^.TabNum<>-1 then
  Begin
    Q := Child;
    MaxNum:=0;
    While Q <> Nil do
    Begin
      if Q^.TabNum > MaxNum then MaxNum := TabNum;
      Q:=Q^.Next;
    End;
    P^.TabNum:=MaxNum+1;
  End;
  P^.DrawView;
End;
A procedúra először beállítja a beillesztendő objektum Owner mezőjét (a beillesztő objektumra mutat) majd beszúrja a beillesztő objektum alatti szint első objektumának (pirossal jelölt rész). Az objektum már benne van a listában - beállítja a TabNum mező értékét (kék) és kirajzolja a képernyőre az objektumot.

Procedure HandleEvent(var Event: TEvent); Virtual; Procedure Draw; Virtual; Procedure DrawIt; Virtual; Procedure DrawView; Virtual; Procedure GetVideoArea(var xx, yy: Integer); Egyelőre ennyi a TView, ennyi az, amivel már valamit csináló rendszert lehet írni. Természetesen még rengeteg dolog hiányzik például: sehol sem használtuk ki az Options mezőt, nincs megírva a képernyőelem törlése a memóriából.

A rendszer működéséhez szükséges változók és globális procedúrák

Kezdjük talán a változókkal:

Var
  Application: PView;
  Exiting: Boolean;

  MouseInstalled: Boolean;
  MouseShown: Boolean;
  OldX,OldY: Integer;
  OldButtons: Byte;

Az Application változó a fában a legfelső objektumot tartalmazza, ez a rendszerobjektum.
Az Exiting majd később lesz érdekes, ha az értéke True, akkor a leáll a rendszer.
A többi változó az esemény- és egérkezeléshez kell.

Globális procedúrák és függvények:

Function HiMouseX: Word;

Function HiMouseY: Word; Az egér Y koordinátájával tér vissza Function buttons: Byte; Az egérgombok pillanatnyi állapotát adja vissza procedure mouse_show; Egér bekapcsolása - csak ha a mouseshown false procedure mouse_hide; Egér kikapcsolása - csak ha a mouseshown true Function IsInArea(X,Y,XX,YY,WW,HH: Integer): Boolean; Megadja, hogy X, Y koordináta benne van-e az XX, YY, WW, HH által meghatározott téglalapban Procedure SetFocus(P: PView); Adott objektumot fókuszálttá tesz - csak ha a tabnum nem -1.
Úgy gondolom, ez a procedúra bővebb kifejtést érdemel, úgyhogy most ez következik:
Procedure SetFocus(P: PView);
Begin
  While ((P<>Application) and (P<>Nil)) do
  Begin
    if ((P^.TabNum<>-1) and (P^.Prev<>Nil)) then
    Begin
      if P^.Next<>Nil then P^.Next^.Prev:=P^.Prev Else
        P^.Owner^.LChild:=P^.Owner^.LChild^.Prev;
      if P^.Prev<>Nil then P^.Prev^.Next:=P^.Next Else
        P^.Owner^.Child:=P^.Owner^.Child^.Next;
      P^.Next:=P^.Owner^.Child;
      P^.Prev:=Nil;
      P^.Owner^.Child^.Prev:=P;
      P^.Owner^.Child:=P;
      P^.DrawView;
    End;
    P:=P^.Owner;
  End;
End;
A rutin elindul a megadott objektumtól és felfelé lépeget a listában, miközben az objektumot és szülőit kiveszi a listából (kék) és előre rakja (piros). Ha nem volt a lista elején az objektum akkor kirajzolja.
Procedure GetEvent(Var E: TEvent); A rendszerobjektum (TApplication)

PApplication = ^TApplication;
TApplication = Object(TView)
  Constructor Init;
  Procedure SetGraphMode; Virtual;
  Procedure Draw; Virtual;
  Procedure Run; Virtual;
  Procedure Execute(Def: PView); Virtual;
End;

Constructor Init;

Procedure Draw; Virtual; Ez tartalmazza az alkalmazás hátterének kirajzolását. Procedure Run; Virtual; Ez hívja az Execute metódust, ami a tulajdonképpeni “rendszermag”. Procedure Execute(Def: PView); Virtual;
ITT A VÉGE, FUSS EL VÉLE de ha tetszett...

...A lemezen megtalálod az XV2APP.PAS fájlt, amiből a fent tárgyalt forráskódok származnak és az XV2DEMO1.PAS fájlt, ami egy bugyuta példa a XVision 2 használatára. Kilépés: Ctrl+Pause!

A rendszer egyelőre Graph unittal működik, de ha nagyobb színmélységet akarsz (vonatkozik ez a XVision 1-re is) keress egy 256 színt tartalmazó grafikus meghajtót (BGI) és a TApplication Setgraphmode metódusát (XV2-ben) átírva működtetheted 256 színben a rendszert. (Sajna jogi okok miatt nem kerülhet fel a CD-re az SVGA256.BGI)
 

Gerebenics Andor
eMail:PC-XUser@FREEMAIL.C3.HU, Subject: "XVision rovat"