In der ersten, zweiten und dritten Folge dieser Serie haben wir die Leistungsfähigkeit von ORDA demonstriert und gezeigt, wie einfach es ist, verwandte Personen mit einer einzigen, stark rekursiven Tabelle zu verwalten.
In der heutigen Folge geht es um die Benutzeroberfläche, mit der Sie ansprechende Listen und Raster erstellen können!
Genealogie herunterladen – Folge vier
Listenfelder und gestalteter Text
Listboxen, die auf Arrays und Auswahlen basieren, ermöglichen die Anzeige von gestalteten Textspalten. Das wirft die Frage auf: „Kann ich das auch mit Listenfeldern machen, die auf Sammlungen und Entitätsauswahlen basieren?“
Wie Sie vielleicht schon erraten haben, lautet die Antwort ja, aber Sie wissen vielleicht nicht, wie das geht!
Natürlich, wenn die Attribute Ihrer Entitäten bereits gestylt sind, dann wird „This.myStyledAttribute“ die Aufgabe ohne jegliche Programmierung erledigen (solange die Eigenschaft „multi-style“ der Spalte aktiviert ist). Aber wenn Sie mehrere Attribute haben (Name, Vorname, Postleitzahl, Telefon, usw.), ist Ihr Ziel eher…
dies anzuzeigen… …und nicht dies!
Magie? nicht wirklich, aber dennoch einfach
In beiden oben genannten Fällen haben wir eine Listbox, die auf einer Entitätsauswahl basiert, die mit DS erstellt wurde (siehe frühere Episoden). Anstatt ein einzelnes Attribut (z. B. Dies.Name) oder sogar einen Ausdruck wie „Dies.Vorname+“ „+Dies.Nachname“ anzuzeigen, ist der Spaltenausdruck eine 4D-Methode, die einen vollständigen Text liefert.
In der einen ist der Textgestylt. In der anderen ist er es nicht.
Einfacher Text (nicht gestylt)
$text:=""
=
$text: =$text+This.Title+" "+This.Firstname+" "+This.Lastname+Char(Carriage return)
$text:$text+This.Address+Char(Carriage return)
...
$text: =$text+"email: "+This.email+Char(Carriage return)
$0
: =
$text
Gestalteter Text auf der Grundlage einer Vorlage
Der Trick dabei ist, eine Vorlage für gestylten Text zu erstellen. Dazu verwenden Sie einfach einen gestalteten Textbereich, wie links im Beispiel unten gezeigt.
Der Bereich auf der rechten Seite soll Sie daran erinnern, dass gestalteter Text auf span-Tags basiert. Sie müssen span-Tags innerhalb Ihrer eigenen Tags vermeiden. Die Zeichenkette „[Lastname]“ muss mit dem Befehl replace string. abgerufen werden. Dies ist nicht möglich mit [Lastname] oder [Lastname] (d.h., das erste Zeichen in einem anderen Stil mit anderer Farbe).
$text:=template
$text :=Replace string($text;"[title]";This.Title)
$text :=Replace string($text;"[firstname]";This.Firstname)
...
$text :=Replace string($text;"[cell]";This.Cell)
$text :=Replace string($text;"[email]";This.email)
$0: =
$text
Entity-Auswahlen vs. Sammlungen
„Was? Warum sollte ich diese vergleichen? Die sind doch völlig unterschiedlich!“
„Ja, du hast Recht. Aber warte mal…“
Listenfelder, die auf der Auswahl von Entitäten basieren, sind großartig. Sie können Tausende von Entitäten aufnehmen und sie sehr schnell und schön mit so vielen Spalten wie nötig anzeigen. Sie können entweder kompakte Daten (wie oben gesehen) oder separate Attribute usw. anzeigen.
Das einzige, was sie nicht können, ist die Anzeige von Gittern (Matrix) von Daten. Sie können nicht eine Gruppe von Personen von 1 bis 100 in einer ersten Spalte anzeigen und dann die Gruppe von 101 bis 200 in einer zweiten Spalte fortsetzen, usw. Um ehrlich zu sein, können Listboxen, die auf einer Sammlung basieren, das auch nicht, aber es gibt eine schöne Möglichkeit, dies mit sehr wenig Programmierung zu tun.
Nehmen wir an, unser Ziel ist es, eine Gruppe von Personen wie diese anzuzeigen:
Die obige Liste zeigt nur 9 Personen, aber in der Entity-Auswahl gibt es mehr, sagen wir 28.
nur ein bisschen Mathe
Als Erstes müssen wir einen Weg finden, um für jede Zelle eine eindeutige Zahl von 0 bis 28 zu erhalten. Entweder von links nach rechts, Zeile für Zeile; von oben nach unten, oder Spalte für Spalte.
Rufen Sie dazu einfach eine Funktion mit zwei Parametern auf: die Zeilennummer und die Spaltennummer. In diesem Fall ist die Anzahl der Spalten 3 ($colNum von 0 bis 2) und die benötigte Anzahl der Zeilen ist 10 ($rowNum von 0 bis 9). Mit diesem Wissen ist die Berechnung einfach:
Fall „A“: $rowNum+($colNum*AnzahlZeilen)
Fall „B“: ($rowNum*AnzahlSpalten) + $colNum
Im Listenfeld selbst wird eine Sammlung mit Zahlen von 0 bis 9 angezeigt, die die Zeilennummern darstellen. Jetzt ist es noch einfacher: Sie müssen die Zeilennummer nicht an die Funktion senden. Jedes Mal, wenn die Funktion aufgerufen wird, wird die Zeilennummer durch This.value dargestellt! Sie müssen also nur die Spaltennummer an die Funktion senden, damit sie die ID entsprechend der Zeilennummer berechnen kann!
Und wissen Sie was? Das war’s! Anstatt die berechnete $i als longint zurückzugeben, geben Sie einfach die benötigten Informationen wie myEntity[$i].name als Text zurück! (stellen Sie nur sicher, dass der Wert von $i kleiner ist als myEntities.length)
Code-Beispiel für den Fall „A“:
Die Ausdrücke für die Spalten lauten
CalcID(„vertikal“;0) für die 1. Spalte
CalcID(„vertikal“;1) für die 2. Spalte
CalcID(„vertikal“;2) für die 3. Spalte
(usw., wenn mehr als 3 Spalten)
Schauen wir uns nun an, wie die Methode CalcID aussieht!
C_TEXT($1)
C_LONGINT ($2)
C_LONGINT ($rowNum;$colNum)
$rownum :=This.value // This.value is the current value of the collection (0,1,2,3,...)
$colNum :=$2 // $2 is given by the expression
If ($1="vertical")
$0 :=$rowNum+($colNum*numberOfRows) // numberOfRows is a previously calculated value (ex: 10)
Else
$0 :=($rowNum*numberOfCols)+$colNum // numberOfCols is a previously calculated value (ex: ")
End if
ein weiterer Trick …
Es ist nicht nötig, für jeden Ergebnistyp, den Sie benötigen, eine eigene Funktion zu erstellen. Senden Sie einfach einen Parameter, der bestimmt, was Sie als Rückgabe benötigen, und lassen Sie Ihre Funktion ein Objekt mit dem gewünschten Attribut zurückgeben!
Anstatt drei Methoden zu erstellen (getName, getPicture, getBirthday um ein text, ein picture und ein date zurückzugeben ) und diese in Spaltenausdrücke einzutippen…
getName(0) // getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date
… erstellen Sie eine einzelne Methode getAttribute, die ein Objekt zurückgibt, das entsprechend dem von Ihnen gesendeten Parameter gefüllt ist.
Frage: Geben Sie mir den Namen der Person!
Die Antwort: Hier ist ein Objekt mit dem Attribut “ name“, das den Namen enthält, nach dem Sie gefragt haben!
Hier ist ein Beispiel für die Methode getAttribute :
C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
: ($1="name")
$result .name:=contact.name // name is requested: returned as attribute of $result
: ($1="portrait")
$result .portrait:=contact.portrait // portrait is requested: returned as attribute of $result
: ($1="birthday")
$result .birthday:=contact.birthday // birthday is requested: returned as attribute of $result
End case
$0:=$result
Sobald diese Methode geschrieben ist, können Sie sie in Spaltenausdrücken aufrufen:
getAttribute("name").name // getAttribute returns an object
getAttribute ("portrait").portrait // getAttribute returns an object
getAttribute("Geburtstag").birthday // getAttribute returns an object
Viel Spaß und lassen Sie Ihrer Fantasie freien Lauf!