Textlisten-Verwaltung |
|
Auszug aus 2.1.6 Textlisten-VerwaltungAutor: Holger HerzogDie folgende Routine dient dazu, bequem ein Textfenster zu füllen. Alle Zeilen werden dabei in einem String-Array gehalten. Die Variablen index&,...,ch& liefert die Engine in der Prozedur @user_window_content, anzahl& ist die Anzahl der Einträge im String-Array (bzw. die Größe), liste$() das eigentliche Array und selected!() das Array, das die Flags für selektierte und nicht-selektierte Zeilen enthält. Selektierte Zeilen werden invertiert dargestellt.
'
PROCEDURE list_draw(index&,xoff&,yoff&,cx&,cy&,cw&,ch&,anzahl&,VAR liste$(),
selected!())
'
' Version 1.1 27.01.1997 Holger Herzog
'
LOCAL line&,font_h&
LOCAL xlauf&,xend&,ylauf&,yend&
LOCAL startline&,endline&
LOCAL len&,col&,cols&
LOCAL wx&,wy&,ww&,wh&
LOCAL x&,y&,w&,h&
LOCAL text$
'
@win_get_workarea(index&,wx&,wy&,ww&,wh&)
'
IF RC_INTERSECT(wx&,wy&,ww&,wh&,cx&,cy&,cw&,ch&)
'
LET font_h&=@font_height(V~H)
LET x&=(cx&-wx&)+off_x&
LET y&=(cy&-wy&)+off_y&
LET w&=cw&
LET h&=ch&
LET startline&=y& DIV font_h&
LET endline&=(y&+h&-1) DIV font_h&
LET xend&=ADD(wx&,ADD(xoff&,ww&))
LET yend&=ADD(wy&,ADD(yoff&,wh&))
'
GRAPHMODE 1
BOUNDARY 0
DEFFILL 0,1
'
IF FRE()<4096
~FRE(0)
ENDIF
'
LET ylauf&=startline&*font_h&-yoff&
FOR line&=startline& TO endline&
LET xlauf&=-xoff&
LET len&=LEN(liste$(line&))
LET col&=1
LET text$=liste$(line&)
WHILE col&<=len&
LET cols&=MIN(80,SUCC(SUB(len&,col&)))
LET text$=MID$(liste$(line&),col&,cols&)
TEXT xlauf&,ylauf&,text$
ADD xlauf&,@text_width(text$)
ADD col&,cols&
WEND
IF xlauf&<xend&
PBOX xlauf&,ylauf&,xend&,PRED(ADD(ylauf&,font_h&))
ENDIF
IF selected!(line&)
GRAPHMODE 3
DEFFILL 1,1
PBOX SUB(0,xoff&),ylauf&,xend&,PRED(ADD(ylauf&,font_h&))
GRAPHMODE 1
DEFFILL 0,1
ENDIF
ADD ylauf&,font_h&
NEXT line&
'
IF ylauf&<yend&
DEFFILL 0,1
PBOX xoff&,ylauf&,xend&,yend&
ENDIF
'
ENDIF
'
RETURN
Um diese Routine benutzen zu können, muß der Text auf die Kopflinie ausgerichtet werden. Am besten geschieht dies in der Routine @user_on_open: ' PROCEDURE user_on_open ' ' *** Textausrichtung *** ' INTIN(0)=0 INTIN(1)=5 CONTRL(6)=V~H VDISYS 39,2,0 RETURN Nun muß nur noch in der Prozedur @user_window_content der Aufruf zum Redraw eingefügt werden (Sie sollten natürlich Ihre eigenen Variablen einsetzen):
'
PROCEDURE user_window_content(index&,userhandle&,off_x&,off_y&,cx&,cy&,cw&,ch&)
'
~GRAF_MOUSE(256,0) //hidem - to avoid "mousedroppings"
'
SELECT userhandle&
CASE viewer_userhandle_&
@list_draw(index&,off_x&,off_y&,cx&,cy&,cw&,ch&,viewer_entries_%,viewer_$(),
viewer_selected_!())
ENDSELECT
'
~GRAF_MOUSE(257,0) //showm - display pointer again
'
RETURN
|