	PASCAL Programmierkurs Teil 3

In den letzten beiden Kursteilen ging es um die Grundlagen, die ich 
brauche, um berhaupt Programme auf dem Portfolio schreiben zu 
knnen. In diesem Teil soll es nun um die Praxis gehen.

Bevor wir aber etwas Handfestes anfangen, will ich noch ein paar 
allgemeine Sachen zur praktischen Seite der Programmierung sagen. 
Wenn ich nun anfange ein Programm zu schreiben, stehe ich vor zwei 
Problemen. Wenn ich spezielle Funktionen des Portfolio nutzen will, 
kann ich die Programme nicht unter einem normalen PC-DOS testen. Ich 
meine damit die Routinen, die vom Portfolio-AES zur Verfgung 
gestellt werden. Also wie kann ich meine Programme testen ohne sie 
jedesmal auf den Portfolio zu berspielen. Aus diesem Problem ergibt 
sich natrlich auch noch ein zweites. Da ich die Programme nicht auf 
dem PC laufen lassen kann, kann ich auch nicht die Funktionen zum 
Debugging nutzen, die mir das PASCAL zur Verfgung stellt. Ich kann 
also nicht ein Programm whrend der Laufzeit kurz unterbrechen, in 
den Editor zurckkehren und mal kurz ein paar Variableninhalte 
berprfen. Also nicht unerhebliche Probleme ... oder? Zumindest das 
erste Problem lt sich recht leicht lsen. Ich mu natrlich nicht 
die Programme erst auf den Portfolio bertragen, um sie laufen zu 
lassen. Es gibt ein paar, genau genommen drei kleine TSR-Programme, 
die sich unter einem DOS-Betriebssystem in die Interrupts hngen, bei 
denen ein Portfolioprogramm seine speziellen Routinen erwartet. 
Startet man also diese drei kleinen Helfer, kann man ganz beruhigt 
seine Portfolioprogramme auch auf dem PC los lassen. Das Problem mit 
dem Debugging ist damit aber immer noch nicht ganz behoben. Natrlich 
kann ich jetzt so verfahren, und nach den TSR-Programmen das PASCAL 
starten. Jetzt mu ich die Programme nicht mehr bersetzen und dann 
laufen lassen, sondern kann sie direkt vom PASCAL-Editor starten und 
das Programm ber Haltepunkte stoppen und meine Variablenwerte 
einsehen. Wem das gengt der ist damit natrlich bestens bedient. Nun 
leben wir aber im Zeitalter von Windows 95 und OS/2 und ich kann 
nicht einfach nur in einem Single-Task-System arbeiten. Ich zumindest 
nicht. Ich bin es seit meinem ersten Computer (ein ATARI 1040STFM ... 
was sonst ... :o) ) gewohnt, mit Fenstern und der Maus zu arbeiten. 
Auf meinem PC luft Windows 95 (Oh Gott ... ich habe mich geoutet) 
und ich will natrlich auch da weiter alle Programm parallel laufen 
lassen ohne sie jedesmal neu starten zu mssen. Prinzipiell kann ich 
allerdings auch unter Windows eine virtuelle DOS-Sitzung starten und 
die TSR-Programme und den PASCAL- Editor dort hochfahren. Es geht 
auch so, wenn auch sehr viel schwieriger.

Dann ist da noch die Frage, welches PASCAL nimmt man denn nun. Ich 
persnlich benutze PASCAL 7.0 (und dann mglichst die Oberflche 
unter Windows). Ab dieser PASCAL-Version untersttzt der Editor die 
farbliche Markierung von Schlsselwrtern, Strings und solchen 
Sachen. Ich finde so etwas sehr hilfreich, wenn man einen Quelltext 
durcharbeitet. Mein letztes Portfolioprogramm hat 1538 Zeilen und ich 
sage euch, da ist so etwas schon sehr hilfreich. Man knnte meinen, 
da ein lteres PASCAL vielleicht besser geeignet ist. Ich kann euch 
beruhigen. Die bersetzten Programme sind nicht grer oder kleiner 
als mit neueren Versionen. Natrlich gibt es Unterschiede, die 
allerdings nur dann gravierend sind, wenn ich Debug-Informationen 
oder hnliches in das bersetzte Programm einbauen lasse. Da diese 
aber in der endgltigen Version auf dem Portfolio nicht mit drin sind 
ist es also egal.

