Tips und Tricks für GfA-Basic

In vielen Anwendungen erscheint innerhalb der Dateiauswahlbox ein Hinweis, welcher Art die auszuwählende Datei sein soll. Wie kann ich solch einen Box-Titel in meinen eigenen GFA-Basic-Programmen übergeben?

Ab TOS 1.04 besteht die Möglichkeit, der Dateiauswahlbox eine Titelzeile zu übergeben. Doch leider unterstützt der GFA-Basic-Befehl »FILESELECT« dieses Feature nicht. Um trotzdem eine Auswahlbox mit Meldung auf den Bildschirm zu bringen, muß man die AES-Funktion »FSEL_EXINPUT« direkt über den »GEMSYS«-Befehl von GFA-Basic aufrufen. Die Funktion »fileselect$« prüft anhand der GEMDOS-Versionsnummer, ob die normale oder die erweiterte Dateiauswahlbox aufgerufen wird. Die Parameterübergabe verhält sich analog zur Funktion »FILESELECT«.

	FILESELECT "A:\*.*","TEST.TXT", Backvar$

entspricht dem Funktionsaufruf:

	Backvar$ = @fileselect$ ("A:\*.*","TEST.TXT", "Box-Titel", fehler&)

Als zusätzliche Parameter erwartet die Funktion den Titel und eine Integervariable, die nach dem Aufruf einen Fehlercode enthält. Dieser sollte nicht ignoriert werden, da etwa bei akutem Speichermangel das Betriebssystem einen Fehler meldet. Enthält die Variable einen Wert ungleich Null, lief alles planmäßig. Ist »Backvar$« ein Leerstring, wurde der Abbruch-Button betätigt, sonst der OK-Button.

Ich möchte unter Verwendung der VDI-Variante des Befehls »BITBLT« einen Bildschirmausschnitt sichern und nachher wieder restaurieren. Wie kann ich die Größe des notwendigen Speicherbereiches anhand der Ausmaße des Ausschnittes berechnen?

Der Befehl »BITBLT« benötigt u.a. die Adresse eines genügend dimensionierten Speicherbereiches, der zuvor via »MALLOC« vorn Betriebssystem angefordert werden muß. Die Größe dieses Speicherbereiches ist abhängig von den Ausmaßen des Ausschnittes und der Anzahl der verwendeten Bitplanes. Aufgrund der Organisation des Bildschirmspeichers muß bei der Berechnung der Größe beachtet werden, daß die Breite des Ausschnittes immer ganzzahlig durch 16 teilbar ist. Die Funktion »mem_calc« erwartet die Breite und Höhe des Bildschirmausschnittes und liefert die Größe des benötigten Speicherblockes zurück.

BOX 20, 20, 220, 100
PRINT "Ausschnitt ist "; @mem_calc (220, 100);" Bytes groß."
ßINP(Z)
EDIT
FUNCTION mem_calc (b&, h&)
	LOCAL planes&, memf%
	´ Anzahl der Bitplanes ermitteln:
	CONTRL(2) = 6
	INTIN (0) = 1
	VDISYS 102, 1, 0, 0
	planes& = INTOUT (4)
	´ benötigten Speicher berechnen:
	mem% = (((b&+15) DIV 16) * 16 *h&) * planes& DIV 8
	RETURN (mem%)
ENDFUNC

Bei Textausgaben in Fenstern möchte ich dafür sorgen, daß an den Fensterrändern immer volle Buchstaben zu sehen sind. Wie kann ich erreichen, daß auch bei Vergrößerungen und Verkleinerungen des Fensters die Buchstaben im Randbereich nicht halbiert werden?

Um das Zerstückeln von Buchstaben zu verhindern, muß dafür gesorgt werden, daß sich die Breite und Höhe des Fenster-Arbeitsbereiches immer mit den Grenzen einer Zeichenzelle decken. Dies wird dadurch erreicht, daß die Ausmaße des Arbeitsbereiches immer ganzzahlig durch die Breite und Höhe einer Zeichenzelle teilbar sind. Der Prozedur »koors_anpassen« muß die Adresse eines Feldes übergeben werden, die die aktuellen Koordinaten und Ausmaße des Arbeitsbereiches enthält. Nach dem Aufruf sind die Feldeinträge an die aktuellen Zeichenproportionen angepaßt.

