Wie man das OLW wegbekommt, IM PRINZIP, sieht man in Abb. 2 und 3.
Erstmal überschreiben wir unseren PROG Bereich wieder mit Leerzeichen (andere Funktion derzeit noch nicht verfügbar), ABB1, und man sieht, das OLW ist im linken Bereich verschwunden, d.i. überschrieben.
Dazu reichen zwei Funktionsaufrufe:
gotoprog(); // setze Cursor in den Bereich PROG, wo immer der auch sein möge
clrprog(); // überschreibe den Bereich mit Leerzeichen
Da das OLW auch noch den Bereich HELP überdeckt, muß dieser ebenfalls ge"clear"t werden:
gotohelp();
clrhelp();
Wie die Funktionen funktionieren (alles ziemlich simpel) hab ich oben schon reinkopiert.
Ergebnis vom ÜBerschreiben des HELP Bereichs zeigt Abb 2: das OLW wurde pulversiert
Gut und schön,weil, es fehlt natürlich was.
Denn mit dem CLEAR SCREENBEREICH sind natürlich auch die Daten aus den Fensterbereichen verloren.
Das ist nicht das, was wir wollen. Wir wollen natürlich an derselben Stelle weitermachen, wo wir beim Aufruf des OLW gestanden haben.
Da der Programmierer nicht zu jedem Zeitpunkt wissen kann, was der ANwender in den verfügbaren Fenster-Bereichen aufgerufen hat, und bei der Programmentwicklung auch nicht absehbar ist, wann das OLW erlaubt sein darf, oder ob vielleicht noch andere OLW dazukommen, gibt es softwaremäßig eigentlich nur eine vernünftige Lösung für das PRoblem.
WIR MÜSSEN ALLE AUSGABEN STÄNDIG IM ZWISCHENSPEICHER VORHALTEN, damit wir sie zu jedem Augenblick des PRogramms wiederherstellen können.
Das löst man ganz einfach so, daß man
NIEMALS DIREKT AUF DEN BILDSCHIRM SCHREIBT, SONDERN IN EINEN BUFFER (ZWISCHENSPEICHER)
statt also:
FALL A
1. gotoxy(zeile, spalte)
2. gib irgendwas auf den Bildschirm
muß es heißen:
FALL B
1. Nimm eine Information
2. Schreibe sie in den Zwischenspeicher
Im Fall B ist dann von der Info am Bildschirm noch nichts zu sehen. Sondern wir füllen erst den Buffer mit Infos, und wenn wir fertig sind sagen wir:
3. Schreibe Buffer auf den Bildschirm (automatisch in den dafür vorgesehenen Bereich)
Das klingt etwas umständlich, ist es aber gar nicht.
Der Vorteil, wenn wir Infos stets zwischenspeichern, ist z. B., daß wir diese auch jederzeit in eine Datei speichern und ausdrucken können.
Hier allerdings ist es erstmal angedacht, um den Bildschirminhalt jederzeit wiederherstellen zu können.
Ob es sich dabei um eine grafische Oberfläche handelt mit Pixeln oder eine Textausgabe, ist dabei wurst.
Wir haben eine
Matrix von:
z1 =sssssssssssssssssssssssssssssssssssssssssssssssssssssssss
z2=sssssssssssssssssssssssssssssssssssssssssssssssssssssssss
z3=sssssssssssssssssssssssssssssssssssssssssssssssssssssssss
...
zn=sssssssssssssssssssssssssssssssssssssssssssssssssssssssss
n Spalten und Zeilen, also eine zweidimensionale Tabelle.
Das Problem ist eher, daß wir nicht wissen, von welchem Datentyp.
C ist ja geradezu extrem typenbezogen.
Eine Funktion zu schreiben, die verschiedene Datentypen behandeln kann, nennt man ÜBERLADEN.
OVERLOAD
Man benutzt sie so, daß die Funktion impliizit den Datentypen erkennt und danach handelt.
Mag ja gut sein und modern, ist mir aber zu modern und ich rieche bei solchen Konstrukten immer INSTABILITÄTEN. Sobald da der kleinste Fehler drin ist, spielt das Programm Mickeymouse.
BLeibt die Frage, wie wir an eine einzige Funktion z., B. solche häufigen Datentypen wie float, integer, char, stringarrays etc. etc. übergeben können.
Die Anwort ist ganz einfach:
Wir übergeben sie im Textformat, weil ja die Ausgabe auch im Textformat erfolgt.
Für das Umwandeln belieber Datentypen in formatierter Form bietet C die hervorragende Funktion sprintf()
char info[255];
(float) f= -136.1 sprintf(info,"%10.2f",f) ergibt einen Zeichenstring der Form: " -136.10"
(int) i= 4711 sprintf(info,"%8i",i) ergibt " 4711"
(char) c='#" sprintf(info,"%c",c) ergibt "#", wobei "#" nicht gleich '#' ist, das eine ist ein char, das andere ein String
Um stringarrays in stringarrays umzukopieren:
(char) text[50]="HALLO";
sprintf(info,"%20s",text) ergibt einen rechtsbündigen String etwa " HALLO";
linksbündig:
sprintf(info,"%-20s",text) ergibt "HALLO "
Vorzeichen erzwingen:
für f= 5.1 (vielleicht Prozent)
sprintf(info,"%+10.1f",f) kommt heraus: " +5.1";
Und so weiter.
Sprintf() ermöglicht uns, jeden Datentyp in formatierter Form als Textstring darzustellen (nichts anderes ist ja Drucker- und Bildschirmausgabe) und bietet alles, was das Herz braucht.
Die Funktion, die nun den Buffer für den Fensterbereich verwaltet, muß folgendes leisten:
1.) Prüfen, ob der WUnsch des AUfrufers realisierbar ist oder zu Fehlern führt, Länge der Nachricht, Position, Breite des Fensters etc. etc.
2.) Wenn ok, dann den Wert dort unterbringen, in Zeile und Spalte, wie gewünscht
3.) Die Daten auf dem Bildschirmbereich ausgeben, für den der Buffer zuständig ist.
Die Größe eines solchen Buffers muß mindestens der Größe (Zeilen/Spalten) des Fensterbereichs entsprechen. Es liegt aber ja auf der Hand, daß man besser viel mehr Kapazität wählt, mit dem Vorteil, daß man dann den Buffer in dem Fenster nach oben und unten scrollen kann.
Also sagen wir mal: für einen Bildschirmbereich von 80 Spalten 20 Zeilen könnten wir einen Buffer vorsehen, der 80 Spalten und 200 Zeilen aufnimmt, und hätten dann zum Scrollen und Blättern 10 Seiten zur Verfügung. Oder 100. Je nachdem, wie man es braucht.
Das wäre dann die nächste allgemeine Routine, die zu schreiben wäre.
Bisher noch keine einzige Programmzeile, alles nur Vorbereitung.
Alles kommt zu dem, der warten kann (lao tse).
Angehängte Datei(en)
olw2.jpg ( 63.94KB )
Anzahl der Downloads: 16
olw3.jpg ( 60.57KB )
Anzahl der Downloads: 13