O.K. ... soweit zu unseren Werkzeugen. Dieser Kursteil soll sich ja 
mit einem konkreten Beispiel befassen. Es sieht also so aus, da ich 
euch ein Programm  vorwerfe und anhand dieses Beispiels versuche, die 
Besonderheiten zu erlutern. Das Programm ist eigentlich kein 
richtiges Programm. Ich habe lange berlegt, was man denn als 
Beispiel nehmen knnte. Es mute etwas speziell fr den Portfolio 
sein, und der Quelltext durfte auch nicht so lang werden, da ihn die 
Redaktion aus Platzgrnden nicht mit abdruckt. Unser Thema ist also, 
wir schreiben uns ein Hook-File. Ups ... was ist ein Hook-File. 
Vielleicht ist es manchen Portfolio-Usern noch nicht aufgefallen, 
aber die interne Textverarbeitung ist gar nicht so unmodern und 
statisch wie es auf den ersten Blick aussieht. Was WORD 7.0 seine 
Module und dem Netscape-Navigator seine Add-In's sind, sind fr 
Portfolio-User Hook-Files. Das Geheimnis ist, ich kann vom Texteditor 
kleine Programme nachladen, die dann irgendwas mit meinem Text 
anstellen knnen. Hook-Files mssen immer im Root-Verzeichnis von 
Laufwerk A liegen, und die Dateiendung .HOO haben. Aufgerufen werden 
diese netten kleinen Helfer ber die Taste F6 aus der 
Textverarbeitung heraus. Die Textverarbeitung wird dabei aber nicht 
beendet und der gerade bearbeitete Text geht verloren. Nein ... ich 
habe vielmehr ber spezielle BIOS-Funktionen, die DIP 
freundlicherweise eingebaut hat, die Mglichkeit, vom Hook-File aus 
Text einzufgen oder zu erfragen, wo der Cursor gerade steht oder auf 
welchem Zeichen der Cursor steht, ich kann den Cursor im Text 
verschieben ... und so weiter und so weiter. Ich kann also von meinem 
kleinen Hook-File aus den Text komplett bearbeiten. Man sieht also, 
ich kann wunderbar kleine Zusatzfunktionen fr die doch manchmal 
recht magere Textverarbeitung schreiben. Schreiben wir uns also so 
eine kleine Funktionserweiterung. Hook-Files sind eigentlich nichts 
anderes als normale Programme, bei denen man die Endung .EXE durch 
.HOO ersetzt hat. Hook-Files sind nur als normale Programme recht 
nutzlos, weil sie ja voraussetzen, das die Textverarbeitung im 
Hintergrund luft. Also nennt man sie anders und der Textverarbeitung 
kann so auch nicht der Fehler unterlaufen, ein nicht fr sie 
bestimmtes Programm zu starten. Das Problem ist, da diese Programme 
recht klein sein mssen. Wenn ich nur einen Standard-Portfolio mit 
128kByte RAM habe, und die Textverarbeitung hat auch noch etwas 
geladen, dann bleibt nicht mehr so viel Platz, um unsere kleinen 
Helfer unterzubringen. PASCAL ist da auf Grund der Gre, die die 
bersetzten Programme haben auch nicht die beste Sprache, um so etwas 
zu realisieren. Wir beweisen aber nun, da es doch geht.

{ diese Klammer bitte nicht mit in den Artikel ... :o) Den Quelltext 
bitte, bitte, bitte mit in der Zeitung abdrucken ... ist ja auch 
nicht so lang ... und noch ein Wunsch ... den Quelltext bitte mit 
einem nichtproportionalen Font setzen, weil sonst das Einrcken in 
dieser Weise verloren geht, und das ist nicht gerade gut, wenn man 
den Quelltext liest ... Danke ... }

------------------------ schnipp -----------------------------------

Program DatumUndUhrzeitHook; { Autor : Torsten Hler }

{$M 1024, 0, 0}

Uses PortAES, Dos; { verwendete Units }

