Textlisten-Verwaltung


Auszug aus

faceVALUE-Utils

Version 1.5
17. Juni 1999


2.1.6 Textlisten-Verwaltung

Autor: Holger Herzog

Die 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