home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* WINDOW.INC *)
- (* *)
- (* erweitert die Fähigkeiten der Window-Toolbox aus *)
- (* PASCAL 8/87 um die Möglichkeiten, Fenster zu *)
- (* verschieben und Pop-Up-Menüs zu erstellen. *)
- (* <C> 1988 by R.Merker & PASCAL International *)
- (* ------------------------------------------------------ *)
-
- FUNCTION ScrollLock : BOOLEAN;
- (* TRUE, wenn Scroll Lock aktiv *)
- VAR Regs : Regs8088_;
-
- BEGIN
- WITH Regs DO BEGIN
- AH := $02; Intr($16, Regs);
- ScrollLock := AL AND $10 <> 0;
- END;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE ReadChar(x, y : BYTE;
- VAR Zeichen, Attribut : BYTE);
- (* liest Zeichen+Attribut an der Stelle x,y *)
- (* aus dem Bildschirmspeicher *)
- VAR Regs : Regs8088_;
-
- BEGIN
- WITH Regs DO BEGIN
- AH := 2; BH := Mem[$40:$62];
- DH := Pred(y); DL := Pred(x);
- END;
- Intr($10, Regs);
- WITH Regs DO BEGIN
- AH := 8; BH := Mem[$40:$62];
- END;
- Intr($10, Regs);
- WITH Regs DO BEGIN
- Zeichen := AL; Attribut := AH;
- END;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE WriteChar(x, y : BYTE; Zeichen, Attribut : BYTE);
- (* schreibt Zeichen + Attribut an der Stelle x,y *)
- (* in den Bildschirmspeicher *)
- VAR Regs : Regs8088_;
- BEGIN
- WITH Regs DO BEGIN
- AH := 2; BH := Mem[$40:$62];
- DH := Pred(y); DL := Pred(x);
- END;
- Intr($10, Regs);
- WITH Regs DO BEGIN
- AH := 9; AL := Zeichen;
- BH := Mem[$40:$62]; BL := Attribut; CX := 1;
- END;
- Intr($10, Regs);
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE MvWindow (x_diff, y_diff : INTEGER);
- (* bewegt aktuelles Fenster in X-Richtung um X_Diff, *)
- (* in Y-Richtung um Y_Diff *)
- VAR Zeichen, Attribut : ARRAY [1..80,1..25] OF BYTE;
- Regs : Regs8088_;
- Old_x, Old_y : INTEGER;
- i, j : BYTE;
-
- BEGIN
- Where_Cursor(Old_x, Old_y);
- Window(1, 1, 80, 25);
- WITH Win DO BEGIN
- (* Fensterinhalt und Rahmen retten *)
- (* (Zeichen und Attribute) *)
- FOR i := Pred(Dim.x1) TO Succ(Dim.x2) DO
- FOR j := Pred(Dim.y1) TO Succ(Dim.y2) DO
- ReadChar(i,j,Zeichen[i,j],Attribut[i,j]);
- (* alter Bildinhalt zurück *)
- IF ScreenMode = 7 THEN
- MonoBuffer := Keller[Tiefe]^.Bild
- ELSE
- ColorBuffer := Keller[Tiefe]^.Bild;
- FOR i:=Pred(Dim.x1) TO Succ(Dim.x2) DO
- (* Fenster verschieben *)
- FOR j:=Pred(Dim.y1) TO Succ(Dim.y2) DO
- WriteChar(i+x_diff, j+y_diff, Zeichen[i,j],
- Attribut[i,j]);
- (* Koordinaten verschieben: *)
- Dim.x1 := Dim.x1 + x_diff;
- Dim.y1 := Dim.y1 + y_diff;
- Dim.x2 := Dim.x2 + x_diff;
- Dim.y2 := Dim.y2 + y_diff;
- Window(Dim.x1, Dim.y1, Dim.x2, Dim.y2);
- Regs.AH := 2; Regs.BH := Mem[$40:$62];
- Regs.DL := Pred(Old_x + x_diff);
- Regs.DH := Pred(Old_y + y_diff);
- Intr($10, Regs);
- END ;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE MoveWindow;
- (* bewegt aktuelles Fenster durch Cursortasten, *)
- (* solange Scroll Lock aktiv *)
- VAR ch : CHAR;
-
- BEGIN
- WHILE ScrollLock DO
- IF KeyPressed THEN BEGIN
- Read(Kbd,ch);
- IF (ch = #27) AND KeyPressed THEN BEGIN
- Read(Kbd, ch);
- WITH Win.Dim DO
- CASE ch OF
- (* Links-Pfeil: *)
- #75 : IF (x1 > 2) THEN MvWindow(-1,0)
- ELSE Write(#7);
- (* Rechts-Pfeil: *)
- #77 : IF (x2 < 79) THEN MvWindow(1,0)
- ELSE Write(#7);
- (* Oben-Pfeil: *)
- #72 : IF (y1 > 2) THEN MvWindow(0,-1)
- ELSE Write(#7);
- (* Unten-Pfeil: *)
- #80 : IF (y2 < 24) THEN MvWindow(0,1)
- ELSE Write(#7);
- ELSE Write(#7);
- END { Case };
- END { If }
- ELSE Write(#7);
- END { If };
- END;
- (* ------------------------------------------------------ *)
- FUNCTION FlipMenue (x, y: INTEGER; Str: t_Str255): INTEGER;
- (* zeigt ein Menü an der Stelle x,y, die einzelnen *)
- (* Position werden durch "_" getrennt. *)
- (* Breite des Menüs wird errechnet. *)
-
- VAR i, Breite,
- Ausgewaehlt, Anzahl : INTEGER;
- Auswahl : ARRAY[1..24] OF STRING[70];
- Kontrolle, Antwort : CHAR;
- LeerStr : STRING[70];
- Line : t_Str80;
- Old_x, Old_y : BYTE;
- Regs : Regs8088_;
-
- BEGIN
- WITH Regs DO BEGIN (* Cursorposition retten *)
- AH := 3; BH := Mem[$40:$62];
- END;
- Intr($10, Regs);
- WITH Regs DO BEGIN
- Old_x := DL; Old_y := DH;
- END; (* Hilfszeile anzeigen *)
- Line := #24 + #25 + ' bewegen Balken ' + #17 +
- #217 + ' wählt aus SCROLL LOCK+' +
- #24#25#26#27 + ' bewegen Fenster';
- FOR i:=1 TO 80 DO
- WriteChar(i,25,Ord(Line[i]),15);
- WITH Regs DO BEGIN (* an alte Cursorposition zurück *)
- AH := 2; BH := Mem[$40:$62];
- DL := Old_x; DH := Old_y;
- END;
- Intr($10, Regs); (* übergebenen String in einzelne *)
- (* Strings an den mit "_" *)
- Breite := 1; (* markierten Stellen auftrennen *)
- Anzahl := 1;
- WHILE Pos('_',Str) <> 0 DO BEGIN
- Auswahl[Anzahl] := Copy(Str, 1, Pos('_',Str) - 1);
- Delete(Str, 1, Pos('_',Str));
- IF Length(Auswahl[Anzahl]) > Breite THEN
- Breite := Length(Auswahl[Anzahl]);
- Anzahl := Succ(Anzahl);
- END;
- Breite := Succ(Breite);
- (* alle Strings sollen gleiche Länge haben *)
- Anzahl := Pred(Anzahl);
- FillChar(LeerStr, Succ(Breite),' ');
- FillChar(LeerStr, 1, Chr(Breite));
- FOR Ausgewaehlt := 1 TO Anzahl DO
- IF Length(Auswahl[Ausgewaehlt]) < Breite THEN
- Auswahl[Ausgewaehlt] := Auswahl[Ausgewaehlt] +
- Copy(LeerStr, 1, Breite -
- Length(Auswahl[Ausgewaehlt]) - 1);
- MkWindow(x, y, x + Breite, y + Anzahl + 2, 2, White,
- Black,Black); (* Fenster öffnen *)
- FOR Ausgewaehlt := 1 TO Anzahl DO BEGIN
- (* Menüpunkte anzeigen *)
- GotoXY(1, Ausgewaehlt);
- Write(Auswahl[Ausgewaehlt]);
- END;
- Ausgewaehlt := 1; (* ersten Menüpunkt invertieren *)
- GotoXY(1,1); TextColor(0);
- TextBackground(15); Write(Auswahl[1]);
- GotoXY(1,1);
- Antwort := #0;
- REPEAT
- IF ScrollLock THEN MoveWindow;
- IF KeyPressed THEN BEGIN
- Read(Kbd, Antwort);
- IF Antwort = #27 THEN (* Cursortaste ? *)
- IF KeyPressed THEN BEGIN
- Read(Kbd, Kontrolle);
- GotoXY(1, Ausgewaehlt);
- (* Menüpunkt normal anzeigen *)
- TextColor(15); TextBackground(0);
- Write(Auswahl[Ausgewaehlt]);
- CASE Kontrolle OF
-
- #80 : IF Ausgewaehlt < Anzahl THEN
- Ausgewaehlt := Succ(Ausgewaehlt)
- ELSE
- Ausgewaehlt := 1;
- #72 : IF Ausgewaehlt > 1 THEN
- Ausgewaehlt:=Pred(Ausgewaehlt)
- ELSE
- Ausgewaehlt:=Anzahl;
- ELSE Write(#7);
- END;
- GotoXY(1, Ausgewaehlt);
- (* nächsten Menüpunkt invertieren *)
- TextColor(0); TextBackground(15);
- Write(Auswahl[Ausgewaehlt]);
- GotoXY(1, Ausgewaehlt); END
- ELSE
- Write(#7)
- ELSE
- IF Antwort <> #13 THEN Write(#7);
- END;
- UNTIL Antwort = #13;
- RmWindow;
- TextColor(15); TextBackground(0);
- FlipMenue := Ausgewaehlt;
- END;
- (* ------------------------------------------------------ *)
- (* Ende von WINDOW.INC *)