| ★ APPLICATIONS ★ BUREAUTIQUE ★ MAGATEXT (SCHNEIDER MAGAZIN/COMPUTER PARTNER) ★ |
Textverarbeitungsprogramm mit Durchblick (Teil 1)![]() | Magatext, Teil 2![]() | Texteingabe![]() | Magatext (Teil 4)![]() | Es ist geschafft (Teil 5)![]() |
Im dritten Teil der Serie zum Programmieren einer Textverarbeitung kommen wir zum wichtigsten Teil eines solchen Programms Diesmal kommen wir zum eigentlichen Kernstück jedes Textverarbeitungsprogramms, zur Eingabe von Texten mit den verschiedenen Korrekturmöglichkeiten. Dabei sollen, anders als bisher, die Erklärungen nach den Zeilennummern des Listings erfolgen. Noch im Hauptmenü werden die Windows mit den Nummern 0 bis 3 gelöscht, und die gewählte Funktion erscheint in inverser Schrift. Wenn der erste Punkt des Hauptmenüs gewählt wurde, erfolgt ein Sprung zur Zeile 420. Die Variable endzeile enthält die Nummer der momentan letzten Zeile des jeweiligen Textes. Dadurch läßt sich beim Speichern auf Cassette oder Diskette viel Platz sparen, indem nur die Zeilen abgelegt werden, in denen auch tatsächlich etwas steht. Bei vielen anderen Operationen bedeutet dieses Vorgehen einen Zeitgewinn. Die erwähnte Variable wird in Zeile 420 auf den Wert der letzten möglichen Zeilennummer gesetzt. Diese etwas umständlich anmutende Methode ist erforderlich, da wir ja in der Variablen maxzeile einen Wert haben, den der Benutzer seinen Wünschen anpassen kann; das Programm muß auch in einem solchen Fall mit dem richtigen Wert arbeiten. In den Zeilen 430 und 440 erscheint die Bitte um etwas Geduld, bis der Speicher vorbereitet ist. Bei den von uns gewählten Integer-Werten dauert dies ca. 12 Sekunden. Wenn Sie hingegen Zeile 70 mit dem DEFINT- Befehl löschen und damit Real-Werte veranlassen, verdoppelt sich diese Wartezeit sofort! Nun erfolgt der Aufruf eines Unterprogramms ab Zeile 2030. Es handelt sich hier um den letzten Teil des Punktes Text löschen, den wir erst in der nächsten Folge vervollständigen wollen. Hier werden alle Werte im Feld text auf 32 gesetzt. Dies ist das Leerzeichen. Ich habe es absichtlich gewählt, denn auf diese Weise erscheint bei der Inversdarstellung ein leeres schwarzes Viereck als Cursor. Es ist sehr markant und läßt sich auf dem Bildschirm gut verfolgen. Zeile 520 ruft ein Unterprogramm ab Zeile 3800 auf. Dort erfolgt die Eingabe eines Dateinamens. Umfaßt dieser mehr als 8 Zeichen, werden die überzähligen Buchstaben abgeschnitten. Dies veranlaßt Zeile 3830. Auf eine Prüfung auf unerlaubte Zeichen im Dateinamen wurde aus Platzgründen verzichtet. Bei Bedarf läßt sie sich aber einfügen. Enthält der Name einen Punkt, gibt Zeile 3840 einen Hinweis und springt zur Namenseingabe zurück. In 3850 erfolgt die Umwandlung in Großbuchstaben sowie das Anhängen der Extension .MTX an die vorgegebene Bezeichnung. Dadurch sind ”Maga-text”-Dateien klar und schnell erkennbar. In Zeile 530 wird der in Teil 1 besprochene Schalter vorhanden verändert, denn jetzt ist ja ein Dateiname vergeben und z.B. ein Abspeichern möglich. Zeile 540 verzweigt in die Ausgabe der Statuszeile und der Statusausgaben, die wir bereits aus Teil 2 kennen. In den Zeilen 550bis 580 wird die Belegung der Tasten mit Funktionen angezeigt. Der Benutzer kann somit jederzeit nach-lesen, was sich wie erreichen läßt. In den Zeilen von 590 bis 620 erfolgt die Inversdarstellung des Zeichens, das an dieser Stelle im Speicher als Integer-Wert abgelegt wurde. Diese Art der Wiedergabe bringt das Zeichen in weißer Schrift in einem deutlich sichtbaren schwarzen Viereck auf den Schirm. Dadurch entsteht automatisch ein gut erkennbarer Cursor, der dem Benutzer zeigt, wo er sich gerade befindet. Dies erleichtert auch die Entscheidung, welche Funktion als nächste gewählt werden muß. In den nächsten drei Zeilen folgt eine Warteschleife, die abgebrochen wird, sobald man irgendeine Taste drückt. Da die Tastatur bei den CPCs 300mal pro Sekunde abgefragt wird, ist es praktisch unmöglich, in eine Pause zu geraten. Nach Feststellung eines Tastendrucks wird der Wert der betreffenden Taste in den ihr zugeordneten ASCI1-Code umgewandelt. Damit ist die Grundlage für die weitere Bearbeitung geschaffen. Die nächsten beiden Zeilen verzweigen in spezielle Auswertungsroutinen, falls der zurückgemeldete Wert größer als 126 oder kleiner als 32 war. Dazwischen liegen die Buchstaben, Ziffern und anderen Zeichen. Diese werden mit ihrem ASCII-Wert an der entsprechenden Stelle in den Speicher eingetragen. Zeile 690 ruft ein immer wieder benutztes Unterprogramm ab Zeile 3660 auf. Dort erfolgt lediglich die Ausgabe des Zeichens an der richtigen Bildschirmposition. Die Zeilen 700 und 710 enthalten eine Wertzuordnung und einen Aufruf, der später erklärt werden soll. In Zeile 720 geschieht der Rücksprung zur Zeile 590. Das bedeutet, daß das nächste Zeichen erwartet wird, um die gleiche Behandlung zu erfahren. Hier entsteht eine geschlossene Schleife, die eine schnelle Texteingabe ermöglicht. Abschluß und Ausstieg sind lediglich durch die dafür vorgesehene COPY-Taste programmiert. Im Teil zwischen den Zeilen 740 und 830 werden ja nach ASCII-Wert der gedrückten Taste verschiedene Unterprogramme aufgerufen. Bei Bewegungen erhält vorher die schon erwähnte Variable Versatz die Zahl, um die der Cursor in die gewünschte Richtung rücken soll. Normale Pfeiltasten belegen hier jeweils den Wert 1. Wurde zusätzlich eine der beiden SHIFT-Tasten gedrückt, ändert sich dieser Wert auf 10. Dann wird das Zeichen an dieser Stelle ausgegeben. Anschließend erfolgt der Rücksprung zum Schließen der Schleife. In Zeile 840 beendet die COPY-Taste mit dem Rückmeldecode 224 die Texteingabe und bringt uns ins Hauptmenü zurück. Zeile 850 dient dazu, bei unerlaubten Tasten einen Piepston zu produzieren. Ansonsten wird eine unkorrekte Eingabe nicht beachtet, um das Programm gegen Fehlbedienungen abzusichern. Auch der Teil für die übrigen Sondertasten von Zeile 870 bis Zeile 930 ist analog aufgebaut. Es werden lediglich die übrigen Funktionen ausgelöst und aufgerufen. Ab Zeile 950 folgt dann eine ganze Reihe von Unterprogrammen. Die Subroutine Zeile!Abschnitt hoch dient dem Hochfahren des Cursors in Einer- oder Zehner-Schritten. Hierzu wird textzeile um den entsprechenden versatz erniedrigt. Es folgt eine Prüfung, ob der neue Variablenwert kleiner als l ist, damit sich der Cursor nicht nach oben aus dem Text herausführen läßt. Das würde die Entstehung unerlaubter Werte und einen Programmabbruch bedingen. Danach wird auch zeile um den Wert von versatz verkleinert. Nun erfolgt wiederum eine Prüfung. Aber zeile kann ja kleiner werden als 1; dann müssen wir nur die Variable abschnitt ebenfalls um 1 vermindern, damit beim anschließenden Neuaufbau des Textbildschirms der neue Teil sichtbar wird. Dieser Neuaufbau geschieht durch das Unterprogramm ab Zeile 3540. Analog erstellt ist das Unterprogramm Zeilel Abschnitt tief. Hier wird jedoch noch zusätzlich der Wert von endzeile erhöht, falls sich der Text durch die neuen Eingaben gegenüber dem bisherigen Umfang verlängert. Dadurch zeigt diese Variable immer auf die letzte Zeile. Der Grund dafür wurde bereits erklärt. Spalte/n links bewegt den Cursor innerhalb der Zeile nach links. Falls der Wert von spalte kleiner als 1 wird, löst dies automatisch einen Aufruf der Funktion Zeile!Abschnitt hoch aus. Daneben wird zu spalte der Wert von maxspalte addiert. Dadurch bleibt dieser innerhalb der erlaubten Grenzen. Spalte/n rechts funktioniert analog. In Zeile 1200 erklingt aber ein Ton, sobald das achte Zeichen von hinten erreicht wird. Dies läßt sich mit der Klingel bei einer konventionellen Schreibmaschine vergleichen. Ab jetzt muß man auf das Ende der Zeile und eine eventuell erforderliche Trennung achten. DEL-Taste löscht das Zeichen, das links neben dem Cursor steht. Aus diesem Grund darf hier spalte nicht den Wert 1 enthalten; in diesem Fall wird die gewünschte Aktion mit einem Piepston abgelehnt, und es erfolgt ein direkter Rücksprung. Ansonsten kommt das Löschen der Stelle neben dem Cursor. Anschließend wird der Rest der Zeile bis maxspalte in einer FOR-NEXT-Schleife Zeichen für Zeichen um eines nach links verschoben und dort ausgegeben. Dann erhält die rechts außen stehende Spalte den Wert 32 für das Leerzeichen. Je nach Stellung des Cursors innerhalb der Zeile dauert die Bearbeitung unterschiedlich lange; je weiter rechts, desto schneller geht sie vonstatten. TAB = Leerzeichen einfuegen heißt die nächste Funktion, die im folgenden Unterprogramm bewerkstelligt wird. In meiner Version dient die TAB-Taste dazu, um bei Bedarf ein Leerzeichen an der Cursor-Position einzufügen. So ist es möglich, eventuell vergessene Buchstaben oder Ziffern nachträglich noch einzuschieben. Wer eine andere Zuordnung haben möchte, muß lediglich den ASCII-Wert bei der Verzweigung in den gewünschten ändern. Der Aufbau der Subroutine erfolgte analog zur DEL-Taste. Allerdings muß die Schleife diesmal rückwärts zählen, was wir durch STEP-1 erreichen. Bitte beachten Sie, daß am rechten Rand herausfallende Zeichen verschwinden und nicht in die nächste Zeile übernommen werden. Auf diesen Nachteil bei der Einrichtung des Textspeichers als zweidimensionales Integer-Feld habe ich schon in Teil 2 hingewiesen. Es ist durchaus ein Ausbau möglich, der hier Abhilfe schafft. Er reduziert jedoch die Verarbeitungsgeschwindigkeit des gesamten Programms erheblich. Zeile einfuegen arbeitet mit einer CTRL-Tastenkombination. Hier habe ich eine Anleihe bei der Befehlssteuerung gemacht. In diesem Unterprogramm werden die unteren Zeilen mittels einer doppelt geschachtelten Schleife weitergerückt. Auch endzeile erfährt eine Anpassung an den neuen Wert. Zeile loeschen funktioniert wiederum analog. Die Doppelschleife zieht den Text aber nach oben. Die letzte Zeile wird mit Leerzeichen aufgefüllt. Im Unterprogramm Zeile hochziehen in den Zeilen von 3890 bis 3950 erfolgt eine Prüfung, ob in der derzeitigen Endzeile überhaupt irgendein Zeichen steht. Dazu wird anfangs die Schaltervariable belegt ausgestellt. Tn einer Schleife wird jedes Zeichen der gerade bearbeiteten Zeile mit dem Ausgangswert 32 verglichen. Bei fehlender Übereinstimmung geht der Schalter belegt auf 1. Steht er am Ende der Überprüfungen noch auf 0, so steht fest, daß sich in dieser Zeile kein Buchstabe oder ein anderes Zeichen befindet. Somit ist es möglich, sie zu streichen; endzeile wird dann um 1 erniedrigt. Anschließend kommt es zur Überprüfung der davorstehenden Reihe. Sobald eine Belegung innerhalb der letzten Zeile entdeckt wird, erfolgt ein Rücksprung in den aufrufenden Programmteil. Im nächsten Heft werden wir uns dem Ändern und Löschen von Texten sowie dem Speichern und Laden zuwenden. Im letzten Teil sollen dann der Ausdruck, das Beenden des Programms und einige mögliche Ausbaustufen folgen. Berlhold Freier , Computer Partner |
| ![]() |
|