Nel primo, secondo e terzo episodio di questa serie, abbiamo dimostrato la potenza di ORDA e la semplicità con cui è possibile gestire le persone correlate con un’unica tabella altamente ricorsiva.
L’episodio di oggi si concentra sull’interfaccia utente per aiutarvi a creare elenchi e griglie dall’aspetto gradevole!
Scarica Genealogia – Episodio 4
Caselle di riepilogo e testo stilizzato
Le caselle di riepilogo basate su array e selezioni consentono di visualizzare colonne di testo stilizzato. Ciò fa sorgere la domanda: “Posso fare lo stesso con le caselle di riepilogo basate su collezioni e selezioni di entità?”.
Come avrete intuito, la risposta è sì, ma potreste non sapere come farlo!
Naturalmente, se gli attributi delle entità sono già stilizzati, allora “This.myStyledAttribute” farà il lavoro senza alcuna programmazione (purché la proprietà “multi-style” della colonna sia selezionata). Ma quando si hanno diversi attributi (nome, cognome, codice postale, telefono, ecc.), l’obiettivo è più…
visualizzare questo… …piuttosto che questo!
Magico? Non proprio, ma comunque facile
In entrambi i casi sopra descritti, abbiamo una casella di riepilogo basata su una selezione di entità creata con DS (vedere le puntate precedenti). Invece di visualizzare un singolo attributo (es. This.name) o anche un’espressione come “This.Firstname+” “+This.Lastname”, l’espressione della colonna è un metodo 4D che restituisce un testo completo.
In uno, il testo èstilizzato. Nell’altro, non lo è.
Testo semplice (non stilizzato)
$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
Testo stilizzato basato su un modello
Il trucco consiste nel creare un modello di testo stilizzato. Per farlo, è sufficiente utilizzare un’area di testo stilizzata, come mostrato a sinistra nell’esempio sottostante.
L’area a destra è mostrata per ricordare che il testo stilizzato si basa sui tag span. È necessario evitare i tag span all’interno dei propri tag. La stringa “[Cognome]” deve essere recuperata con il comando replace string. Questo non è possibile con [Cognome] o [Nome] (cioè, il primo carattere con uno stile diverso e un colore diverso).
$text:=template
$text :=Replace string($testo;"[titolo]";This.Title)
$text :=Replace string($text;"[nome]";This.Firstname)
...
$text :=Replace string($text;"[cella]";This.Cell)
$text :=Replace string($text;"[email]";This.email)
$0: =
$text
Selezioni di entità vs. collezioni
“Cosa? Perché dovrei confrontarle? Sono completamente diverse!”.
“Sì, hai ragione. Ma aspettate…”
Le caselle di riepilogo basate sulla selezione delle entità sono fantastiche. Possono contenere migliaia di entità, visualizzarle in modo molto rapido e gradevole con tutte le colonne necessarie. Possono visualizzare dati compatti (come visto sopra) o attributi separati, ecc.
L’unica cosa che non possono fare è visualizzare griglie (matrici) di dati. Non possono visualizzare un gruppo di persone da 1 a 100 in una prima colonna, poi continuare il gruppo da 101 a 200 in una seconda colonna, ecc. A dire il vero, nemmeno le caselle di riepilogo basate su un insieme possono farlo, tuttavia esiste un modo simpatico per farlo con pochissima programmazione.
Supponiamo di voler visualizzare un gruppo di persone come questo:
L’elenco qui sopra mostra solo 9 persone, ma nella selezione delle entità ce ne sono di più, diciamo che ce ne sono 28.
un po’ di matematica
La prima cosa da fare è trovare un modo per avere un numero unico da 0 a 28 per ogni cella. Da sinistra a destra, riga per riga; dall’alto in basso o colonna per colonna.
Per farlo, basta chiamare una funzione con due parametri: il numero di riga e il numero di colonna. In questo caso, il Numero di colonne è 3 ($colNum da 0 a 2) e il Numero di righe necessario è 10 ($rowNum da 0 a 9). Sapendo questo, il calcolo è facile:
Caso “A”: $rowNum+($colNum*NumberOfRows)
Caso “B”: ($rowNum*NumberOfColumns) + $colNum
La casella di riepilogo stessa visualizzerà un insieme di numeri da 0 a 9 che rappresenteranno i numeri delle righe. Ora è ancora più semplice: non è necessario inviare il numero di riga alla funzione. Ogni volta che la funzione viene chiamata, il numero di riga è rappresentato da This.value! Quindi è sufficiente inviare il numero di colonna alla funzione, in modo che possa calcolare l’ID in base al numero di riga!
E indovinate un po’? Ecco fatto! Invece di restituire il valore calcolato di $i come longint, basta restituire le informazioni necessarie come myEntity[$i].name come testo! (assicurarsi che il valore di $i sia inferiore a myEntities.length)
Esempio di codice per il caso “A”:
Le espressioni per le colonne saranno
CalcID(“verticale”;0) per la prima colonna
CalcID(“verticale”;1) per la seconda colonna
CalcID(“verticale”;2) per la 3a colonna
(ecc. se ci sono più di 3 colonne)
Ora vediamo come si presenta il metodo CalcID!
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
Se ($1= "verticale")
$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
un altro trucco …
Non è necessario creare funzioni individuali per ogni tipo di risultato richiesto. Basta inviare un parametro che determini ciò che si desidera in cambio e fare in modo che la funzione restituisca un oggetto con l’attributo richiesto riempito!
Invece di creare tre metodi (getName, getPicture, getBirthday per restituire un text, un picture e un date) e digitarli nelle espressioni di colonna…
getName(0) // getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date
… creare un singolo metodo getAttributeche restituirà un oggetto riempito in base al parametro inviato.
Domanda: Dammi il nome della persona!
Risposta: Ecco un oggetto con un attributo name contenente ciò che avete chiesto!
Ecco un esempio del metodo getAttribute :
C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
: ($1="nome")
$result .name:=contact.name // name is requested: returned as attribute of $result
: ($1="ritratto")
$result .portrait:=contact.portrait // portrait is requested: returned as attribute of $result
: ($1="compleanno")
$result .birthday:=contact.birthday // birthday is requested: returned as attribute of $result
End case
$0:=$result
Una volta scritto questo metodo, è possibile richiamarlo nelle espressioni di colonna:
getAttribute("nome").nome // getAttribute returns an object
getAttribute ("ritratto").portrait // getAttribute returns an object
getAttribute("compleanno").birthday // getAttribute returns an object
Divertitevi e date sfogo alla vostra immaginazione!