Tips und Tricks für GFA-Programmierer

Ich möchte ein Programm schreiben, bei dem für eine bestimmte Option eine Passworteingabe nötig ist. jedoch sollen statt der entsprechenden Buchstaben z.B. ein »X« oder nichts dargestellt werden.

Um eine Eingabe zu verarbeiten, bei der kein Zeichen auf dem Bildschirm erscheinen darf, läßt sich der normale »INPUT«-Befehl nicht verwenden. Somit müssen wir eine eigene kleine »INPUT«-Routine entwerfen. Im Listing rufen wir die FUNCTION »passwort« auf Es lassen sich x- und y-Position der darzustellenden Zeichen übergeben. Mit dem dritten Parameter bestimmen wir zudem die maximale Anzahl an Versuchen. Als viertes folgt das eigentliche Passwort. Danach läßt sich ein Zeichen oder eine Zeichenkette übergeben, die für einen gedrückten Buchstaben erscheinen. Auch ein Leerstring ist möglich.

In den String »ein$« addieren wir das gedrückte Zeichen, das wir mittels »INP(2)« holen. Handelt es sich hierbei um RETURN, verlassen wir die Schleife. Andernfalls erscheint für jedes eingegebene Zeichen zum Beispiel »X«. Ist das Passwort korrekt, gibt die Funktion den Wert »TRUF« zurück, ansonsten »FALSE«.

PRINT @passwort (20, 20, 3,"TOS", "X")
'
FUNCTION passwort (x%, y%, try%, wort$, zeichen$)
'
' x%       -> x-position der eingabe in pixel
' y%       -> y-position der eingabe in pixel
' try%     -> maximale anzahl der versuche 
' Wort$    -> das eigentliche passwort
'zeichen$  -> darzustellende zeichen statt des buchstaben
'
	LOCAL z%, ein$
	FOR z% = 1 TO try%
		DO
			ein$ = ein$ + CHR$ (INP(2))	! Zeichen addieren
			EXIT IF ASC (RIGHT$ (ein$)) = 13	! RETURN -> ENDE
			TEXT x%, y%, STRING$ (LEN (ein$), zeichen$)	! ‚X‘
			IF ein$ = wort$	! Passwort vergleich
				RETURN TRUE	! Wenn gleich ->TRUE
			ENDIF
		LOOP
		TEXT x%, y%, STRING$ (PRED (LEN(ein$))
		STRING$ (LEN(zeichen$), 32))	! Eingabe löschen
		CLR ein$	! String löschen
	NEXT z%		! Nächster Versuch
	RETURN FALSE	! Zuviele Versuche -> FALSE
ENDFUNC

*Bei meinem Programm möchte ich eine Info-Datei nachladen, in der verschiedene Pfade, Texte und Zahlen abgespeichert sind. Die Datei soll in jeder Zeile mit Kommentaren erklärt sein. Wie lade ich so eine .INF-Datei nach und wie werte ich sie richtig aus?

Die Infodatei sollte sich standardgemäß im selben Pfad wie das Hauptprogramm befinden. In unserem Listing bestimmen wir den aktuellen Pfad mit Hilfe der GEMDOS-Funktion 25. Danach öffnen wir die Datei mit den Zusatzinformationen. Mit INPUT #1 lesen wir die Informationen in die verschiedenen Strings.

Beim Anlegen der *.INF-Datei müssen Sie darauf achten, keine Kommata zu verwenden. Der Befehl »INPUT #n« liest eine Information nur bis zum nächsten Komma. Läßt sich das Komma nicht umgehen, müssen Sie statt INPUT #n den Befehl »LINE INPUT #n« verwenden. Ist die Datei komplett gelesen, müssen wir noch die Kommentare »abschneiden«. Hierzu durchsuchen wir den String nach einem »!«. Natürlich läßt sich auch jedes andere Zeichen als Trennmarke verwenden. Der linke Teil des String - bis zum »!« - enthält die gewünschten Informationen, Mit »TRIM$« lassen sich noch die überflüssigen Leerzeichen entfernen. Enthält die Zeichenkette Ziffern, wandeln wir die ASCII-Daten mit »VAL« in eine Zahl.

