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 |