V prvním, druhém a třetím díle tohoto seriálu jsme si ukázali, jakou sílu má ORDA a jak jednoduché je spravovat spřízněné osoby pomocí jediné , vysoce rekurzivní tabulky.
Dnešní díl je zaměřen na uživatelské rozhraní, které vám pomůže vytvářet pěkně vypadající seznamy a tabulky!
Stáhnout Genealogie – díl čtvrtý
Rámečky seznamů a stylizovaný text
Seznamové boxy založené na polích a výběrech umožňují zobrazovat stylizované textové sloupce. To vyvolává otázku: „Mohu totéž udělat se seznamovými boxy založenými na kolekcích a výběrech entit?“.
Jak jste možná uhodli, odpověď zní ano, ale možná nevíte, jak na to!
Samozřejmě, pokud jsou atributy vašich entit již stylizované, pak „This.myStyledAttribute“ udělá svou práci bez jakéhokoli programování (pokud je zaškrtnuta vlastnost „multi-style“ sloupce). Pokud však máte několik atributů (jméno, křestní jméno, PSČ, telefon atd.), je vaším cílem spíše…
zobrazit spíše toto… …než toto !
Kouzlo? ne tak docela, ale STÁLE je to snadné
V obou výše uvedených případech máme seznamové pole založené na výběru entit vytvořeném pomocí DS (viz předchozí díly). Namísto zobrazení jediného atributu (např. This.name) nebo dokonce výrazu typu „This.Firstname+“ „+This.Lastname“ je výrazem sloupce metoda 4D, která vrací celý text.
V jednom je textstylizován. V druhém nikoliv.
Jednoduchý text (nestylizovaný)
$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
Stylizovaný text na základě šablony
Trik zde spočívá ve vytvoření šablony stylizovaného textu. K tomu stačí použít oblast stylizovaného textu, jak je znázorněno vlevo v ukázce níže.
Oblast vpravo je zobrazena proto, abyste si připomněli, že stylizovaný text je založen na značkách span. V rámci vlastních značek se musíte vyhnout značkám span. Řetězec „[Příjmení]“ je třeba načíst pomocí příkazu replace string. . To není možné u znaků [Příjmení] nebo [Příjmení] (tj. první znak v jiném stylu jiné barvy).
$text:=template
$text :=Replace string($text;"[název]";This.Title)
$text :=Replace string($text;"[jméno]";This.Firstname)
...
$text :=Replace string($text;"[buňka]";This.Cell)
$text :=Replace string($text;"[e-mail]";This.email)
$0: =
$text
Výběr entit vs. kolekce
„Co je to? Proč bych to měl porovnávat? Vždyť jsou úplně jiné!“
„Ano, máte pravdu. Ale počkej…“
Seznamová pole založená na výběru entit jsou skvělá. Mohou pojmout tisíce entit, zobrazit je velmi rychle a pěkně s tolika sloupci, kolik je potřeba. Mohou zobrazovat buď kompaktní data (jak je vidět výše), nebo samostatné atributy atd.
Jediné, co neumějí, je zobrazovat mřížky (matice) dat. Nemohou zobrazit skupinu osob od 1 do 100 v prvním sloupci, pak pokračovat skupinou od 101 do 200 ve druhém sloupci atd. Upřímně řečeno, seznamová pole založená na kolekci to také neumějí, nicméně existuje pěkný způsob, jak to udělat s velmi malým množstvím programování.
Řekněme, že naším cílem je zobrazit skupinu lidí takto:
Výše uvedený seznam zobrazuje pouze 9 osob, ale ve výběru entit je jich více, řekněme, že jich je 28.
Stačí trocha matematiky
Nejdříve musíme najít způsob, jak mít pro každou buňku jedinečné číslo od 0 do 28. V tomto případě je nutné, abychom se dostali k číslům, která jsou pro každou buňku jedinečná. Buď zleva doprava, po řádcích; shora dolů, nebo po sloupcích.
K tomu stačí zavolat funkci se dvěma parametry: číslem řádku a číslem sloupce. V tomto případě je NumberOfColumns 3 ($colNum od 0 do 2) a potřebný NumberOfRows je 10 ($rowNum od 0 do 9). Když to víme, je výpočet snadný:
Případ „A“: $rowNum+($colNum*NumberOfRows)
Případ „B“: ($rowNum*NumberOfColumns) + $colNum
Samotné pole seznamu bude zobrazovat kolekci vyplněnou čísly od 0 do 9, která budou představovat čísla řádků. Nyní je to ještě jednodušší; Není třeba posílat číslo řádku do funkce. Při každém volání funkce je číslo řádku reprezentováno This.value! Stačí tedy funkci poslat číslo sloupce, aby mohla vypočítat ID podle čísla řádku!
A hádejte co ? A je to! Místo toho, abyste vraceli vypočtenou hodnotu $i jako longint, stačí vrátit potřebnou informaci jako myEntity[$i].name jako text! (jen se ujistěte, že hodnota $i je nižší než. myEntities.length)
Příklad kódu pro případ „A“:
Výrazy pro sloupce budou následující
CalcID(„vertical“;0) pro 1. sloupec
CalcID(„vertical“;1) pro 2. sloupec
CalcID(„vertical“;2) pro 3. sloupec
(atd.; pokud je sloupců více než 3).
Nyní se podívejme, jak vypadá metoda 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
If ($1="vertikální")
$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
Ještě jeden trik …
Není třeba vytvářet jednotlivé funkce pro každý typ výsledku, který potřebujete. Stačí poslat parametr, který určí, co potřebujete na oplátku, a zařídit, aby vaše funkce vracela objekt s vyplněným požadovaným atributem!
Místo toho, abyste vytvořili tři metody (getName, getPicture, getBirthday, které vrátí text, picture a date) a zadali je do sloupcových výrazů …
getName(0) // getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date
… vytvořit jedinou metodu getAttribute, která vrátí objekt vyplněný podle zaslaného parametru.
Otázka: Uveďte jméno osoby!
Odpovězte: Zde je objekt s atributem name, který obsahuje to, na co jste se ptali!
Zde je příklad metody 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
Jakmile je tato metoda napsána, můžete ji volat ve sloupcových výrazech:
Název // getAttribute returns an object
getAttribute ("portrét").portrait // getAttribute returns an object
getAttribute("narozeniny").birthday // getAttribute returns an object
Bavte se a popusťte uzdu své fantazii!