Wie stelle ich einen Accessorie-Eintrag im Menü »DESK« deselektiert dar?
Hierfür bieten sich zwei Lösungen an. Bei der ersten Variante gehen wir davon aus, daß die Pull-Down-Leiste mit den GfA-BASIC eigenen Befehlen erzeugt wird. Die Platzhalter für die Accessories nehmen statt 1, 2, 3, 4, 5, 6 die negativen Werte -1, -2, -3, -4, -5, -6 an. Die zweite Lösung ist etwas einfacher. Entwerfen Sie die Menüleiste in einem Resource-Construction-Set (RCS), so haben Sie direkten Zugang zu allen Werten eines Objektbaumes. Verantwortlich für die Erscheinungsweise eines Eintrags in der Menüleiste ist jeweils das Bit Nummer 3 des zugehörigen Objektstatus »OB_STATE«.
Beim Schließen eines Accessory hinterläßt dieses bei meinem Programm eine graue Box und zerstört den Hintergrund. Wie kann ich das Öffnen des Accessory abfragen, damit ich zuvor den Hintergrund retten kann?
In der Regel sind Accessories voll GEM-Programmiert. Somit übergibt das ACC die Redraw-Aufgaben auch an GEM. GEM hält den Inhalt des Desktop, also die AKTUELLE Arbeitsumgebung, in einem Puffer. Beim Schließen eines Accessories wird der Ausschnitt aus dem Puffer in den Bildschirm kopiert. Ist die derzeitige Arbeitsumgebung nicht als Desktop angemeldet, so existiert für GEM nur eine graue Fläche (Standard Anmeldung). Statt der komplizierten Rettung es Hintergrundes Beachtung zu schenken, beheben wir besser die Ursache. Der einfachste Weg ist die Arbeitsumgebung als Desktop anmelden.
Der Prozedur init_desktop() übergeben wir die Adresse eines im RCS entworfenen Desktop. Bei korrektem Aufruf paßt die Routine zunächst die Größe des 0. Objekts (Hintergrund) der aktuellen Auflösung an. In »WORK_OUT(0)« finden wir dazu die x-Auflösung, in »WORK-OUT(1)« die y-Auflösung. Natürlich lassen sich noch weitere Objekte, wie zum Beispiel eine Infobox oder Icons fest plazieren. Ist unser Wunsch-Desktop komplett, meiden wir ihn mit »WIND_SET( ... )« an. Das Zeichnen unseres Machwerks übernimmt die Funktion »ßFORM_DIAL(..)«. Um unseren eigenen Desktop wieder abzumelden, durchspringen Sie einfach die Prozedur »ende«. Der alte Desktop ist jetzt wieder am Zug.
PROCEDURE init_desktop(adr%) ! meldet neues Desktop an
´ adr% = baumadresse des neuen Desktop
´ nulltes objekt wird auf Desktopgröße gebracht
IF adr%
OB_X (adr%, 0)"0 ! koordinaten
OB_Y (adr%, 0)"0 ! links oben
OB_W (adr%, 0)"SUCC (WORK_OUT(0)) ! koordinaten
OB_H (adr%, 0)"SUCC (WORK_OUT(1)) ! rechts unten
OB_X (adr%, rsc&)"rscx% ! koordianten für
OB_Y (adr%, rsc&)"rscy% ! ein objekt anmelden
OB_X (adr%, icon&)"iconx% ! korrdinaten für
OB_Y (adr%, icon&)"icony% ! ein icon anmelden
~WIND_SET (O, 14, SWAP (adr%), adr%, 0, 0) ! desktop anmelden
~FORM_DIAL (3, 0, 0, 0, 0, 0, 0, WORK_OUT(O), WORKOUT(1)) !zeichnen
ENDIF
RETURN
PROCEDURE ende
~WIND_SET (O, 14, 0, 0, 0, 0) ! altes Desktop wieder anmelden
RESERVE ! GFA-BASIC-Speicher freigeben
CLS ! bildschirm löschen
RETURN
Bei einem Installations-Programm möchte ich dem Anwender nur eine bestimmte Zeit zur Eingabe geben. Wie kann ich dies überwachen ?
Genau für diesen Zweck bietet GfA-Basic den Befehl »AFTER ... GOSUB«. in unserem Listing nutzen wir diesen zur Zeitbegrenzung einer Eingabe. Nachdem die Zeitvariable gesetzt und die AFTER ... GOSUB-Zeile bearbeitet ist, wartet unser kleines Programm drei Sekunden lang auf die Eingabe eines Textes. Nach Ablauf dieser Frist erscheint eine Dialogbox und das Programm wird beendet.
init
AFTER 3*200 GOSUB prg_ende ! zeitbegrenzung
´
PRINT "Schreiben, solange Zeit ist !" ! info schreiben
PRINT CHR$ (27) ; "e" ! cursor einschalten
´
DO
taste$ "INKEY$ ! taste speichern
IF taste$ <>"" ! wenn eine taste gedrückt
PRINT taste$; ! zeichen ausgeben
ENDIF
LOOP
PROCEDURE init
sec_anzahl% = 3 ! zeitbegrenzung in sec
RETURN
PROCEDURE prg_ende
OUT 2, 7 ! "pling" ausgeben
ALERT 0, "Bis hierhin und|nicht weiter!", 1, "Ok", wahl
EDIT
RETURN
Auf einem Bildschirm soll ein mit »DEFTEXT« im Aussehen veränderter Text ausgegeben werden. Gleichzeitig soll sich ein Text pixelgenau positionieren lassen, der normales Aussehen trägt. Kann ich mir das ewige Umschalten mit DEFTEXT sparen ?
Ja. Da solche Fälle öfter auftreten, hat GfA-BASIC den praktischen Befehl
ATEXT x, y, "TOS"
Mit dieser Eingabe läßt sich jeder Text analog zu »TEXT x, y, "Text"« positionieren, wird jedoch durch DEFTEXT nicht beeinflußt.
Durch »1st Word« ist bei mir der Wunsch entstanden, durch das Selektieren verschiedener Buttons die Umschalttasten (<SHIFT>, <ALTERNATE> und <CONTROL> zu bedienen. Wie kann ich den Zustand dieser Tasten verändern ?
Mit der BIOS-Funktion 11 läßt sich der Zustand der Sondertasten <SHIFT links>, <SHIFT rechts>, <CONTROL>, <ALTERNATE> und <CAPS LOCK> abfragen. Mit gleicher Funktion wird der Zustand auch gesetzt. Übergeben Sie den Wert -1, erhalten Sie die aktuellen Einstellungen, jeder andere Wert verändert diese entsprechend.
~BIOS (11, BCHG (BIOS (11, -1), bit|))
Für 'bit|' gelten folgende Werte:
0 SHIFT rechts
1 SHIFT links
2 CONTROL
3 ALTERNATE
4 CAPS LOCK