Nicht alles, was gut aussieht, ist einfach zu programmieren. So sind auch Windows nicht gerade das, was man “leicht” nennen könnte. Wie man es machen kann, soll dieses Programm zeigen. Es soll als Anregung dienen, wie man in GFA-BASIC Windows erstellen und verwalten kann.
Allerdings werden nicht die Windows benutzt, die man normalerweise auf dem Desktop zu sehen bekommt, sondern es wird eine eigenes Window mit einer eigenen Window-Routine benutzt. Die Ausgabe ist dabei wesentlich schneller als die von GEM.
Nach dem Starten des Programmes erscheint eine Auswahlbox, in der man den Text angeben muß, der im Pseudo-Fenster dargestellt werden soll. Die Länge einer Textzeile darf 70 Zeichen nicht überschreiten. Die Position des Fensters kann anhand der Variablen im Programm frei definiert werden. Allerdings ist dann darauf zu achten, daß die Länge der Textzeilen nicht die Breite des Fensters überschreiten darf. Außerdem sollte man beachten, daß die eingegebene Höhe immer durch 20 teilbar ist.
Das Fenster wird durch einen linken Mausklick auf das Closer-Feld geschlossen. Klickt man das Fullwindow-Feld an, öffnet sich das Fenster auf seine maximalen Ausmaße. Das heißt, die Fensterbreite bleibt im Urzustand, die x-Position wird auf 1, die y-Position auf 19 und y2-Position 400 eingestellt. Durch erneutes Betätigen des Full-Feldes erlangt das Fenster seine Anfangsgröße wieder zurück.
Möchte man den Text Scrollen, genügt ein Mausklick mit der rechten Taste auf den entsprechenden Scroll-Balken, um diesen zeilenweise anzuzeigen. Schnelles Scrollen erreicht man durch Drücken der linken Maustaste. Die im Fenster angezeigten 90 Textzeilen können natürlich, je nach Bedarf des jeweiligen Programmierers, verringert oder erhöht werden.
Der Text wird, soweit möglich, mit RC_COPY kopiert. Das ist wesentlich schneller, als alle Zeilen immer wieder mit PRINT oder gar TEXT neu aufzubauen. Dadurch erreicht das Programm im compilierten Zustand eine ähnlich schnelle Geschwindigkeit wie beispielsweise Tempus. Probleme mit der Positionierung des Sliders fallen gänzlich weg, weil keine Slider vorhanden sind. Lediglich jeweils zwei Pfeile für die Richtungen oben und unten sind vorhanden. Mit ihnen kann man den Text nach oben und unten befördern, ohne umständliche Berechnungen für die Position eines Schiebers anstellen zu müssen.
Das Programm ist natürlich nur als Hinweis zu sehen, wie man es auch machen kann, um nicht immer wieder die gleichen Fenster vor Augen zu haben. Etwas Abwechslung kann schließlich nie schaden. Natürlich können Sie die Routinen aber auch einfach in eigene Programme einbauen und sie erweitern, so daß Sie GEM-ähnliche Fenster haben, die aber wesentlich schneller sind!
' **************************************
' * *
' * Titel : Window *
' * Autor : Werner Windl *
' * Flurstrasse 43 *
' * D-8300 Ergolding *
' * Sprache : GFA Basic Version 3.0 *
' * Datum : 12.11.1989 *
' * *
' * (c) 1990 MAXON Computer GmbH *
' * *
' **************************************
DEFFILL 1,2,4
x_res%=WORK_OUT(0)
y_res%=WORK_OUT(1)
PBOX 0,0,x_res%,y_res%
DEFFILL ,0
DIM txt$(500)
window(3,80,120,0)
PROCEDURE window(x&,y&,wh&,flag!)
LOCAL zeile,zeil_1&,eb&,eb$,spx&,spy&,spwh&,full%,open%,exit!
LOCAL iv1&,iv0&,mo&,me&,zb&,a&,ez&,wr$,y_text&,mt&,xbios%,sz&
CLR zeile,full%,open%,zeil_1&,eb&,sz&,ez&,iv0&,eb$,eb&,a&
SGET wr$
spx&=x&
spy&=y&
spwh&=wh&
exit!=FALSE
xbios%=XBIOS(2)
sz&=5
iv1&=-1
mo&=-1
me&=-1
' -------------------Text-Auswahl---------------
~GRAF_GROWBOX(320,200,5,5,150,50,490-150,320-50)
FILESELECT "\*.DOC","________.___",headline$
IF EXIST(headline$)
~GRAF_SHRINKBOX(320,200,5,5,150,50,490-150,320-50)
OPEN "I",#1,headline$
RECALL #1,txt$(),-1,zeile
FOR eb%=0 TO zeile
eb$=MAX(txt$(eb%),eb$)
IF LEN(eb$)>eb&
eb&=LEN(eb$)
ENDIF
NEXT eb%
eb&=(eb&+4)*8
eb&=MIN(eb&,619)
eb&=MAX(eb&,100)
mt&=zeile
zb&=eb&/8-2
CLOSE
ELSE
~GRAF_SHRINKBOX(320,200,5,5,150,50,490-150,320-50)
GOTO ende
ENDIF
~GRAF_GROWBOX(0,19,5,5,x&,y&,eb&,wh&)
full1:
SPUT wr$
' ---------------Fensterelemente------------
DEFFILL 1,0
PBOX x&,y&+18,x&+eb&,y&+wh&+19
DEFFILL 1,1
PBOX x&,y&,x&+eb&+18,y&+18
PBOX x&+eb&,y&+20,x&+eb&+18,y&+18+(wh&/2)
PBOX x&+eb&,y&+20+(wh&/2),x&+eb&+18,y&+19+wh&
' --------------Beschriftung---------------
DEFFILL 1,0
GRAPHMODE 3
LINE x&+16,y&+2,x&+16,y&+16
LINE x&+eb&,y&+2,x&+eb&,y&+l6
TEXT x&+18,y&+15,SPACE$((zb&-LEN(headline$))/2)+headline$
TEXT x&+eb&+5,y&+40,CHR$(1)
TEXT x&+eb&+5,y&+60,CHR$(1)
TEXT x&+eb&+5,y&+wh&-12,CHR$(2)
TEXT x&+eb&+5,y&+wh&+8,CHR$(2)
TEXT x&+5,y&+15,CHR$(5)
TEXT x&+eb&+6,y&+15,CHR$(7)
GRAPHMODE 1
' ------------Schieberkoordinaten---------
smxl&=x&+eb&-2
smyo&=y&+18
smxr&=x&+eb&+18
smym&=y&+19+(wh&/2)
smyu&=y&+19+wh&
' ---------------Redraw-------------------
y_text&=y&+35
FOR a&=zeil_l& TO zeil_l&+sz&
TEXT x&+8,y_text&,txt$(a&)
ADD y_text&,20
NEXT a&
' -----------Ereignisschleife-------------
SHOWM
REPEAT
MOUSE mx&,my&,mk&
' ----------Balken für Auswahl--------
IF mx&>x& AND mx&<x&+eb& AND my&>y&+19 AND my&<y&+wh&+20 AND flag!
IF FIX((my&-y&)/20)<>mo&
IF mo&<>me&
ARECT SUCC(x&),y&+mo&*20,PRED(x&+eb&), y&+mo&*20+20-1,1,2,V:iv1&,0
ENDIF
mo&=FIX((my&-y&)/20)
ARECT SUCC(x&),y&+mo&*20,PRED(x&+eb&),y&+ mo&*20+20-1,1,2,V:iv1&,0
ENDIF
ELSE
IF mo&<>me&
ARECT SUCC(x&),y&+mo&*20,PRED(x&+eb&),y&+ mo&*20+20-1,1,2,V:iv1&,0
ENDIF
mo&=me&
ENDIF
' --------ausgewählter Eintrag-------
IF mk&=1 AND mo&>me&
PRINT AT(40,1);USING "##",ez&+mo&
ENDIF
' ----------Close-Full---------------
IF my&>y& AND my&<y&+18
zeil_l&=ez&
IF mk&=1 AND mx&>x& AND mx&<x&+16
exit!=TRUE
ELSE IF mk&=1 AND mx&>x&+eb& AND mx&<x&+eb&+18 AND open%<1
sz&=17
open%=1
full%=1
~GRAF_SHRINKBOX(0,19,5,5,x&,y&,eb&,wh&)
SPUT wr$
x&=0
y&=19
wh&=361
~GRAF_GROWBOX(0,19,5,5,1,19,eb&,wh&)
GOTO full1
ELSE IF mk&=1 AND mx&>x&+eb& AND mx&<x&+eb&+18 AND open%=1
sz&=5
open%=0
full%=0
~GRAF_SHRINKBOX(0,19,5,5,1,19,eb&,wh&)
SPUT wr$
x&=spx&
y&=spy&
wh&=spwh&
~GRAF_GROWBOX(0,19,5,5,x&,y&,eb&,wh&)
GOTO full1
ENDIF
ENDIF
' ---------------Scrollroutine--------------
IF sz&>4 AND mk& AND mx&>smxl& AND mx&<smxr& AND my&>smyo& AND my&<smyu&
zeil_l&=ez&
IF my&>smym& AND my&<smyu&
IF ez&>0
RC_COPY xbios%,x&,y&+20,eb&,wh&-22 TO xbios%,x&,y&+40
ARECT SUCC(x&),y&+23,PRED(x&+eb&),y&+41,1,0,V:iv0&,0
ATEXT x&+8,y&+22,2,txt$(ez&-1)
DEC ez&
ENDIF
ELSE IF my&>smyo& AND my&<smym&
IF ez&+sz&+1<=mt&
RC_COPY xbios%,x&,y&+40,eb&,wh&-22 TO xbios%,x&,y&+20
ARECT SUCC(x&),y&+wh&+3,PRED(x&+eb&), y&+wh&+18,1,0,V:iv0&,0
ATEXT x&+8,y&+wh&+2,2,txt$(ez&+sz&+1)
INC ez&
ENDIF
ENDIF
WHILE MOUSEK=2
WEND
mk&=0
ENDIF
' ----------------------------------------
UNTIL exit!
ende:
SPUT wr$
~GRAF_SHRINKBOX(0,19,5,5,x&,y&,eb&,wh&)
RETURN