Function Expandieren ( zahl : Word ) : String;
    Var zahlenString : String;
Begin
     Str( zahl, zahlenString );
     Expandieren := zahlenString;
     If Length( zahlenString ) < 2 Then
        Expandieren := '0' + zahlenString;
End; { Zusatzfunktion um Zahlen in Strings zu wandeln }

Procedure SendeString ( wasSenden : String );
    Var reg : Registers;
Begin
     wasSenden := wasSenden + Chr(0);
     reg.ah := $03;
     reg.al := $04;
     reg.es := Seg( wasSenden[1] );
     reg.bx := Ofs( wasSenden[1] );
     Intr( $60, reg );
End; { BIOS-Routine Int 60H Fn 03H Unterfunktin EDHO_INS }

Const wochenTage : Array [ 0 .. 6 ] Of String
                   = ( 'So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa' );

Const MenueTitel = 'Was einfgen ?';

Const MenueText = 'Datum ...       ' + Chr(0) +
                  'Uhrzeit ...     ' + Chr(0) +
                  'Beides ...      ';

Var jahr, monat, tag, wochenTag, stunden, minuten, hilf : Word;
    datum, uhrzeit : String;
    puffer : ScreenBufferType;
    auswahl : Byte;

Begin
     SaveScreen( 0, 0, 39, 7, puffer );
     GetDate( jahr, monat, tag, wochenTag );
     jahr := jahr Mod 100;
     datum := wochenTage[ wochenTag ] + ' ' +
              Expandieren( tag ) + '.' +
              Expandieren( monat ) + '.' +
              Expandieren( jahr );
     GetTime( stunden, minuten, hilf, hilf );
     uhrzeit := Expandieren( stunden ) + ':' +
                Expandieren( minuten ) + ' Uhr';
     If Menu( 1, 1, MenueTitel, MenueText, Chr(0), auswahl ) Then
        Case auswahl Of
             0 : SendeString( datum );
             1 : SendeString( uhrzeit );
             2 : SendeString( datum + ' / ' + uhrzeit );
        End;
     RestoreScreen( 0, 0, 39, 7, puffer );
End.

------------------------ schnapp -----------------------------------

Das Hook-File soll, wenn es aufgerufen wird, das aktuelle Datum oder 
die Uhrzeit oder auch beides als String in den Text einfgen. Die 
Auswahl, was eingefgt wird, geschieht ber eines der blichen 
Portfolio-Mens.