DIM xy&(3)
xy&(0) = 40
xy&(1) = 40
xy&(2) = 400
xy&(3) = 150
COLOR 1
BOX xy&(0), xy&(1), xy&(0)+xy&(2), xy&(1)+xy&(3)   ! zeichnen
koors_anpassen (V:xy& (0))
COLOR 2
BOX xy&(0), xy&(1), xy&(0)+xy&(2), xy&(1)+xy&(3)  !zeichnen
ßINP(2)
EDIT
PROCEDURE koors_anpassen(adr%)
	LOCAL breite&, hoehe&
	VDISYS 38,0,0
	breite& = PTSOUT(2)
	hoehe&  = PTSOUT(3)
	DPOKE adr% + 4, SUCC (INT(DPEEK(adr%+4)/breite&)) * breite&
	DPOKE adr% + 6, SUCC (INT(DPEEK(adr%+6)/hoehe&))  * hoehe&
RETURN

In einer Anwendung möchte ich die Koordinaten und Ausmaße der offenen Fenster abspeichern, ähnlich der Desktop-Funktion »Arbeit sichern«. Doch wie kann ich erreichen, daß auch in anderen Auflösungen die Fenster wieder an ihrem erwarteten Platz erscheinen?

Um zu verhindern, daß die Fenster außerhalb des sichtbaren Bildschirmausschnittes gezeichnet werden, müssen die jeweiligen Fensterkoordinaten auflösungsunabhängig abgespeichert werden. Die Prozedur »res_ind« rechnet die absoluten Koordinaten in relative um. Diese relativen Koordinaten enthalten den Abstand zum Nullpunkt nicht wie gewohnt in Pixeln, sondern in Prozent. Beispielsweise werden die Bildschirmkoordinaten (320/200) bei einer Auflösung von 640x400 Pixeln in die relativen Koordinaten (50/50) umgerechnet.

Die Funktion erwartet als Parameter ein Flag, das entscheidet, ob absolute in relative Koordinaten umgerechnet werden oder umgekehrt. Außerdem werden die Anfangsadressen zweier Integerfelder erwartet, die abhängig vom Flag die absoluten bzw. relativen Koordinaten enthalten. Zusätzlich müssen natürlich noch die Ausmaße des Begrenzungsausschnittes übergeben werden. Im Beispiel-Listing werden die Koordinaten eines Rechtecks relativ gespeichert und können dann in verschiedenen Auflösungen wieder absolut umgerechnet werden. Falls das Rechteck in ST-Hoch gezeichnet wurde, wird es auch in allen anderen Auflösungsstufen die Mitte des Bildschirms einnehmen.

(Manuel Hermann/ah)

PROCEDURE res_ind (flag!, quelle%, ziel%, b&, h&)
´ flag! =0 -> absolute Koordinaten in relative umrechnen
´ flag!<>0 -> relative Koordinaten in absolute umrechnen
IF flag! = 0
	DPOKE ziel%,   ROUND (DPEEK (quelle%)   / b& * 100)
	DPOKE ziel%+2, ROUND (DPEEK (quelle%+2) / h& * 100)
	DPOKE ziel%+4, ROUND (DPEEK (quelle%+4) / b& * 100)
	DPOKE ziel%+6, ROUND (DPEEK (quelle%+6) / h& * 100)
ELSE
	DPOKE ziel%,   ROUND (DPEEK (quelle%)   * b& / 100)
	DPOKE ziel%+2, ROUND (DPEEK (quelle%+2) * h& / 100)
	DPOKE ziel%+4, ROUND (DPEEK (quelle%+4) * b& / 100)
	DPOKE ziel%+6, ROUND (DPEEK (quelle%+6) * h& / 100)
ENDIF
RETURN


Aus: TOS 02 / 1993, Seite 70

Links

Copyright-Bestimmungen: siehe Über diese Seite