ST-Ecke


' *******************************
' * Pt_adr-Routine in GfA-BASIC *
' * HE  3.7.87                  *
' *******************************
Procedure Pt_adr(Tree%,Ind%,Clear%,Txt_adresse%)
   Te_ptext=0 
   Te_ptmplt=4 
   Te_pvalid=8
   Obj_adresse%=Tree%+Ind%*24                   ! Baumadr. + Ind * 24
   Tedinfo_adresse%=Lpeek(Obj_adresse%+12)      ! Inhalt Obj.adr + ob _spec(12)
   Txt_adresse%=Lpeek(Tedinfo_adresse%+Te_ptext)! Textanf. = TEDINFO-ptext
   if Clear<>0 Then
      Poke Txt_adresse%,0           ! Null setzen
   Endif
   *Txt_adresse=Txt_adresse%      ! Rückgabe Textanfangsadr.
Return

Liebe Leserinnen und Leser,
ab dieser Ausgabe wollen wir uns häufig gestellten Fragen, die sich mit dem Programmieren auf dem ATARI ST beschäftigen, widmen. Dabei soll nicht auf die Hardware, die Handhabung von Anwenderprogrammen oder das Erstellen von Druckeranpassungen u. a. eingegangen werden. Vielmehr sollen hier kleinere Probleme des täglichen Programmierens angesprochen und erklärt werden. Dazu ist natürlich Ihre rege Beteiligung Ihrerseits erforderlich. Nur wenn Sie mit Ihren Fragen an uns herantreten, können wir wissen, welche Schwierigkeiten am häufigsten beim Umgang mit dem ATARI ST auftreten. Wir wollen in dieser Kolumne auch Fehler des Gerätes ansprechen und versuchen, Ihnen beim Beheben oder Umgehen dieser Fehler behilflich zu sein.

Textfeldern in einem Objektbaum

Michael Schachenmayr aus Weilheim stellte folgende Frage:

Wie bearbeitet man die in einem Objektbaum eingegebenen Texte am sinnvollsten? Kann man einen Objektbaum mit mehreren Textfeldern mit dem RCS so erstellen, daß der Cursor später am Anfang der editierbaren Felder erscheint und nicht am Ende? Es ist ziemlich anwenderfeindlich, immer vorher ESC zu drücken! Wie bekommt man die Adresse eines Textfeldes heraus?

Von den GEM-Schreibern wurde der '@' als sogenannter META-Buchstabe eingeführt: Würde man ihn bei einem Text an den Anfang stellen, so verschwindet der nachfolgende Text. Man muß, um für später Speicherplatz zu reservieren, im RCS bei PTEXT einen Text in der Größe des Textfeldes eingeben! Schreibt man nun im RCS vor diesen Text den Buchstaben '® 'so verschwindet der nachfolgende Text schon im RCS. Leider ist diese Möglichkeit also mit dem RCS nicht möglich. Wenn wir aber im Programm nach dem Laden des Resource-Files die Inhalte der Texte durch Nullstrings ersetzen (der erste Buchstabe hat den Wert 0), so steht im Speicher kein Text mehr für das Textfeld, d. h. der Cursor erscheint am Anfang. Den Nachteil will ich nicht verschweigen: Man sollte jedes Textfeld am Anfang auf Null setzen. Wenn man viele Dialogboxen mit Textfeldern besitzt ist das natürlich sehr arbeitsaufwendig. Ist es nötig, diese Textfelder öfters zu löschen, so könnte man sich ein Feld anlegen, in dem alle zu bearbeitenden Textfelder enthalten sind. Diese kann man dann mit der untenstehenden Funktion bearbeiten.

Wie errechnet man nun die Adresse eines Textfeldes? Dabei ist die Verknüpfung der Zeiger folgendermaßen:

Ich habe zum besseren Verständnis ein Beispiel in C und in GFA-BASIC 2.0 beigefügt.

Der Aufruf würde in C folgendermaßen aussehen:
Errechnen der Adresse des Textfeldes von Objekt 4 bei vorhandener Baumadresse in der Variablen 'baum'

ohne Löschen des Feldes...
Adresse=pt_adr(baum,4,0);

mit Löschen des Feldes...
Adresse =pt_ adr(baum,4,1);

Die GFA-Basic-Routine kann man Listing 2 entnehmen.

Aufruf der Adresse mit Löschen:
Gosub Pt_adr(Baum%,4,1, * Txt_adr%)

Aufruf der Adresse ohne Löschen:
Gosub Pt_adr(Baum%,4,0,*Txt_adr%)

Eine Umsetzung in PASCAL oder ASSEMBLER müßte durch die beiden Beispiele nun einfach durchzuführen sein.

[Download 'ptadr_kurz.c'(1KB)][1]
[Download 'ptadr_lang.c'(1KB)][2]

[listings/ptadr_kurz.c] [listings/ptadr_lang.c]

Grafikbildschirm auf Diskette abspeichern

Eine weitere häufige Frage: Wie kann man den Grafikbildschirm auf Diskette abspeichern?

Dazu läßt man sich vom Betriebssystem mit der Funktion xbios(3) die Anfangsadrese des Bildschirms mitteilen und speichert ab dieser Stelle 32000
Bytes ab. Sollten Sie Farbbilder abspeichern wollen, so müssen Sie die Farbregister abspeichern und diese beim Laden des Bildes auch wieder setzen. Das Programmbeispiel in C kann man Listing 3 entnehmen.

GFA Basic-Beispiel:
Laden des Bildes:
Bload "beispiel.pic",Xbios(3)
Speichern des Bildes:
Bsave "beispiel.pic",Xbios(3),32000

Einfach nicht?

Nächsten Monat werde ich näher darauf eingehen, wie man die Farbpalette aus den Registern liest.

Stefan Höhn


Programmbeispiel in C:

/* Laden eines Bildes mit Betriebssystemroutinen */

#include <osbind.h> main() { int fd; lang pic_adr; pic_adr=Logbase(); /* Adresse des Bildschirmspeichers / fd=Fopen("beispiel.pic",0); / Datei anlegen / if (fd<=0) { / Fehlermeldung ausgeben / } Fread(fd,320001,pic_ adr); / Bildschirm speichern / Fclose(fd); / Datei schließen */ }

/* Speichern eines Bildes mit Betriebssystemroutinen */

#include <osbind.h> main () { int fd; long pic_adr; pic_adr=Logbase(); /* Adresse des Bildschirmspeichers / fd=Fcreate("beispiel.pic",0); / Datei anlegen / if (fd<=0) { / Fehlermeldung ausgeben / } Fwrite(fd,320001,pic_ adr); / Bildschirm speichern / Fclose(fd); / Datei schließen */ }



Aus: ST-Computer 03 / 1987, Seite 113

Links

Copyright-Bestimmungen: siehe Über diese Seite