14. Nov 2009 

Listboxen – bei allem was ich mir noch wünschen könnte – sind ein feines Werkzeug. Ein kleines Tool, das ich mir für Listboxen einrichtete ist ListBox_GenService ("ScrollBar_Visible";$lb_ObjName). Es ist für die Funktion einer Listbox vollkommen unwichtig und fürs gute Aussehen unverzichtbar.

both

Standard Rollbalken

Im ersten Bild ist die Standard-Darstellung zu sehen. Die Tabelle zeigt mehr Datenzeilen an, als in den Rahmen passen und die Breite aller Spalten reicht über den Ausschnitt hinaus. Also sind beide Rollbalken zu sehen, sowohl der vertikal wie der horizontale. An den Enden sind die Pfeile aktiv und der Fahrstuhl gibt einen Hinweis auf die Länge der Liste bzw. die Breite der Spalten und die aktuelle Position.

blinde

Blinde Rollbalken

Sind nur wenige Datenzeilen zu sehen sind oder ist das Fenster breit genug, alle Spalten darzustellen, werden automatisch blinde Rollbalken angezeigt. Das ist systemüblich.

Gefällt mir trotzdem nicht.

Ich will eine Zeile mehr Daten sehen, wenn alle Spalten in den verfügbaren Raum passen. Sind nicht mehr Daten anzuzeigen als Zeilen da sind, kann die letzte Spalte den zusätzlichen Raum des vertikalen Rollbalkens nutzen.

Ich möchte wenn es paßt nur den horizontalen Rollbalken sehen oder nur den vertikalen oder keinen von beiden.

horizontal vertical noScroll

ListBox_GenService

Und ich will es nicht jedesmal neu erfinden wollen, wie ich das Ziel erreiche. Das macht ListBox_GenService ("ScrollBar_Visible";$lb_ObjName). Im ersten Parameter steht, was soll der Service tun ("ScrollBar_Visible") und im zweiten Parameter der Name des Objektes ($lb_ObjName).

Die Variablen- und Array-Definitionen lasse ich weg und mit ↩ markiere ich einen von mir für die Darstellung auf dieser Seite eingerichteten Zeilenumbruch in einer einzeiligen 4D-Anweisung.

  1. Die Objektgröße ermitteln:
  2. GET OBJECT RECT(*;$lb_ObjName;$l;$o;$r;$u)
    $width_L:=$r-$l
    $height_L:=$u-$o

  3. Die Listbox Infos in Arrays übertragen:
  4. $lb_ObjName:=$1
    GET LISTBOX ARRAYS(*;$lb_ObjName;$t_SpaNamen;$t_KopfNamen;$t_P_SpaVars; ↩
    $t_P_KopfVars;$t_SpaSichtbar_b;$t_P_Stile)

  5. Die benötigte Höhe berechnen:
  6. $rowheight_L:=Get listbox rows height(*;$lb_ObjName)
    $headerheight_L:=Get listbox information(*;$lb_ObjName;Listbox header height )
    $horScrollBarheight_L:=Get listbox information(*;$lb_ObjName;Listbox hor scrollbar height )
    $countRows_L:=Get number of listbox rows(*;$lb_ObjName)
    $sumHeight_L:=($countRows_L*$rowheight_L)+$headerheight_L+$horScrollBarheight_L
    der vertikale Rollbalken ist sichtbar wenn
    $verticalVisible_b:=($sumHeight_L>$height_L)

  7. Die benötigte Breite errechnen:
  8. $N:=Size of array($t_SpaNamen)
    For ($i;1;$N)
      $sumWidth_L:=$sumWidth_L+Get listbox column width(*;$t_SpaNamen{$i})
      If ($sumWidth_L>$width_L)
        $i:=$N
      End if
    End for
    der horizontale Rollbalken ist sichtbar wenn
    $horizontalVisible_b:=($sumWidth_L>$width_L)

  9. Und zum Abschluß:
  10. SET SCROLLBAR VISIBLE(*;$lb_ObjName;$horizontalVisible_b;$verticalVisible_b)

Einbau

In On Load, On Resize und im On Clicked eines Splitters sowie nach Füllen der Listbox und im On Column Resize rufe ich ListBox_GenService ("ScrollBar_Visible";$lb_ObjName) auf und habe Rollbalken, wie sie mir gefallen.

So ist das im Prinzip richtig, doch träge, weil erst nach einem erneuten Klick der Effekt sichtbar wird. Deshalb setze ich an den genannten Ereignissen $checkLBoxScrollBars_b:=True und prüfe:
If ($checkLBoxScrollBars_b)
  timerWhat:="ScrollBars"
  SET TIMER(5)
End if

In On Timer werden tatsächlich für die betroffenen Listboxen die Rollbalken ein- und ausgeschaltet:
Case of
  : (timerWhat="ScrollBars")
    ListBox_GenService ("ScrollBar_Visible";$lb_ObjModelle)
    ListBox_GenService ("ScrollBar_Visible";$lb_ObjArtikelTable)
  Else
  
End case
timerWhat:=""
SET TIMER(0)

Wunschliste

    Ich liebe Listboxen! Wenn ich mir noch was wünschen darf:
  • mehrzeilige Zellen
  • feststehende Spalten (links)
  • Fußzeilen (analog zur Kopfzeile)
  • Highlight und/oder Einfärben einer Zelle
  • ohne die Listbox zur Tabellenkalkulation auszubauen.

Sie möchten den Sourcecode haben? Kein Problem! Überweisen Sie, was es Ihnen wert ist auf mein PayPal-Konto: info@mettre.de. Was ist denn üblich?

Dazu auch den Redraw - zeitversetzt, Zap-Reiz unterdrücken, Der linke und der rechte Teil der Listbox.

4D Themen: Berichte in Arbeit