Gehen wir nun den Quelltext langsam durch ...
Wie schon im ersten Teil des Kurses erwhnt, mu ich den 
Speicherbedarf des Programms so gering wie mglich halten. Das 
bedeutet, da ich mir nur soviel Speicher reserviere, wie ich auch 
bentige. Die Zeile mit der {$M ... Anweisung macht den Compiler 
darauf aufmerksam, da mein Programm nur 3072 Byte fr seinen lokalen 
Stack reservieren mchte. Ich kann die Bytes fr den Stack leider 
immer nur in 1024er Schritten reservieren. Dadurch kommt diese Zahl 
zustande. 2048 Bytes fhren zu einem Stack-berlauf also reserviere 
ich 1024 mehr.

Das Programm benutzt wie schon erwhnt die Menfunktionen, die vom 
Portfolio-Bios zur Verfgung gestellt werden. Um diese Mens 
aufzurufen, benutze ich die PortAES-Unit aus dem zweiten Kursteil. 
Die DOS-Unit brauche ich, um die Prozessorregister ansprechen zu 
knnen und um das Datum und die Uhrzeit vom System erfragen zu 
knnen.

Die kleine Funktion "Expandieren" wandelt einen numerischen Wert vom 
Typ "Word" in einen String um. Wenn der Wert nur einstellig sein 
sollte, dann wird vorne noch eine Null als ASCII-Zeichen angefgt. 
Das ist ntig, wenn ich als Anzahl der Minuten nur die Ziffer 6 
bekomme, denn ansonsten wrde meine Uhrzeit ja "21:6 Uhr" lauten. Und 
das sieht wirklich nicht so schn aus. Zum Umwandeln der Zahl in 
einen String, benutzt das Programm die PASCAL-Funktion "STR". Dann 
wird geprft, ob die Lnge des Strings kleiner als zwei ist und wenn 
ja, dann wird besagte Null noch vorne angeheftet. Als Funktion 
liefert sie den sich ergebenden String direkt zurck. Weil ich diese 
Funktion mehrere Male bentige, habe ich sie in eine Funktion 
auerhalb der Hauptschleife platziert. Der PASCAL-Compiler braucht 
bei der bersetzung zwar mehr Speicher fr den Sprung in eine 
Subroutine, wenn ich diese aber wirklich fter brauche, spart es mir 
doch wieder mehr Speicherplatz, als wenn ich diese Funktion fnf mal 
in der Hauptschleife unterbringe. Man sollte wirklich aufpassen, was 
man alles in Unterprogramme steckt. Denn wenn ich die Funktion nur 
ein- oder zweimal aufrufe, kann es unter Umstnden besser sein, als 
sie zweimal im Hauptprogramm zu platzieren. Auerdem mu ich mir klar 
machen, da bei jedem Aufruf eines Unterprogrammes alle Variablen auf 
dem Stack gesichert werden mssen, damit ihr Inhalt nicht verloren 
geht. Wenn ich jetzt aus einem Unterprogramm noch ein Unterprogramm 
aufrufe, kann mein Stackbedarf zu schnell zu gro werden und mein 
Programm ist dann alles andere als klein. Wer Lust hat, kann das 
Programm ja mal so umschreiben, da keine Unterprogramme ntig sind 
und alles im Hauptprogramm steht. Das bersetzte Programm kann 
wirklich kleiner sein, als es in dieser Version der Fall ist.

Die Prozedur "SendeString " ist sozusagen das Herz des Systems. Sie 
stellt die Schnittstelle zur Textverarbeitung dar. In der Variablen 
"wasSenden" wird der Text bergeben, den ich einfgen will. Da ich in 
dieser Prozedur einen Interrupt aufrufe, mu ich mir eine Variable 
anlegen, in der ich die Prozessor-Register direkt mit Werten fllen 
kann. Die DOS-Unit stellt mir einen passenden Datentyp zur Verfgung. 
Diese Interrupt-Routine ist natrlich nur speziell auf dem Portfolio 
vorhanden. In "reg.ah" wird die Funktionsnummer bergeben. Da diese 
Funktion auch noch andere Unterfunktionen hat, mu ich die Nummer 
dieser Unterfunktion im AH-Register bergeben. Die Funktion $03 
beinhaltet alle Routinen, die von Hook-Files verwendet werden knnen, 
um mit der Textverarbeitung zu kommunizieren.

Hier mal eine kleine Auflistung, die aus der Orginalbeschreibung von 
DIP stammt :

------------------------ schnipp -----------------------------------

Fn 03H Reserved for CustomAdd-ins

A series of "hooks" are provided into the Editor to enable users to 
control the Editor from outside.

There are 6 Editor "hooks". These enable an application spawned 
within the Editor to access a limited number of internal functions 
which modify the text and environment.

	EDHO_GOTO	Move the cursor position
	EDHO_GET	Get the cursor position
	EDHO_REF	Refresh the screen
	EDHO_LOC	Get location of character at cursor
	EDHO_INS	Insert string into text
	EDHO_DEL	Delete characters from text

------------------------ schnapp -----------------------------------

Wir bentigen fr unsere Zwecke die Unterfunktion EDHO_INS. Die 
Funktion bentigt die Segmentadresse im ES-Register und die 
Offsetadresse im BX-Register. Das BIOS erwartet allerdings einen 
sogenannten C-String, da heit einen nullterminierten String. Aus 
diesem Grund mu ich an meinen PASCAL-String auch noch ein 
Nullzeichen anhngen. Das bekomme ich durch die Funktion "CHR(0)" 
oder indem ich einfache "#0" anhnge. Der String ist jetzt 
nullterminiert. Warum ich dann die Adressen in dieser speziellen Form 
bergeben mu und was das mit den C-Strings genau zu tun hat, habe 
ich schon mal im zweiten Kursteil erklrt. Also, wenn es noch nicht 
klar ist, dann dort nachsehen. Gut, wir haben nun also eine Prozedur, 
der ich einen PASCAL-String mitgebe und die diesen dann an die 
Textverarbeitung weiterreicht. Super ... machen wir uns also an die 
Bedienoberflche unseres kleinen Helfers.

Die drei nun folgenden Konstantendeklarationen sind einfach nur eine 
Hilfe, um im Programm selber einige Wertzuweisungen zu sparen. Es ist 
ohnehin besser, wenn ich Daten, die sich nie verndern werden als 
Konstanten in den Quelltext einbringe. Es spart mir unter Umstnden 
wieder einiges an Speicherplatz bei dem spter bersetzten Programm. 
"wochenTage" ist eine sogenannte typisierte Konstante. Ich kann auf 
die Elemente wie in einem normalen Array zugreifen. Hier habe ich mir 
die Strings fr die Wochentage abgelegt. Den Wert, den ich spter bei 
der Datumsabfrage zurckbekomme, kann ich sofort als Zugriffsindex 
auf die Konstante anwenden. Dazu aber weiter unten noch mehr. Die 
nchsten beiden Konstanten beinhalten meinen Mentitel und den 
Mentext. Sie sind eigentlich Strings, auch wenn das nicht noch mal 
extra dransteht. Wichtig ist, da der String der die Menpunkte 
enthlt, ein einziger String ist und die Punkte durch ein Nullzeichen 
voneinander getrennt sein mssen. Auch das habe ich ausfhrlicher im 
zweiten Kursteil behandelt.

Nun die globalen Variablen. Die Namen sind so gewhlt, da sie 
eigentlich aussagekrftig genug sein mten. In den beiden Strings 
"datum" und "uhrzeit" wird der darzustellende String 
zusammengestckelt. "puffer" ist fr meine Sicherungskopie des 
Bildschirms und in "auswahl" bekomme ich die Wahl des Users 
zurckgeliefert.

Machen wir uns an das Hauptprogramm. Zuerst einmal bin ich selber 
dafr verantwortlich, da wenn ich mein Programm verlasse der 
Bildschirm so aussieht, wie ich ihn vorgefunden habe. Man mu wissen, 
da alle darstellenden Funktionen aus der PortAES-Unit 
beziehungsweise die BIOS-Routinen des Portfolio einfach auf den 
Bildschirm schreiben und damit den vorherigen Inhalt zerstren. Eine 
Ausnahme gibt es, nmlich die Funktion "ErrorWindow". Hier pat das 
BIOS selber auf, da der Bildschirm restauriert wird. Wie gesagt, ich 
mu sicher stellen, da wenn mein Programm beendet ist, der 
Bildschirm restauriert wird. Das mache ich indem ich den 
Bildschirminhalt, bevor irgendwelche anderen Aktionen laufen, in 
meine Variable "puffer" sichere. Die beiden Funktionen "SaveScreen" 
und "RestoreScreen" aus der PortAES-Unit bernehmen fr mich Aufgabe 
des Sicherns und der Restaurierung. Deshalb sollten diese beiden 
Funktionen jede meiner Bildschirmaktionen klammern.

Diese Sicherheit htte ich also. Nun kann ich ganz beruhigt zur 
Arbeit schreiten. Die beiden Prozeduren "GetDate" und "GetTime" sind 
Standardroutinen aus der PASCAL-Unit : DOS. Mit ihrer Hilfe kann ich 
das aktuelle Datum und die Uhrzeit erfragen. "GetDate" gibt mir nicht 
nur das Datum zurck, sondern meldet mir auch gleichzeitig noch, 
welchen Wochentag wir haben. Nett ... Wenn ich es schon so leicht 
gemacht bekomme, dann will ich das auch nutzen und den Wochentag in 
meinem Datumsstring mit anzeigen. Nun mu man wissen, in welcher Form 
mir die Prozedur den Wochentag zurckgibt. Der Wochentag ist eine 
Zahl zwischen 0 und 6. Null bedeutet dabei Sonntag und sechs bedeutet 
Samstag. Das erklrt, warum die Indizes meiner Wochentagskonstante 
von 0 bis 6 gehen und warum der Inhalt dann mit "So" anfngt und 
nicht mit Montag. Ich kann jetzt, wie oben schon mal erwhnt, den 
Rckgabewert von "GetDate" direkt als Index fr das Array benutzen.

Es ist natrlich eine Geschmacksfrage wie mein Datum dargestellt 
wird. Ich mag es, wenn ich zum Beispiel bei der Jahreszahl die "19" 
weglassen kann und wenn Tage und Monate mit nur einer Ziffer mit 
einer fhrenden Null verschnt werden. Um von der Jahreszahl nur die 
letzten beiden Ziffern zu bekommen, wende ich einen kleinen Trick an. 
Der Rechenausdruck MOD (Modulo) fhrt eine ganzzahlige Division durch 
und gibt als Ergebnis den ganzzahligen Rest zurck. Bei "1996 MOD 
100" wre 100 also 19 mal in 1996 enthalten. "19 mal 100 gleich 1900" 
Der ganzzahlige Rest ist also 96. Und schon habe ich nur noch die 
letzten beiden Ziffern. Dieses Ergebnis schreibe ich mir dann wieder 
in die Variable "jahr" zurck, weil ich ja nur das haben will. Die 
nun folgende vierzeilige Anweisung ist natrlich nur eine Anweisung, 
die ich der bersichtlichkeit halber aber in vier Zeilen verteile. Es 
handelt sich hierbei um eine ganz normale Stringverkettung. Zwischen 
den einzelnen Angaben werden noch Leerzeichen und Punkte eingebaut. 
Die Formatierung von einer Zahl in einen String bernimmt die 
Funktion "Expandieren". Auerdem wird der String auch noch um die 
fhrende Null erweitert falls erforderlich.

Die "GetTime" Funktion brauche ich nun ja wohl nicht mehr zu 
erklren. Die Funktion wrde mir auch noch die Sekunden und die 
hundertstel Sekunden zurckgeben. Aber so genau wollte ich die 
Uhrzeit ja nicht haben. Also kann ich fr diese beiden Werte eine 
Hilfsvariable einsetzen, deren Inhalt nicht beachtet wird. An dieser 
Stelle noch ein kleiner Hinweis. Es gibt doch einen Unterschied, ob 
ich die "GetTime" Funktion auf dem PC aufrufe oder auf dem Portfolio. 
Auf dem Portfolio bekomme ich keinen korrekten Wert fr die 
hundertstel Sekunden. Das ist auch der Grund, warum Zeitmessungen auf 
dem Portfolio so schwierig sind.

Gut ... meine Ausgabestrings sind also erstellt und formatiert. Nun 
geht es darum, den User zu fragen, was er denn bitte schn eingefgt 
haben mchte. Wir lassen ihm ja die Wahl, ob er nur das Datum, nur 
die Uhrzeit oder vielleicht beides haben mchte. Fr diese Auswahl 
zeigen wir ihm ein Men. Ein Portfolio-Men. Die Menfunktion stammt 
auch wieder aus der PortAES-Unit und ihre Parameter und ihre 
Benutzung sind im zweiten Kursteil beschrieben. Nur kurz ... mit den 
ersten beiden Zahlenparametern lege ich die linke-obere Ecke des 
Mens fest, ich positioniere es also. Wichtig ist, da die Funktion 
einen Wahrheitswert zurck liefert, ob eine gltige Auswahl getroffen 
wurde oder nicht. Sollte der User das Men mit Escape abgebrochen 
haben, dann wrde die IF-Anweisung und die daraus folgende CASE-Anweisung gar nicht ausgefhrt werden und es wrde gar nichts 
passieren. Unser Programm beendet sich sang und klanglos und lst 
sich nach der Wiederherstellung des Bildschirms in Luft auf. Sollte 
aber einer der Menpunkte angewhlt werden, dann war das Starten des 
Programms nicht sinnlos und wir knnen zeigen, was in uns steckt. Bei 
drei Menpunkten kann unser Rckgabewert in "auswahl" zwischen 0 und 
2 liegen. Je nachdem was nun in "auswahl" steht, sende ich mit Hilfe 
der EDHO_INS Funktion den passenden String an die Textverarbeitung.

Zum Schlu mu noch der Bildschirm restauriert werden, um die 
Hinterlassenschaften unseres Mens zu beseitigen und unser Hook-File 
wird beendet. Sobald die Textverarbeitung wieder die Kontrolle hat, 
erscheint wie von Zauberhand unser String.

Noch etwas zur Benutzung dieses Hook-Files. Ab einer bestimmten 
Gre, die das Programm im geladenen Zustand im Speicher einnimmt, 
kann es sein, da das Hook-File nicht mehr geladen wird. Das tritt 
meist dann auf, wenn noch ein Anderes Programm im Hintergrund 
schlummert. Viele benutzen vielleicht den File-Manager FM.EXE. Starte 
ich die Textverarbeitung ber dieses Programm, dann schafft es die 
Textverarbeitung nicht mehr das Hook-File nachzuladen. Es ist also 
meistens besser, wenn man die Textverarbeitung von der DOS-Oberflche 
startet. Damit sind diese Schwierigkeiten weitgehend behoben.

So, ich hoffe, da das nicht zu schwer war. Eigentlich nicht. Man 
sieht, wie man mit einfachen Mitteln eine Erweiterung fr die 
Textverarbeitung verfassen kann. Denkbar wre jetzt zum Beispiel mit 
der EDHO_INS Funktion eine Art von Textbaustein-Verwaltung. Hufig 
gebrauchte Textinhalte knnen so auf Knopfdruck einfach eingefgt 
werden. Vielleicht hat ja der eine oder andere Geschmack daran 
gefunden, kleine PASCAL-Programme zu erstellen. Vielleicht haben ja 
auch einige Nichtprogrammierer die den Text gelesen haben, Lust 
bekommen, selber zu programmieren. Ich kann nur sagen, es ist ein 
tolles Gefhl, wenn man wei, da ein kleines Wunderwerk, das gerade 
auf dem Bildschirm zu sehen ist, von einem selbst stammt. Jeder 
Programmierer, egal welche Sprache er benutzt, wird mir zustimmen, 
welche Faszination davon ausgeht. Und nur um zu zeigen, was man alles 
programmieren kann, die Programme TELEFONTARIFE und ZETTEL sind von 
mir. Sie sind in PASCAL geschrieben und mit den PortUnits aus dem 
zweiten Kursteil erstellt. Und das waren mit Sicherheit nicht die 
letzten ... :o)  Falls jemand also anfangen will zu programmieren : 
Es gibt viele gute Bcher, um den Einstieg selber zu finden und ein 
Turbo PASCAL 6.0 kann ich schon auf CD gebrannt in jeder 
Computerabteilung der Kaufhuser fr nicht mal 40,-DM bekommen. Wer 
Fragen und Anregungen zu diesem Artikel hat, kann sich wie immer 
gerne an mich wenden. Die Adresse und Telefonnummer stehen im Anhang. 
Ich habe auch ein Archiv in der Pofo-Mailbox, in dem ich die 
PortUnits und eine kleine Funktionsbeschreibung sowie die laufenden 
Artikel zum Kurs untergebracht habe. Die Units liegen als bersetzte 
TPU's fr die Turbo PASCAL Versionen 6.0 und 7.0 vor. Falls jemand 
die Dinger auch noch fr 5.0 oder 5.5 bersetzt haben mu, dann kann 
er sich bei mir melden.

Fr Anregungen, Verbesserungsvorschlge etc. oder weitere 
Kursthemenvorschlge bin ich immer zu haben. Ansonsten verbleibe ich 
bis zum nchsten Teil ...

Torsten "Turtle" Hler


	Anhang

verwendete Quellen : 	
	
	Portfolio Programmierpraxis
		Frank Riemenschneider, Michael Schuschk
		Verlag : Markt&Technik

	Portfolio Technical Reference Guide
		DIP

	Diverse Texte aus diversen Mailboxen

Meine eMail-Adressen :

	MausNet 	- Torsten Hler @ OS3
	Internet 	- Torsten_Haessler@t-online.de

Meistens bin ich nach 17:00 Uhr telefonisch zu erreichen unter 
0571/36695.