@lade_inf
PRINT btx_pfad$
PRINT textv_pfad$
PRINT name$; " - "; datum$; anzahl%
~INP (2)
'
ROCEDURE lade_inf
	CLS
	PRINT AT(2, 2); "Lade Info-Datei"
	akt_pfad$ = CHR$ (GEMDOS(25) + 65) + ":" + DIR$ (0) + "\"
	OPEN "i", #1, akt_pfad$ + "TOS.INF"	! Datei öffnen
	INPUT #1, btx_pfad$
	INPUT #1, textv_pfad$
	INPUT #1, name$	! Daten lesen
	INPUT #1, datum$
	INPUT #1, anzahl$
	CLOSE #1		! Datei schließen
	' kommentare entfernen
	btx_pfad$   = TRIM$ (LEFT$ (btx_pfad$, PRED (INSTR (btx_pfad$,"!" ))))
	textv_pfad$ = TRIM$ (LEFT$ (textv_pfad$, PRED (INSTR (textv_pfad$,"!"))))
	LET name$ = TRIM$ (LEFT$ (name$, PRED (INSTR (name$,"!" ))))
	datum$    = TRIM$ (LEFT$ (datum$, PRED (INSTR (datum$,"!"))))
	anzahl%   = VAL (TRIM$ (LEFT$ (anzahl$, PRED (INSTR(anzahl$,"!")))))
	PRINTAT (2,2); SPC (15)	! info-anzeige löschen
RETURN

Wie kann ich den Speicherplatzverbrauch meines Programms begrenzen, damit ich auch noch Accessories aufrufen kann, die viel Speicher benötigen, diesen aber erst beim Aufruf reservieren?

Die Größe der Speicherbelegung eines Programms in GFA-BASIC legen Sie auf zwei verschiedene Arten fest. Zum einen ist hierfür der Befehl »RESERVE xxx« geeignet. Dieser begrenzt den Speicherplatz vom GFA-BASIC-Interpreter selbst. Der Befehl »m$xxxxx« weist den Compiler ab Version 3.0 an, den Speicherplatzbedarf des zu compilierenden Programms zu begrenzen. Somit klappt die Zusammenarbeit mit einem Accessory wie »FCOPY PRO« wieder.

Hallo Textverarbeitung

Wer selbst einmal ein Programm oder Accessory entwickelt hat, das mit einer Textverarbeitung wie 1st Word Plus zusammenarbeiten soll, hat sich sicherlich schon oft gefragt, wie man Text an das Programm übergibt. Nachfolgend stellen wir eine recht einfache Art der Textübermittlung vor. Wir bedienen uns des Tastaturpuffers. In ihm sind Tastatureingaben gespeichert, die aber noch nicht verarbeitet sind.

$m500
ap_id& = APPL_INIT()
me_id& = MENU_REGISTER (ap_id&, " ACC-Test")
DO
	EVNT_MESAG (0)
	IF MENU (1) = 40
		ALERT 1, "| Jetzt wird ein Text über | den KEY-Buffer übergeben!", 1, "TOS", wahl%
		@key_sim ("Sandro Lucifora für TOS")
	ENDIF
LOOP
PROCEDURE key_sim (text$)
	LOCAL z%
	FOR z% = 1 TO LEN (text$)
		KEYPRESS ASC (MID$ (text$, z%, 1))	! simuliert Tastendruck
	NEXT z%
RETURN

Dieses Listing übergibt nach dem Aufruf des ACC den String »text$« Zeichen für Zeichen dem Tastaturpuffer. Damit der Text im Puffer nicht verloren geht, müssen Sie darauf achten, daß der Text nicht länger als 255 Zeichen ist. jetzt schließt sich das Accessory und wie von Geisterhand erscheint der zuvor übergebene Text auf dem Bildschirm. Das Ganze funktioniert natürlich nicht, wenn die Textverarbeitung vorher den Tastaturpuffer löscht. (Sandro Lucifora/ah)



Aus: TOS 09 / 1992, Seite 66

Links

Copyright-Bestimmungen: siehe Über diese Seite