Ataquarium

Lange Dateinamen für GFA-Basic

Die Unterstützung von langen Dateinamen sollte mittlerweile bei jedem Programm selbstverständlich sein. Zuerst muss das Programm dem Betriebssystem mitteilen, das es mit langen Dateinamen umzugehen weiß:

~GEMDOS(281,1)

center

Danach werden in der Dateiauswahlbox auch lange Dateinamen angezeigt (sofern es nicht gerade die Atari-Box ist). Diesen Befehl kann man auch im Direktmodus eingeben, GFA-Basic hat keine Probleme mit Dateinamen, die über das 8+3-Schema hinausgehen.
Während dies für viele Programme schon reicht, funktionieren drei Befehle nicht mehr zuverlässig: EXIST und FSFIRST/FSNEXT. Die Probleme mit EXIST lassen sich leicht beheben, indem man statt der Original-GFA-Compiler-Library die Licom verwendet. Das Ersetzen von FSFIRST/FSNEXT ist schon schwieriger, wer unbedingt ganze Verzeichnisse einlesen muss, findet unter http://www.run-software.de eine geeignete Routine.

Rechteck-Überwachung

Die Lieblingsfunktion internationaler Geheimdienste ist in faceVALUE zwar eingebaut, aber nicht besonders gut dokumentiert. Bei der Rechteck-Überwachung wird ein Bereich zur Überwachung durch das Betriebssystem bestimmt. Betritt nun der Mauszeiger dieses Areal, wird ein Alarm ausgelöst und man kann die gewünschte Aktion starten. Da die Überwachung vom Betriebssystem übernommen wird, bleibt das Programm währenddessen nicht regungslos stehen, sondern kann weiterarbeiten.
Die Anwendungsgebiete dafür sind vielfältig: so kann man z.B. die Anzahl der Mausklicks reduzieren, einfache Spiele schreiben oder ein Gag-Programm damit schreiben. Letzteres existiert mit der "NervBox" bereits. Das Programm liegt unter [2] und beinhaltet das Programm und dessen Quelltext.
Für "NervBox" müssen zwei Rechtecke überwacht werden. Ziel ist es, dass der Benutzer keinen der beiden Buttons in dem Dialog anklicken kann. Immer wenn der Mauszeiger einen Button betritt, wird dieser auf nicht anwählbar (disabled) geschaltet. Der andere Button ist dagegen wieder anwählbar.
Das Programm benutzt keine Menüleiste, da diese bei einem kleinen Spaß-Programm eher lästig wäre. Dadurch muss aber gleich in der user_on_open der Startdialog geöffnet werden:

lustig&=@win_open_dialog(2,spass&,-1)

Um den Nerv-Faktor zu steigern, kann man statt der "2" auch eine "1" einsetzen, nur wird es dann unter SingleTOS etwas schwierig, das Programm wieder los zu werden.
Fortgefahren wird mit der Ermittlung der Rechteck-Postition:

tree%=@xrsrc_gaddr(0,spass&)
r&=OBJC_OFFSET(tree%,yesbutton&,yesx&,yesy&)
@aes_rectangle_start(1,yesx&,yesy&,120,32)
r&=OBJC_OFFSET(tree%,nobutton&,x&,y&)
@aes_rectangle_start(1,x&,y&,120,32)

center

Damit wäre die Überwachung für die Rechtecke zunächst einmal aktiviert. faceVALUE springt in die Routine user_aes_rectangle_watch, wenn die Maus einen der überwachten Bereiche betritt oder verlässt. Ein weiteres Problem liegt im Dialog selber: er ist bewegbar. Die Rechteck-Überwachung "wandert" aber nicht mit dem Fensterdialog mit. Zwei Lösungen gibt es: den Dialog unbeweglich zu machen oder die Koordinaten der Rechtecke neu zu bestimmen. Aus Gründen des Benutzerkomforts wird die zweite Lösung verwendet.
Leider gibt es keine "user_"-Routine, die angesprochen wird, sobald ein Dialog bewegt wird. Unter den System-Routinen befindet sich aber genau das gesuchte. Ignorieren wir also die Warnung "Don't change" und wagen uns an die Prozedur win_place_tree.
Im Prinzip muss in win_place_tree das gleiche gemacht werden wie in user_on_open. Die Rechteck-Überwachung sollte aber nur dann erneuert werden, wenn sich an den Koordinaten der Rechtecke auch wirklich etwas verändert hat. Diese Überprüfung vermeidet unschöne Effekte. Aus der user_on_open stehen die Variablen yesx& und yesy& zur Verfügung. Wenn ein Rechteck seine Position verändert hat, ist außerdem auch das andere verschoben.
In die win_place_tree kommen vor dem abschließenden RETURN folgende Zeilen:

x&=yesx&
y&=yesy&
r&=OBJC_OFFSET(tree%,yesbutton&,yesx&,yesy&)

Die alten Koordinaten stecken nun in x&/y& und die neuen in yesx&/yesy&.

IF x&<>yesx& OR y&<>yesy&
 @aes_rectangle_start(1,yesx&,yesy&,120,32)
r&=OBJC_OFFSET(tree%,nobutton&,x&,y&)
 @aes_rectangle_start(2,x&,y&,120,32)
ENDIF

Damit wäre die Rechteck-Überwachung wieder auf dem neuesten Stand. Insgesamt zwei Überwachungen lassen sich aktivieren, wem das nicht reicht, der kann z.B. die Überwachungen verschachteln, d.h. wenn ein Rechteck betreten wird, wird eine neue Überwachung aktiviert und dafür eine andere abgeschaltet.

Quellen:
[1] http://www.run-software.de
[2] http://www.jaapan.de/myprg.php


Mia Jaap
Aus: ST-Computer 05 / 2001, Seite 17

Links

Copyright-Bestimmungen: siehe Über diese Seite