home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Inside Multimedia 1995 August
/
IMM0895.BIN
/
magazin
/
optix
/
disk1
/
optxppac.set
/
LISTBOX.INC
< prev
next >
Wrap
Text File
|
1995-05-08
|
19KB
|
579 lines
procedure listbox(xl,yo,zeich,zeil,fnt,txsta,pos,lines,rcol,tcol,bcol)
rem
rem PROCEDURE zur Verwaltung einer Text-Listbox mit ScrollBalken und Select
rem
rem 'Down' - Taste scrollt abwärts
rem 'Up' - Taste scrollt aufwärts
rem 'Right' - Taste scrollt nach rechts
rem 'Left' - Taste scrollt nach rechts
rem 'Home' - setzt Liststart und Balken auf Listenanfang
rem 'End' - setzt Liststart und Balken auf Listenende
rem 'Tab' - fährt Textausschnitt 8 Zeichen nach rechts
rem 'Ctrl-Tab' - fährt Textausschnitt 8 Zeichen nach links
rem 'Pageup' - blättert seitenweise aufwärts
rem 'Pagedn' - blättert seitenweise abwärts
rem 'Ctrl-PgUp' - setzt Balken auf Boxanfang
rem 'Ctrl-PgDn' - setzt Balken auf Boxende
rem 'Esc' - Bricht Box ab und liefert in gp[19] eine 3
rem 'MausClick re' - Bricht Box ab und liefert in gp[19] eine 4
rem 'MausClick li' - positioniert Balken
rem -> Wird mit gedrücktem linken Mausbutton
rem (=Zeilenauswahl) die Box verlassen, scrollt
rem d.Boxinhalt ggfls.in d. entsprechende
rem Richtung
rem 'Return' - bestätigt Auswahl, schließt die Box und
rem liefert in der glob. Var 'Back' den
rem gewählten - absoluten - Textfeldindex sowie
rem in gp[19] den Wert 1
rem
rem Erwartet die globale Stringvariable 'DUM$' als Arbeitsvariable
rem Erwartet das globale Parameterfeld 'GP[1..32]' als Arbeitspuffer
rem
rem Belegt die globale numerische Variable 'Back' als Rückgabevariable.
rem 'Back' kann auch mit einem gewünschten Startindex vorbelegt sein und
rem wird beim Boxaufbau berücksichtigt. Siehe auch bei Parameter 'fnt'.
rem
rem Bis auf den inneren Bereich der Listbox, die Scrollpfeile und die Slide-
rem bereiche nimmt die Routine keine grafische Ausgabe vor, sodaß die Ge-
rem staltung der Box weitgehend frei bleibt. Man kann sich also durch einen
rem Aufruf mit einer negativen 'Zeil'-Angabe (s.dort) erst die rechte und
rem untere Randkoordinate liefern lassen und die Gestaltung selbst vornehmen.
rem Zur Hintergrundrestaurierung der Sliderbereiche bei Sliderbedienung wird
rem per GETPIXEL die aktuelle Hintergrundfarbe der jeweiligen Sliderbox
rem automatisch ermittelt.
rem
rem
rem Parameter:
rem
rem xl,yo : linke, obere Eckkoordinate
rem
rem zeich : Zeichenbreite, auf die die Box formatiert werden soll
rem Wird in 'zeich' ein Negativwert übergeben, wird d.horiz.
rem Boxausdehnung automatisch entsprechend des längsten
rem im gewünschten Feldbereich enthaltenen Strings forma-
rem tiert
rem
rem zeil : Zeilenanzahl der Listboxhöhe. Wird 'zeil' als nega-
rem tivwert übergeben, wird nur die Boxausdehnung mit den
rem entsprechenden Einstellungen berechnet, die Routine
rem wieder verlassen und anschließend die rechte X-Rand-
rem koord. in gp[17], sowie die untere Y-Randkoord. in
rem gp[18] zurückgeliefert.
rem
rem fnt : sysfont-Index: 1, 2 oder 3. Wird 'fnt' als Negativwert
rem übergeben, wird ein Exitflag aktiviert, wodurch dann
rem ein linksClick(!) außerhalb der listbox als Exit inter-
rem pretiert wird. Das Global-Feld GP[] enthält dann im
rem Element gp[19] den Wert 2. Dadurch kann eine beliebige
rem Clickbox-Verwaltung um die Listbox herum realisiert
rem werden, indem anschließend per INBOX die Mausposition
rem ermittelt wird. Nötigenfalls kann dann durch Vorbele-
rem gung von 'Back' und eine ggfls. geänderte Angabe von
rem 'pos' erneut in die Listbox zurückgesprungen werden.
rem In GP[20] wird generell bei Rückkehr der Index der
rem zuletzt obersten Zeile (->'pos') zurückgeliefert.
rem
rem txsta : Auf den absoluten Feldanfang bezogener Index des ersten
rem gewünschten darstellbaren Textfeld-Elementes.
rem Wird 'txsta' als Negativwert übergeben, wird ein
rem exitflag aktiviert, wodurch dann das Bewegen der Maus
rem außerhalb der listbox als Exit interpretiert wird. Das
rem Global-Feld GP[] enthält dann im Element gp[19] den
rem Wert 5. Dadurch kann ggfls. zur Bedienung mehrerer
rem Listboxen zwischen ihnen hin- und hergewechselt werden.
rem In GP[20] wird generell bei Rückkehr der Index der
rem zuletzt obersten Zeile (->'pos') zurückgeliefert.
rem
rem pos : Zu 'Txsta' relativer Index der beim Boxaufbau als erstes
rem gezeichneten - obersten - ListenZeile.
rem Wird 'pos' als Negativwert übergeben, wird die Listbox
rem nur gezeichnet und wieder verlassen. gp[17] und gp[18]
rem enthalten die berechneten X-rechts- und Y-unten-Rand-
rem koordinaten (wie bei Negativ-'Zeil'!). 'Back' wird
rem bei außerhalb liegendem Index in d.aktuell dargstellten
rem Boxbereich eingepaßt ('geclippt'). GP[19] enthält bei
rem Rückkehr den Wert -1.
rem
rem lines : maximal gewünschte Anzahl der zu zeichnenden Zeilen.
rem Wird 'lines' als Negativwert übergeben, wird das Zeich-
rem nen und die Bedienung der Scrollbuttons und -slider,
rem sowie des Rollbalkens generell unterdrückt (für reine
rem Textfenster-Betrachtung). 'Back' ist anschließend 0.
rem
rem rcol : ggfls. Linienfarbe der Scrollboxen rechts und unten
rem tcol : zu verwendende Schriftfarbe
rem bcol : zu verwendende Schrifthintergrundfarbe
rem Der ScrollBalken wird tcol/bcol vertauscht gezeichnet
rem
locals(sign,taste,i,x,y)
rem *** ggfls. Tastaturbuffer löschen ***
if keypressed<>0
repeat
wait(50)
until readkey<>0
endif
for i := 1 to 32 do
gp[i] := 0
next(i)
gp[1] := 1
gp[6] := vcolor
gp[7] := bcolor
gp[14]:= mcurs
rem gp[1] := max.Stringlänge
rem gp[2] := wrap-flag
rem gp[3] := scroll-flag
rem gp[4] := exitflag
rem gp[5] := xr/yu-Flag / Draw&Exit-Flag
rem gp[6] := aktuelle SETCOLOR
rem gp[7] := aktuelle SETBCOLOR
rem gp[8] := MOUSEK-Buffer
rem gp[9] := hor. slidepos
rem gp[10]:= vert.slidepos
rem gp[11]:= hor. slidebackgroundcolor
rem gp[12]:= vert.slidebackgroundcolor
rem gp[13]:= textflag
rem gp[14]:= Mauscursor-On/Off-Flag
rem ******** Rückgabe-Parameter ************
rem gp[17]:= Xrechts-Rückgabe
rem gp[18]:= Yunten-Rückgabe
rem gp[19]:= liefert Exit-EreignisCode
rem -1 = Box wurde nur gezeichnet u.ohne Bedienung wieder verlassen
rem 1 = <Return> gedrückt
rem 2 = Mausklick außerhalb der Box (falls 'fnt' negativ war)
rem 3 = <Esc> gedrückt
rem 4 = MausClick rechts
rem 5 = Maus ohne Klick außerh.der Box (falls 'txsta' negativ war)
rem gp[20]:= liefert letzten 'pos'-Index
if fnt<0
fnt:=fnt*(-1)
gp[4]:=1
endif
bound(fnt,1,3)
font(0)
sysfont(fnt,1)
if fnt=2
fnt:=16
else
fnt:=8*(fnt/2+1)+2
endif
if txsta<0
txsta:=txsta*(-1)
gp[4]:=2
endif
if zeil<0
zeil:=zeil*(-1)
gp[5]:=1
endif
if lines<0
lines:=lines*(-1)
gp[13]:=1
endif
if pos<0
pos:=pos*(-1)
gp[5]:=2
endif
bound(pos,1,lines)
for i := 0 to lines-1 do
len(text$[txsta+i],x)
if x>=gp[1]
gp[1]:=x
endif
next(i)
if zeich<0
zeich:=gp[1]
endif
gp[17]:=xl+zeich*8+4
if lines>zeil
gp[3] := 1
gp[17]:= gp[17]+12
else
zeil:=lines
endif
gp[18]:=yo+zeil*fnt+1
if gp[1]>zeich
gp[2] := 1
gp[18]:= gp[18]+(fnt+2)
endif
if gp[13] =1
if gp[2]=1
gp[18]:= gp[18]-(fnt+2)
gp[2] := 0
endif
if gp[3]=1
gp[17]:= gp[17]-12
gp[3] := 0
endif
endif
sign:=1
bound(pos,1,lines-zeil+1)
if gp[5]<>1
if gp[13] =1
back:=0
else
dec(back,txsta-1)
bound(back,1,lines)
endif
if gp[2]=1
setcolor(rcol)
line(xl+12,yo+zeil*fnt+2,xl+12,yo+zeil*fnt+2+fnt,0)
line(xl+zeich*8-10,yo+zeil*fnt+2,xl+zeich*8-10,yo+zeil*fnt+2+fnt,0)
line(xl+zeich*8+3,yo+zeil*fnt+2,xl+zeich*8+3,yo+zeil*fnt+2+fnt,0)
line(xl,yo+zeil*fnt+1,xl+zeich*8+2+gp[3]*13,yo+zeil*fnt+1,0)
setcolor(tcol)
printat(xl+3,yo+zeil*fnt+4,chr(17))
printat(xl+zeich*8-6,yo+zeil*fnt+4,chr(16))
endif
if gp[3]=1
setcolor(rcol)
line(xl+zeich*8+4,yo+fnt,xl+zeich*8+15,yo+fnt,0)
line(xl+zeich*8+4,yo+zeil*fnt-fnt+1,xl+zeich*8+15,yo+zeil*fnt-fnt+1,0)
line(xl+zeich*8+3,yo+1,xl+zeich*8+3,yo+zeil*fnt,0)
setcolor(tcol)
printat(xl+zeich*8+6,yo+2,chr(30))
printat(xl+zeich*8+6,yo+zeil*fnt-fnt+3,chr(31))
setbcolor(bcol)
endif
if gp[2]=1
gp[9] :=(zeich-4)*8*(sign-1)/(gp[1]-zeich)
getpixel(xl+13+gp[9]+5,yo+zeil*fnt+fnt/2+1,gp[11])
endif
if gp[3]=1
gp[10] :=(zeil*fnt-3*fnt-1)*(pos-1)/(lines-zeil)
getpixel(xl+zeich*8+5,yo+fnt+gp[10]+1+fnt/2,gp[12])
endif
repeat
cursoff
for i:=pos to pos+zeil-1 do
viewport(xl+1,yo+(i-pos)*fnt+1,xl+zeich*8+2,yo+(i-pos)*fnt+fnt)
dum$:=text$[txsta+i-1]
mid(dum$,sign,zeich)
if i<>back
cbox(0,bcol,0)
setcolor(tcol)
else
cbox(0,tcol,0)
setcolor(bcol)
endif
printat(xl+2,yo+(i-pos)*fnt+2,dum$)
next(i)
if gp[2]=1
gp[9] :=((zeich-4)*8-2)*(sign-1)/(gp[1]-zeich)
viewport(xl+13,yo+zeil*fnt+2,xl+zeich*8-11,gp[18]-1)
cbox(0,gp[11],0)
viewport(xl+13+gp[9],yo+zeil*fnt+3,xl+13+gp[9]+10,yo+zeil*fnt+fnt+1)
cbox(0,tcol,0)
plateau(rcol,rcol)
endif
if gp[3]=1
gp[10] :=(zeil*fnt-3*fnt-1)*(pos-1)/(lines-zeil)
viewport(xl+zeich*8+4,yo+fnt+1,gp[17]-1,yo+zeil*fnt-fnt)
cbox(0,gp[12],0)
viewport(xl+zeich*8+5,yo+fnt+gp[10]+1,xl+zeich*8+14,yo+fnt+gp[10]+1+fnt)
cbox(0,tcol,0)
plateau(rcol,rcol)
endif
if gp[5]=0
curson(mousex,mousey)
repeat
i:=1
repeat
inbox(xl+1,yo+1,xl+zeich*8+2,yo+zeil*fnt+2,i)
if mousek<>gp[8]
i:=0
endif
if mousex<>x
i:=0
endif
if mousey<>y
i:=0
endif
if mousek=0
taste:=readkey
if taste<>0
i:=0
endif
endif
until i=0
gp[8]:=mousek
x :=mousex
y :=mousey
inbox(xl,yo+1,xl+zeich*8+3+gp[3]*12,yo+zeil*fnt+1+gp[2]*(fnt+1),i)
if i:=true
if mousek=1
taste:=-1
back:=(y-yo-1)/fnt+pos
bound(back,pos,pos+lines-1)
endif
else
if taste=-1
if mousek=1
if mousex>xl+zeich*8+1
taste:=right
endif
if mousex<xl
taste:=left
endif
if mousey>yo+zeil*fnt+1
taste:=down
endif
if mousey<yo
taste:=up
endif
endif
else
if mousek=1
if taste=0
if gp[4]=1
gp[19]:=2
endif
endif
else
if gp[4]=2
gp[19]:=5
endif
endif
endif
endif
if taste=ret
gp[19]:=1
endif
if taste=esc
gp[19]:=3
endif
if mousek=2
gp[19]:=4
endif
if gp[19]>0
taste:=-1
endif
if back>0
if gp[2]=1
selbox(xl+13,yo+zeil*fnt+2,xl+zeich*8-11,gp[18]-1,i)
if i:=true
inbox(xl+13+gp[9],yo+zeil*fnt+3,xl+13+gp[9]+10,yo+zeil*fnt+fnt+1,i)
if i:=true
gp[19]:=0
x:=mousex
y:=mousey
cursbound(xl+13,y,xl+zeich*8-21,y)
bound(x,xl+13,xl+zeich*8-20)
cursmove(x,y)
cursoff
repeat
x:=mousex
gp[9] :=x-(xl+13)
viewport(xl+13,yo+zeil*fnt+2,xl+zeich*8-11,gp[18]-1)
cbox(0,gp[11],0)
viewport(xl+13+gp[9],yo+zeil*fnt+3,xl+13+gp[9]+10,yo+zeil*fnt+fnt+1)
decviewport
cbox(0,tcol,0)
plateau(rcol,rcol)
repeat
if mousek=0
x:=-1
endif
until mousex<>x
until mousek=0
curson(mousex,mousey)
cursbound(0,0,xmax,ymax)
sign :=(gp[1]-zeich)*gp[9]/((zeich-4)*8-8)
else
if mousex<xl+13+gp[9]+1
rem Ctrl-tab
taste:=37888
else
taste:=tab
endif
endif
endif
endif
if gp[3]=1
selbox(xl+zeich*8+4,yo+fnt+1,gp[17]-1,yo+zeil*fnt-fnt,i)
if i:=true
inbox(xl+zeich*8+5,yo+fnt+gp[10]+1,xl+zeich*8+14,yo+fnt+gp[10]+1+fnt,i)
if i:=true
gp[19]:=0
x:=mousex
y:=mousey
cursbound(x,yo+fnt+2,x,yo+zeil*fnt-2*fnt+2)
bound(y,yo+fnt+2,yo+zeil*fnt-2*fnt+1)
cursmove(x,y)
cursoff
repeat
y:=mousey
gp[10] :=y-(yo+fnt)
viewport(xl+zeich*8+4,yo+fnt+1,gp[17]-1,yo+zeil*fnt-fnt)
cbox(0,gp[12],0)
viewport(xl+zeich*8+5,yo+fnt+gp[10]-1,xl+zeich*8+14,yo+fnt+gp[10]-1+fnt)
decviewport
cbox(0,tcol,0)
plateau(rcol,rcol)
repeat
if mousek=0
y:=-1
endif
until mousey<>y
until mousek=0
curson(mousex,mousey)
cursbound(0,0,xmax,ymax)
pos :=(lines-zeil)*(gp[10]-2)/((zeil-3)*fnt-1)
else
if mousey<yo+fnt+gp[10]+1
taste:=pgup
else
taste:=pgdn
endif
endif
endif
endif
if gp[2]=1
selbox(xl+1,yo+zeil*fnt+1,xl+10,gp[18]-1,i)
if i:=true
taste:=left
endif
selbox(xl+zeich*8-10,yo+zeil*fnt+1,xl+zeich*8+3,gp[18]-1,i)
if i:=true
taste:=right
endif
wait(10)
endif
if gp[3]=1
selbox(xl+zeich*8+3,yo+zeil*fnt-fnt-1,gp[17],yo+zeil*fnt,i)
if i:=true
taste:=down
endif
selbox(xl+zeich*8+3,yo+1,gp[17]-1,yo+fnt-1,i)
if i:=true
taste:=up
endif
wait(10)
endif
endif
if taste=tab
inc(sign,8)
endif
if taste=37888
rem Ctrl-Tab
dec(sign,8)
endif
if taste=right
inc(sign,1)
if sign>(gp[1]-zeich+1)
taste:=down
endif
endif
if taste=left
dec(sign,1)
if sign<1
taste:=up
sign:=1
endif
endif
bound(sign,1,gp[1]-zeich+1)
if taste=29440
rem Ctrl-left
sign :=1
endif
if taste=29696
rem Ctrl-right
sign :=gp[1]-zeich+1
endif
if taste=home
sign :=1
pos :=1
back :=pos
endif
if taste=33792
rem Ctrl-pgup
sign :=1
back :=pos
endif
if taste=end
pos :=lines-zeil+1
sign :=1
back :=pos+zeil-1
endif
if taste=30208
rem Ctrl-pgdn
sign :=1
back :=pos+zeil-1
endif
if taste=up
if (back-pos)>0
dec(back,1)
else
dec(back,1)
dec(pos,1)
endif
endif
if taste=down
if (pos+zeil-back)>1
if back=0
inc(pos,1)
else
inc(back,1)
endif
else
inc(back,1)
inc(pos,1)
endif
endif
if taste=pgup
dec(back,zeil-1)
dec(pos,zeil-1)
endif
if taste=pgdn
inc(back,zeil)
inc(pos,zeil)
endif
bound(pos,1,lines-zeil+1)
bound(back,pos,pos+zeil-1)
if gp[13] =1
back:=0
endif
until taste<>0
gp[20]:=pos
else
gp[19]:=-1
endif
until gp[19]<>0
if back>0
back:=back+txsta-1
endif
endif
cursoff
if gp[14]<>0
curson(mousex,mousey)
endif
setcolor(gp[6])
setbcolor(gp[7])
return