Lade...
 

ObjectListView formatieren

ObjectListView formatieren

Eine ListView ist sehr flexibel, was ihre Darstellung betrifft. Hier werden nun einige Vorgehensweisen, einige Muster, vorgestellt.

Variables Spaltenlayout

Die ListView ist in der Lage, ihr Spaltenlayout im laufenden Betrieb zu verändern. Es ist möglich, die Anzahl der Spalten zu verändern und die Spalten umzubenennen.

Spalten werden durch SetFormat-Anweisungen beschrieben. Es ist sinnvoll, alle Spaltenbeschreibungen (Formate) für jede Sichtweise zusammenzufassen. Das erledigt der Befehl SetFormatName. Soll auf eine andere Sichtweise umgeschaltet werden, wird nur noch das Format umgestellt.

Beispiel: Eine ListView soll Personen anzeigen. Der Benutzer soll zwischen zwei Detailgraden wählen können. Die beiden Formate werden in zwei Makros erzeugt. Die ObjectListView hat keinen Header, dieser wird über die Formate gesetzt:

Define(SetFormatA) "A" SetFormatName(, LV) [ "CX_PERSON::name" HEADER T("Name", "Name") ] SetFormat(, LV) [ "CX_PERSON::comment" HEADER T("Kommentar", "Comment") ] SetFormat(, LV) ; Define(SetFormatB) "B" SetFormatName(, LV) [ "CX_PERSON::name" HEADER T("Name", "Name") ] SetFormat(, LV) [ "CX_PERSON::firstName" HEADER T("Vorname", "First name") ] SetFormat(, LV) [ "CX_PERSON::comment" HEADER T("Kommentar", "Comment") ] SetFormat(, LV) ;

Format A hat zwei Spalten, Format B drei. Es wäre unsinnig, beide Formate gleichzeitig anzuzeigen, zumal die zweite Spalte eine unterschiedliche Bedeutung hat.

Folgender Code schaltet die Header der ListView auf das Format A:

ResetWindow(, LV)
SetFormatA

Dieser Code stellt eine ListView mit Inhalt auf das Format B um:

ResetWindow(, LV)
SetFormatB
GetCollection(, LV) UpdateObox(, LV)

Es ist zwar technisch möglich, beide Formate gleichzeitig der ListView bekannt zu machen, aber es ist unsinnig. Daher sollte grundsätzlich immer nur ein Format gesetzt sein (genauer: eine Formatfamilie; weiter unten sehen wir ein Beispiel mit zwei Formaten, die inhaltlich das gleiche darstellen). Der Befehl ResetWindow löscht alle Formate.

Festes Spaltenlayout

Das Format für alle Spalten wird einmal gesetzt und braucht nicht mehr verändert werden. Dies ist die einfachste Art, eine ListView zu formatieren. Die Header können per Header-Befehl gesetzt werden oder, wie oben im Beispiel zu sehen, direkt in der SetFormat-Anweisung angegeben werden.

Einzelne Zeilen umformatieren

Sollen einzelne Zeilen anders formatiert werden, können hierfür weitere Formate definiert werden, auf die vor dem Einfügen in die ListView umgeschaltet wird. Wichtig ist, dass diese Formate die gleiche Information darstellen, damit die ListView in sich logisch bleibt. Das Beispiel von oben wird nun etwas weiter ausgebaut: Bei einigen Personen soll der Name in rot und der Vorname in blau dargestellt werden:

Define(SetFormatB) "B.normal" SetFormatName(, LV) [ "CX_PERSON::name" HEADER T("Name", "Name") ] SetFormat(, LV) [ "CX_PERSON::firstName" HEADER T("Vorname", "First name") ] SetFormat(, LV) [ "CX_PERSON::comment" HEADER T("Kommentar", "Comment") ] SetFormat(, LV) "B.colored" SetFormatName(, LV) [ "CX_PERSON::name" HEADER T("Name", "Name") COLOR RED ] SetFormat(, LV) [ "CX_PERSON::firstName" HEADER T("Vorname", "First name") COLOR BLUE ] SetFormat(, LV) [ "CX_PERSON::comment" HEADER T("Kommentar", "Comment") ] SetFormat(, LV) ;

Der Name des Formats wurde so gewählt, dass eindeutig zu erkennen ist, dass er zur Formatfamilie "B" gehört. Vor dem Einfügen eines Objektes in die ListView ist dann per SetFormatName das gewünschte Format einzustellen.

Die Umschaltung zu Format A erfolgt wie oben, zurück zum Format B geht es nicht ganz so einfach, da jedes Objekt einzeln dem passenden B-Format zugeordnet werden muss. Alle Personen mit einem Kommentar sollen farbig dargestellt werden:

Var(persons) ...  // enthält die Objekte
ResetWindow(, LV)
ClearObox(, LV)
SetFormatB
persons iterate {
  Dup Copy(comment) is(INVALID) if { "B.normal" SetFormatName(, LV) }
  else { "B.colored" SetFormatName(, LV) }
  FillObox(, LV)
}