Home Programmierung
und BIOS
Shareware-
FAQ
Links Suche Kontakt u.
Infos

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.

Achtung: bitte Hinweise zur Aktualitšt der Daten beachten! Copyright by Mathias Harbeck