Pascal-Toolbox Nr. 5
Abschaltung des Cursors (DOS)
Diesmal beschäftigen wir uns mit der Abschaltung des Cursors
während des Programmablaufes. So können meist unschöne Effekte vermieden werden,
welche sonst das Gesamtbild eines Programmes wenig professionell erscheinen lassen.
Zuerst der Unit-Kopf: Wie haben eine öffentliche Variable,
CursorShape, welche später das Erscheinungsbild des Cursors enthält, und wir haben
drei öffentliche Prozeduren, GetCursorShape (zum Sichern der Cursordaten),
CursorOn (zum Anschalten des Cursors) und CursorOff (zum Ausschalten des
Cursors).
UNIT Cursor;
INTERFACE
VAR CursorShape:Word;
PROCEDURE GetCursorShape;
PROCEDURE CursorOn;
PROCEDURE CursorOff;
IMPLEMENTATION
USES Dos;
Damit wir später den Original-Cursor wiederherstellen
können, müssen wir zuerst seine Daten abrufen und sichern. Die folgende Prozedur tut
dies. Benutzt wird hierzu die Funktion $3 des Interrupts $10
(Video-BIOS), welche sowohl die aktuelle Cursorposition (brauchen wir hier nicht...) als auch
die Startzeile (in CH) und Enzeile (in CL) des Cursors zurückliefert. Folglich legt die
Funktion den Wert von CX in CursorShape ab (CH und CL bilden zusammen CX).
PROCEDURE GetCursorShape;
VAR Regs:Registers;
BEGIN
Regs.AH:=3;
Regs.BH:=0;
Intr($10,Regs);
CursorShape:=Regs.CX;
END;
Um nun den Cursor anzuschalten, wird einfach die Funktion $1 des
Interruptes $10 bemüht, welche im Register CX die (oben ermittelten) Cursordaten aus
CursorShape erwartet (die Funktion ist zuständig für die
Cursor-Größe).
PROCEDURE CursorOn;
VAR Regs:Registers;
BEGIN
Regs.AH:=1;
Regs.CX:=CursorShape;
Intr($10,Regs);
END;
Ähnlich verfahren wir, um den Cursor abzuschalten. Nur
übergeben wir hier als Cursor $100 ins CX-Register. Dieser Wert ergibt sich wie folgt:
Schlüsselt man das CX-Register in Low- und Highbyte auf, so erhält man CL=0 und CH=1. Die
Startzeile (CH) beginnt also nach der Endzeile (CL) und es wird folglich kein Cursor dargestellt.
Warum nehmen wir also nicht einfach den Wert Null? Ganz einfach: Null würde bedeuten,
daß Startzeile und Endzeile identisch und Null sind. Folglich würde ein dünner
Cursorstrich bei Index Null erscheinen.
PROCEDURE CursorOff;
VAR Regs:Registers;
BEGIN
Regs.AH:=1;
Regs.CX:=$100;
Intr($10,Regs);
END;
END.
Angewandt wird die Unit wie folgt:
PROGRAM Test;
USES CRT,Cursor;
{...}
BEGIN
{...Programmstart, Cursor sichern!...}
GetCursorShape;
{...Programm...}
CursorOff;
{...Cursor-freier Bereich...}
CursorOn;
{...Cursor wieder an...}
END.
Die fertige Unit (ca. 1 KB) könnt Ihr hier downloaden.
Alle Angaben ohne Gewähr. |