home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 22 / windows / sb.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-01-04  |  13.0 KB  |  424 lines

  1. (* ----------------------------------------------------- *)
  2. (*                        SB.PAS                         *)
  3. (*                                                       *)
  4. (* ■ ScrollBarObj: "Halb-Abstraktes" Objekt; als Eltern- *)
  5. (*   objekt für Horiz- und VertScrollBar, implementiert  *)
  6. (*   nur die gemeinsamen Methoden, die anderen rufen die *)
  7. (*   Prozedur "Abstract" auf, dh sie müssen reimplemen-  *)
  8. (*   tiert werden. - Wird CheckEvent aufgerufen, so muss *)
  9. (*   anschliessend der ReturnCode (s.u.) ausgewertet wer-*)
  10. (*   den. - Vorgehen: Init - SetXY - SetMaxPos -         *)
  11. (*   [SetColors] - [SetChars] - Show - beliebig weiter,  *)
  12. (*   also z.B. ChangePos, CheckEvent ...                 *)
  13. (* ■ VertScrollBar: auf vertikal ausgelegt.              *)
  14. (* ■ HorizScrollBar: auf horizontal.                     *)
  15. (*                                                       *)
  16. (*         (c) 1991 by R.Reichert & toolbox              *)
  17. (* ----------------------------------------------------- *)
  18. UNIT SB;
  19.  
  20. INTERFACE
  21.  
  22. USES UBase, MouKey, ExtVSM;
  23.  
  24. CONST                                      { ReturnCodes: }
  25.   SBScrollUp   = 1;  { scrolle eine Zeile nach oben/links }
  26.   SBScrollDown = 2;  {                       unten/rechts }
  27.   SBScrollPgUp = 3;  { scrolle seitenweise nach oben/links}
  28.   SBScrollPgDn = 4;  {                       unten/rechts }
  29.   SBGotoPos    = 5;  { gehe direkt zu Position, mit       }
  30.                      { GetPos abfragbar                   }
  31.  
  32. TYPE
  33.   ScrollBarPtr = ^ScrollBarObj;
  34.   ScrollBarObj = OBJECT (Base)
  35.  
  36.     x1, y1, x2, y2,         { Koordinaten der Balkenenden }
  37.     x,  y,                  { und der aktuellen Position  }
  38.     PosCol,                 { Farben von PosChr,          }
  39.     BarCol,                 { dem Balken und              }
  40.     TBBCol   : BYTE;        { den Pfeilspitzen            }
  41.     PosChr,                 { Zeichen für akt. Position,  }
  42.     BarChr,                 { den Balken und              }
  43.     BTLChr,                 { Pfeile: oben od. links,     }
  44.     BBRChr   : CHAR;        { unten / rechts              }
  45.     Max, Pos : WORD;        { Maximum und Position        }
  46.     ReturnCode: BYTE;       { Antwort, "Befehl"           }
  47.     VSM      : ExtVSMPtr;   { VSM-Objektzeiger            }
  48.  
  49.     CONSTRUCTOR Init (NewVSM : ExtVSMPtr);
  50.     PROCEDURE SetColors (PC, BC, TC : BYTE);       VIRTUAL;
  51.     PROCEDURE SetChars (PC,BC,TLC,BRC : CHAR);     VIRTUAL;
  52.     PROCEDURE SetXY (nx1, ny1, nx2, ny2 : BYTE);   VIRTUAL;
  53.     PROCEDURE SetXYRel (dx, dy : INTEGER);         VIRTUAL;
  54.     PROCEDURE SetMaxPos (M, P : WORD);             VIRTUAL;
  55.     PROCEDURE Show;                                VIRTUAL;
  56.     PROCEDURE ChangePos (NMax, NPos : WORD);       VIRTUAL;
  57.     PROCEDURE SetScrPos (NewScrPos : BYTE);        VIRTUAL;
  58.     PROCEDURE CheckMouEv (Ev : EventObj);          VIRTUAL;
  59.     PROCEDURE SetReturnCode (RC : BYTE);           VIRTUAL;
  60.  
  61.     FUNCTION GetReturnCode : BYTE;                 VIRTUAL;
  62.     FUNCTION GetX1 : BYTE;                         VIRTUAL;
  63.     FUNCTION GetY1 : BYTE;                         VIRTUAL;
  64.     FUNCTION GetX2 : BYTE;                         VIRTUAL;
  65.     FUNCTION GetY2 : BYTE;                         VIRTUAL;
  66.     FUNCTION GetMax : WORD;                        VIRTUAL;
  67.     FUNCTION GetPos : WORD;                        VIRTUAL;
  68.     FUNCTION GetScrPos : BYTE;                     VIRTUAL;
  69.   END;
  70.  
  71.   VertScrollBarPtr = ^VertScrollBar;
  72.   VertScrollBar = OBJECT (ScrollBarObj)
  73.     CONSTRUCTOR Init (NewVSM : ExtVSMPtr);
  74.     PROCEDURE SetXY (nx1, ny1, nx2, ny2 : BYTE);   VIRTUAL;
  75.     PROCEDURE Show;                                VIRTUAL;
  76.     PROCEDURE ChangePos (NMax, NPos : WORD);       VIRTUAL;
  77.     PROCEDURE SetScrPos (NewScrPos : BYTE);        VIRTUAL;
  78.     PROCEDURE CheckMouEv (Ev : EventObj);          VIRTUAL;
  79.  
  80.     FUNCTION GetScrPos : BYTE;                     VIRTUAL;
  81.   END;
  82.  
  83.   HorizScrollBarPtr = ^HorizScrollBar;
  84.   HorizScrollBar = OBJECT (ScrollBarObj)
  85.  
  86.     CONSTRUCTOR Init (NewVSM : ExtVSMPtr);
  87.     PROCEDURE SetXY (nx1, ny1, nx2, ny2 : BYTE);   VIRTUAL;
  88.     PROCEDURE Show;                                VIRTUAL;
  89.     PROCEDURE ChangePos (NMax, NPos : WORD);       VIRTUAL;
  90.     PROCEDURE SetScrPos (NewScrPos : BYTE);        VIRTUAL;
  91.     PROCEDURE CheckMouEv (Ev : EventObj);          VIRTUAL;
  92.  
  93.     FUNCTION GetScrPos : BYTE;                     VIRTUAL;
  94.   END;
  95.  
  96. IMPLEMENTATION
  97.  
  98. (* ───────────────────────────────────────────────────── *)
  99. (*            Implementation von ScrollBarObj            *)
  100. (* ───────────────────────────────────────────────────── *)
  101. CONSTRUCTOR ScrollBarObj.Init (NewVSM : ExtVSMPtr);
  102. BEGIN
  103.   IF NewVSM<>NIL THEN VSM := NewVSM
  104.   ELSE Fail;
  105.   x1 := 0;  y1 := 0;
  106.   x2 := 0;  y2 := 0;
  107.   x := 0;  y := 0;
  108.   PosCol := 15;   BarCol := $70;  TBBCol := $70;
  109.   PosChr := '■';  BarChr := '▒';
  110.   Max    := 0;    Pos    := 0;
  111.   BTLChr := #0;   BBRChr := #0;
  112.   ReturnCode := 0;
  113. END;
  114.  
  115. PROCEDURE ScrollBarObj.SetColors (PC, BC, TC : BYTE);
  116. BEGIN
  117.   PosCol := PC;  BarCol := BC;  TBBCol := TC;
  118. END;
  119.  
  120. PROCEDURE ScrollBarObj.SetChars (PC,BC,TLC,BRC : CHAR);
  121. BEGIN
  122.   PosChr := PC;   BarChr := BC;
  123.   BTLChr := TLC;  BBRChr := BRC;
  124. END;
  125.  
  126. PROCEDURE ScrollBarObj.SetXY (nx1, ny1, nx2, ny2 : BYTE);
  127. BEGIN
  128.   Abstract ('ScrollBarObj');
  129. END;
  130.  
  131. PROCEDURE ScrollBarObj.SetXYRel (dx, dy : INTEGER);
  132. BEGIN   { dient der "Verschiebung" }
  133.   x1 := x1+dx;  y1 := y1+dy;
  134.   x2 := x2+dx;  y2 := y2+dy;
  135.   x  := x+dx;   y  := y+dy;
  136. END;
  137.  
  138. PROCEDURE ScrollBarObj.SetMaxPos (M, P : WORD);
  139. BEGIN
  140.   Max := M;  Pos := P;
  141. END;
  142.  
  143. PROCEDURE ScrollBarObj.Show;
  144. BEGIN
  145.   Abstract ('ScrollBarObj');
  146. END;
  147.  
  148. PROCEDURE ScrollBarObj.ChangePos (NMax, NPos : WORD);
  149. BEGIN
  150.   Abstract ('ScrollBarObj');
  151. END;
  152.  
  153. PROCEDURE ScrollBarObj.SetScrPos (NewScrPos : BYTE);
  154. BEGIN
  155.   Abstract ('ScrollBarObj');
  156. END;
  157.  
  158. PROCEDURE ScrollBarObj.CheckMouEv (Ev : EventObj);
  159. BEGIN
  160.   Abstract ('ScrollBarObj');
  161. END;
  162.  
  163. PROCEDURE ScrollBarObj.SetReturnCode (RC : BYTE);
  164. BEGIN
  165.   ReturnCode := RC;
  166. END;
  167.  
  168. FUNCTION ScrollBarObj.GetReturnCode : BYTE;
  169. BEGIN
  170.   GetReturnCode := ReturnCode;  ReturnCode := 0;
  171. END;
  172.  
  173. FUNCTION ScrollBarObj.GetX1 : BYTE;
  174. BEGIN
  175.   GetX1 := x1;
  176. END;
  177.  
  178. FUNCTION ScrollBarObj.GetY1 : BYTE;
  179. BEGIN
  180.   GetY1 := y1;
  181. END;
  182.  
  183. FUNCTION ScrollBarObj.GetX2 : BYTE;
  184. BEGIN
  185.   GetX2 := x2;
  186. END;
  187.  
  188. FUNCTION ScrollBarObj.GetY2 : BYTE;
  189. BEGIN
  190.   GetY2 := y2;
  191. END;
  192.  
  193. FUNCTION ScrollBarObj.GetMax : WORD;
  194. BEGIN
  195.   GetMax := Max;
  196. END;
  197.  
  198. FUNCTION ScrollBarObj.GetPos : WORD;
  199. BEGIN
  200.   GetPos := Pos;
  201. END;
  202.  
  203. FUNCTION ScrollBarObj.GetScrPos : BYTE;
  204. BEGIN
  205.   Abstract ('ScrollBarObj');
  206. END;
  207.  
  208. (* ───────────────────────────────────────────────────── *)
  209. (*            Implementation von VertScrollBar           *)
  210. (* ───────────────────────────────────────────────────── *)
  211. CONSTRUCTOR VertScrollBar.Init (NewVSM : ExtVSMPtr);
  212. BEGIN
  213.   IF ScrollBarObj.Init (NewVSM) THEN BEGIN
  214.     BTLChr := Chr (24);  BBRChr := Chr (25);
  215.   END ELSE
  216.     Fail
  217. END;
  218.  
  219. PROCEDURE VertScrollBar.SetXY (nx1, ny1, nx2, ny2 : BYTE);
  220. BEGIN
  221.   IF (Nx1=Nx2) AND (nx1>=1) AND (nx1<=VSM^.GetXLength) AND
  222.      (ny2>=1) AND (ny2<=VSM^.GetYLength) AND
  223.      (ny1+1<ny2) THEN BEGIN
  224.     y2 := ny2;  y1 := ny1;
  225.     IF (y2=0) THEN Inc (y2);
  226.     IF (nx1=0) THEN Inc (nx1);
  227.     x1 := nx1;  x2 := nx1;
  228.   END;
  229. END;
  230.  
  231. PROCEDURE VertScrollBar.Show;
  232.   VAR i : INTEGER;  MouVis : BOOLEAN;
  233. BEGIN
  234.   IF (x1<>0) AND (Max<>0) THEN BEGIN
  235.     MouVis := Mouse^.Visible;
  236.     Mouse^.Hide;
  237.     VSM^.WriteChr (x1, y1, TBBCol, BTLChr);
  238.     VSM^.WriteChr (x2, y2, TBBCol, BBRChr);
  239.     FOR i := Succ (y1) TO Pred (y2) DO
  240.       VSM^.WriteChr (x1, i, BarCol, BarChr);
  241.     x := x1;  y := Succ (y1);
  242.     ChangePos (Max, Pos);
  243.     IF MouVis THEN
  244.       Mouse^.Show;
  245.   END;
  246. END;
  247.  
  248. PROCEDURE VertScrollBar.ChangePos (NMax, NPos : WORD);
  249.   VAR r : REAL;  MouVis : BOOLEAN;
  250. BEGIN
  251.   SetMaxPos (NMax, NPos);
  252.   IF Max=0 THEN Inc (Max);
  253.   IF Pos>Max THEN Pos := Max;
  254.   IF (Max<>0) AND (x1<>0) THEN BEGIN
  255.     MouVis := Mouse^.GetVisible;
  256.     Mouse^.Hide;
  257.     VSM^.WriteChr (x, y, BarCol, BarChr);
  258.     { Position Pos auf Bildschirmpos. y umrechnen: }
  259.     x := x1;
  260.     r := y1 + Pos * Pred (y2-y1) / Max;
  261.     y := y1 + Pos * Pred (y2-y1) DIV Max;
  262.     IF r>y THEN Inc (y);
  263.     VSM^.WriteChr (x, y, PosCol, PosChr);
  264.     IF MouVis THEN
  265.       Mouse^.Show;
  266.   END;
  267. END;
  268.  
  269. PROCEDURE VertScrollBar.SetScrPos (NewScrPos : BYTE);
  270. BEGIN
  271.   IF NewScrPos<Succ (y1) THEN NewScrPos := Succ (y1);
  272.   IF NewScrPos>Pred (y2) THEN NewScrPos := Pred (y2);
  273.   Pos := ((NewScrPos-y1) * Max) DIV Pred (y2-y1);
  274.   ChangePos (Max, Pos);
  275. END;
  276.  
  277. PROCEDURE VertScrollBar.CheckMouEv (Ev : EventObj);
  278. BEGIN
  279.   IF (Ev.EventType AND EvMouAll)>0 THEN BEGIN
  280.     {---------------- auf Pfeilspitzen ? -----------------}
  281.     IF (Ev.X=x2) AND (Ev.Y=y1) THEN
  282.       SetReturnCode (SBScrollUp);
  283.     IF (Ev.X=x2) AND (Ev.Y=y2) THEN
  284.       SetReturnCode (SBScrollDown);
  285.     {-------------- im Balken drinnen ? ------------------}
  286.     IF (Ev.X=x2) AND (Ev.Y>y1) AND (Ev.Y<y2) THEN BEGIN
  287.       {----- auf Pos-Zeichen ? => Direktverschiebung -----}
  288.       IF Ev.Y=GetScrPos THEN BEGIN
  289.         REPEAT
  290.           REPEAT
  291.             EvHand^.WaitForEvent (EvMouAll, Ev);
  292.           UNTIL (Ev.EventType=EvMouMove) OR (Ev.Buttons=0);
  293.           IF (Ev.Buttons>0) AND
  294.              (Ev.Y>y1) AND (Ev.Y<y2) THEN
  295.             SetScrPos (Ev.Y);
  296.         UNTIL Ev.Buttons=0;
  297.         SetReturnCode (SBGotoPos);
  298.       END ELSE BEGIN
  299.       {----------- nein, => seitenweises Blättern -------}
  300.         IF Ev.Y>y THEN
  301.           SetReturnCode (SBScrollPgDn)
  302.         ELSE
  303.           SetReturnCode (SBScrollPgUp);
  304.       END;
  305.     END;
  306.   END;
  307. END;
  308.  
  309. FUNCTION VertScrollBar.GetScrPos : BYTE;
  310. BEGIN
  311.   GetScrPos := y;
  312. END;
  313.  
  314. (* ───────────────────────────────────────────────────── *)
  315. (*           Implementation von HorizScrollBar           *)
  316. (* ───────────────────────────────────────────────────── *)
  317. CONSTRUCTOR HorizScrollBar.Init (NewVSM : ExtVSMPtr);
  318. BEGIN
  319.   IF ScrollBarObj.Init (NewVSM) THEN BEGIN
  320.     BTLChr := Chr (27);  BBRChr := Chr (26);
  321.   END ELSE
  322.     Fail
  323. END;
  324.  
  325. PROCEDURE HorizScrollBar.SetXY (nx1, ny1, nx2, ny2 : BYTE);
  326. BEGIN
  327.   IF (ny1=ny2) AND (ny1>=1) AND (ny1<=VSM^.GetYLength) AND
  328.      (nx2>0) AND (nx2<=VSM^.GetXLength) AND
  329.      (nx1+1<nx2) THEN BEGIN
  330.     x2 := nx2; x1 := nx1;
  331.     IF (x2=0) THEN Inc (x2);
  332.     IF (ny1=0) THEN Inc (ny1);
  333.     y1 := ny1; y2 := ny1;
  334.   END;
  335. END;
  336.  
  337. PROCEDURE HorizScrollBar.Show;
  338.   VAR i : INTEGER;  MouVis : BOOLEAN;
  339. BEGIN
  340.   IF (x1<>0) AND (Max<>0) THEN BEGIN
  341.     MouVis := Mouse^.GetVisible;
  342.     Mouse^.Hide;
  343.     VSM^.WriteChr (x1, y1, TBBCol, BTLChr);
  344.     VSM^.WriteChr (x2, y2, TBBCol, BBRChr);
  345.     FOR i := Succ (x1) TO Pred (x2) DO
  346.       VSM^.WriteChr (i, y1, BarCol, BarChr);
  347.     x := Succ (x1);  y := y1;
  348.     ChangePos (Max, Pos);
  349.     IF MouVis THEN
  350.       Mouse^.Show;
  351.   END;
  352. END;
  353.  
  354. PROCEDURE HorizScrollBar.ChangePos (NMax, NPos : WORD);
  355.   VAR r : REAL;  MouVis : BOOLEAN;
  356. BEGIN
  357.   SetMaxPos (NMax, NPos);
  358.   IF Max=0 THEN Inc (Max);
  359.   IF Pos>Max THEN Pos := Max;
  360.   IF (Max<>0) AND (x1<>0) THEN BEGIN
  361.     MouVis := Mouse^.GetVisible;
  362.     Mouse^.Hide;
  363.     VSM^.WriteChr (x, y, BarCol, BarChr);
  364.     { Position Pos auf Bildschirmpos. x umrechnen: }
  365.     r := x1 + Pos * Pred (x2-x1) / Max;
  366.     x := x1 + Pos * Pred (x2-x1) DIV Max;
  367.     IF r>x THEN Inc (x);
  368.     y := y1;
  369.     VSM^.WriteChr (x, y, PosCol, PosChr);
  370.     IF MouVis THEN
  371.       Mouse^.Show;
  372.   END;
  373. END;
  374.  
  375. PROCEDURE HorizScrollBar.SetScrPos (NewScrPos : BYTE);
  376. BEGIN
  377.   IF NewScrPos<Succ (x1) THEN NewScrPos := Succ (x1);
  378.   IF NewScrPos>Pred (x2) THEN NewScrPos := Pred (x2);
  379.   Pos := ((NewScrPos-x1) * Max) DIV Pred (x2-x1);
  380.   ChangePos (Max, Pos);
  381. END;
  382.  
  383. PROCEDURE HorizScrollBar.CheckMouEv (Ev : EventObj);
  384. BEGIN
  385.   IF (Ev.EventType AND EvMouAll)>0 THEN BEGIN
  386.     {---------------- auf Pfeilspitzen ? -----------------}
  387.     IF (Ev.Y=y2) AND (Ev.X=x1) THEN
  388.       SetReturnCode (SBScrollUp);
  389.     IF (Ev.Y=y2) AND (Ev.X=x2) THEN
  390.       SetReturnCode (SBScrollDown);
  391.     {-------------- im Balken drinnen ? ------------------}
  392.     IF (Ev.Y=y2) AND (Ev.X>x1) AND (Ev.X<x2) THEN BEGIN
  393.       {----- auf Pos-Zeichen ? => Direktverschiebung -----}
  394.       IF Ev.X=GetScrPos THEN BEGIN
  395.         REPEAT
  396.           REPEAT
  397.             EvHand^.WaitForEvent (EvMouAll, Ev);
  398.           UNTIL (Ev.EventType=EvMouMove) OR (Ev.Buttons=0);
  399.           IF (Ev.Buttons>0) AND
  400.              (Ev.X>x1) AND (Ev.X<x2) THEN
  401.             SetScrPos (Ev.X);
  402.         UNTIL Ev.Buttons=0;
  403.         SetReturnCode (SBGotoPos);
  404.       END ELSE BEGIN
  405.       {----------- nein, => seitenweises Blättern -------}
  406.         IF Ev.X>x THEN
  407.           SetReturnCode (SBScrollPgDn)
  408.         ELSE
  409.           SetReturnCode (SBScrollPgUp);
  410.       END;
  411.     END;
  412.   END;
  413. END;
  414.  
  415. FUNCTION HorizScrollBar.GetScrPos : BYTE;
  416. BEGIN
  417.   GetScrPos := x;
  418. END;
  419.  
  420. END.
  421. (* ----------------------------------------------------- *)
  422. (*                   Ende von SB.PAS                     *)
  423. (* ----------------------------------------------------- *)
  424.