Jak přejít ke 4D v14"
! Část 1" ! ! Úvod" ! 4D v14 má tolik nových rysů, že je nelze odprezentovat v jedné nebo dvou sekcích.! ! Tato sekce se soustředí jen na některé rysy ze školeni Upgrade training in detail.! ! Témata! • Získání obsahu formuláře • Některé nové funkce v list boxech • Živé monitorování vaší aplikace • On startup a On Exit pro komponenty
!
v části2 • • • •
Některé další nové funkce v list boxech Strukturované objekty v 4D Modifikace v Debug logu Přesnost reálných čísel
! ! Získání obsahu formuláře !
Minule jsem předváděl jak získat informace o metodách ve struktuře. Tentokrát ve verzi 14 ukážu způsob získávání informací z formuláře a jeho objektů.
!
Příkazy zde prezentované jsou především gettery a jsou užitečné k sledování modifikací a jejich řízení pomocí dalších programů jako Perforce • nebo Github Sledování rozdílů jednoduše pomocí TextWrangler, Oxygen editor.. •
!
Všechny prezentované příkazy (gettery) mají i své settery takže mohou nejen získávat informace, ale i provádět nastavení vlastností. Nejčastější užití
!
• Hledání objektů s určitým stylem • Hledání objektů bez stylů • Přiřazení stylu příkazem OBJECT SET STYLE SHEET • Navrácení seznamu objektů, u kterých chcete modifikovat vlastnosti v Návrháři
!
• Ověření, který objekt má přiřazen určitý výběrový seznam, nebo nepřiřazen žádný výběrový seznam • Modifikování nastavení pomocí příkazu OBJECT SET CHOICE LIST NAME
! • Totéž například s nastavením starých formátů, které chcete přepsat genericky
!
• Můžete dokonce vytvořit uživatelské formuláře za běhu založené na nastavení nějakého objektu použitím OBJECT DUPLICATE
!
!
1
! Podívejme se jak to pracuje
! Příklad 7-Forms !1. Spusťte metodu “AP_Call_Component” nebo Start Demo
!2.
Uvidíte dialogové okno pro správu a prozkoumání obsahu formuláře. Některé z objektů v tomto formuláři mají metody objektu, která nám pomohou získat podrobnější informace o obsahu formulářů databáze. Klepněte na tlačítko “Zjistit formuláře”
Horní seznam zobrazuje:
• Názvy formulářů tabulek a projektu
• Pro formuláře tabulek jsou zobrazeny číslo a název tabulky
• Pro formulář projektu je číslo tabulky "-1" a název tabulky je prázdný
!
3. Klikněte na na název formuláře v prvním seznamu
Musíte kliknout ve sloupci 3 na název formuláře. Níže uvedený seznam zobrazuje:
• Všechny objekty ve formuláři
• S číslem stránky formuláře, kde se objekt nachází
V pravém horním rohu se zobrazí snímek formuláře v podobě, jak vypadá v prostředí návrháře.
Níže naleznete XML popis formuláře. Pojďme se chvíli bavit o xml kódu.
!
4. Klikněte na název formuláře “Test_Project_Form”
Tento formulář má 2 strany a také objekty na straně 0. Tři snímky obrazovky jsou jednoduše spojeny do jednoho obrazu pomocí 4D operátorů obrazu.
V seznamu můžete také vidět, který objekt se nachází na které stránce.
!
5. Klikněte na objekt “ListBox4” v prostředním seznamu
Klikněte prosím do sloupce 1. Můžete prověřit všechny objekty definované v listboxu a zobrazit je v třetím list boxu okna průzkumníka formulářů.
!
6. Prohlédněte si xml strom
Textové proměnné zobrazené níže ukazují v XML:
- Vlastnosti formuláře
- Všechny objekty obsažené ve formuláři
- Vlastnosti objektů
Nezobrazuji všechny vlastnosti formuláře a objektů, jen ty, co jsou pro mne důležité. Můžete jednoduše vylepšit metody zobrazení a zobrazit všechny vlastnosti, které potřebujete v danou chvíli.
Používám xml pro popis. Proč?
Ne protože bych XML miloval, ale XML je jednoduše čitelný a zapisovatelný kódem, zvláště jestli jej potřebujete vytvořit a porovnat jednotlivé verze a najít rozdíly mezi jeho 2 verzemi. Každý rozdíl je modifikace provedená vývojářem v tomto formuláři.
Pro porovnání rozdílů v XML souborech existují na trhu nástroje od více firem.
!
7. Klikněte na název formuláře “AP Form_Eplorer”
!
2
8. Vysvětlení některých významů v xml stromu
To, co je obsaženo (ve zkratce):
!• Název formuláře
• Název tabulky, nebo je to formulář projektu“project form" • Nastavení výšky formuláře a počet stránek • Nastavení horizontální a vertikální velikosti a dimenzování
• Počet akcí formuláře (aktivní události formuláře, aktivovovné, ale znepřístupněné události
na stránce “Akce” vlastností formuláře, 2 nepoužité akce formuláře pro vnitřní potřebu) • Událostí formuláře pouze v případě, že formulář má metodu formuláře • Celkový počet objektů formuláře • Následovaný výčtem objektů
! V závislosti na vlastnostech různých typů objektu
!
• jméno, typ a název objektu • Jaký styl je přiřazen • Listbox se všemi jeho prvky • Statický text s orientací • Události formuláře, pokud objekt má metodu objektu
! Několik dalších odrážek týkajících se událostí formuláře, platí pro všechny objekty formuláře:
!• Objekty mají více událostí aktivních než lze nastavit v návrháři • Obecné akce pro všechny objekty ve formuláři • Sloupec listboxu: On clicked a plus 6 dalších • Název, typ a nadpis • Deaktivované události, které se nikdy nemůžou stát
!
Představte si, že přepnete typ tlačítka pro testování z 3D tlačítka na neviditelné tlačítko, které má méně události. Pokud přepnete zpět byli byste naštvaní, kdybyste museli obnovovat předchozí události ručně. To je způsob, jak 4D pracuje již několik let.
Mějte to na paměti, ale nemusíte se o to starat.
! ! 10. Nechte formulář otevřený v Uživateli a otevřete “AP_Form_Explorer” v Návrháři
! 11. Přidejte kamkoliv nové tlačítko a pak formulář uložte
! 12. Klikněte zpět na formulář v Uživateli
! 13. Přepněte formuláře (jiný formulář a zpět AP_Form_Explorer) k novému natažení
9. Klikněte na tlačítko “XML do souboru”
XML je zapsán do souboru na disku. Místo je vedle souboru struktury v složce “Resources".
upraveného formuláře do paměti
Ůpravy můžete vidět v XML souboru.
! ! 15. Uschovejte 4D a zobrazte si složku Resources příkladu 7-Forms
14. Klikněte opět na tlačítko “XML do souboru”
Můžete vidět 2 soubory téhož formuláře s různými časovými otisky. Nikdy nepište otisky času do souboru, v takovém případě by byly po porovnání rozdílů soubory a tedy formuláře vždy rozdílné.
!
3
16. Otevřete TextWrangler, Oxygen a porovnejte rozdíly dvou xml souborů
Můžete použít libovolný vámi preferovaný program.
!17. Compare files - porovnejte soubory
Můžete vidět dva rozdíly. Je zde objekt navíc (změna počtu) a je nově uveden v seznamu.
! 18. Ukončete TextWrangler, Oxygen a navraťe se zpět k 4D !Podívejme se, jak to pracuje: !1. Přepněte se do Návrháře, metoda “AP_Call_Component”
Tato modelová metoda vytvoří array s tabulkami a volá metodu startu našeho průzkumnika formulářů jak by byla volána z libovolné hostitelská databáze.
! !Formulář “AP_Form_Explorer”
2. Metoda “AP_Start_Form_Explorer”
Tato metoda nastartuje průzkumníka formulářů.
3.
Již jsme o tomto dialogu mluvili. S objekty formuláře zde naleznete i metody volané v případě interakce s tímto objektem.
!
4. Metoda “AP_Init_Arrays”
Tato metoda ve formuláři našeho prúzkumníka:
- Inicializuje arraye list boxu pro zobrazení informace.
- Použije již existující příkaz FORM GET NAMES k získání názvů formulářů projektu
- Parametr * jímž může být volán z komponenty pro formuláře v hostitelské databázi získá názvy formulářů tabulek
!5.
Metoda “AP_Create_XML”
Tato metoda udělá hlavní práci, když kliknete na název formuláře v prvním listboxu:
- Vytvoří screenshot
- Provede sjednocení obrázků v případě vícestránkového formuláře
- Formulář je natažen do paměti k získání objektů
- Užije FORM LOAD
- Starý název příkazu byl OPEN PRINTING FORM k zavedení formuláře a tisku v něm
obsažených objektů
- Bez volání OPEN PRINTING JOB je formulář jen natažen do paměti není spuštěna metoda
On Load
- Parametr * je k zavedení formulářů hostitelské databáze, když je voláme z komponenty
- Je vytvořem xml kód
- Uvolní se paměť při FORM UNLOAD
- V paměti je vytvořen xml strom s popisem a s některými informacemi týkajícími se
samotného formuláře jako název, velikost, aktivní události pomocí nových getterů jako
OBJECT GET EVENTS
- prázdný parametr “” k získání aktivních událostí samotného zavedeného formuláře
- název objektu jako parametr k získání objektových událostí formuláře
- Získá názvy všech objektů ve formuláři, pomocí nového příkazu FORM GET OBJECTS
- For smyčka přes všechny objekty
- Typ objektů je určen novým příkazem OBJECT Get type
- V závislosti na typu objektu užije množství existujících a nových getterů a přidá položky
nastavení do xml stromu
- Je dostupných mnohem více typů objektů k zjištění všech možných objektů formuláře
!
- V případě, že je to List box získá všechny elementy v list boxu užitím nového příkazu
LISTBOX GET OBJECT
- Na konci je xml strom vepsán do textové proměnné, aby mohl být zobrazen
4
6. Metoda “AP_Get_LiBo_Content”
Tato metoda se spustí, kliknete-li v sloupci 1 druhého listboxu:
- jestli je kliknutý objekt listboxem je vyplněn 3. listbox průzkumníka všemi objekty
zkoumaného listboxu
- zde není vytvořen xml, elementy listboxu jsou pouze zobrazeny
!
7. Metoda “AP_Create_XML_File”
XML strom je exportován do externího souboru na disku k použití v programech řízení verzí
!! Jak již bylo řečeno, tento příklad je v tomto stavu použitelný, ale není zcela kompletní. Je to ale dobrý návod, který může být rozšířen podle vašich potřeb. ! Nakonec ještě jednu ukázku toho, když je předchozí příklad komponentou ! Příklad 8-Invoice ! 1. Uzavřete formulář a přepněte se do Návrháře
! 2. Spusťte metodu “Call”
Tato metoda sestaví array s pointery a otevře průzkumníka obsahu formuláře
! 3. Klepněte na tlačítko “Zjistit formuláře”
Můžete vidět formuláře 4 tabulkové databáze.
! 4. Klikněte na název formuláře tabulky
Vidíte screenshot a xml popis formuláře. !Vezměte prosím na vědomí, že při práci s komponentou můžete zkoumat pouze formuláře tabulek v hostitelské databázi. Komponenta nemá přístup k formulářům projektu hostitelské databáze. Formuláře projektu nejsou založeny na tabulkách, a proto nejsou známy komponentám. Při použití byste obdrželi syntaktickou chybu - “formulář nebyl nalezen”.
!Důvodem tohoto chování je přístup k hostitelským objektům pomocí ukazatele tabulky a formuláře projektů nemají tabulku. !Ale toto demo je jen malá komponenta s pouze 1 formulářem a několika metodami. A používá se pouze ve vývojovém prostředí. Je tedy jednoduché přetáhnout potřebné objekty do hostitelské databáze přímo.
!! !! !
5
Nové rysy List boxů
!
4D v2004 byly představeny listboxy jako nový nástroj pro zobrazení dat modernějším způsobem, než pomocí formulářů seznamu nebo rolovacích oblastí. První listboxy mohli být použity pouze pro zobrazení dat z array. Brzy spousta vývojářů 4D v celém světě posílala své požadavky na nové funkce, co jiného by ještě šlo dělat s listboxy.
!Vedle některých dalších věcí ve v11 jsme doplnili listboxy také o zobrazení výběrů záznamů a
pojmenovaných výběrů, stejně jako výplnění Listboxů dynamicky na základě SQL request. Tímto způsobem bylo možné, zobrazit ve formuláři více než jeden listbox s různými výběry ze stejné tabulky. A stále bylo mnoho požadavků na nové funkce.
!V v12 jsme zavedli hierarchické seznamy a tisk listboxů. Ještě stále byly požadavky na nové funkce.
!4D v13 reorganizuje vnitřní způsob fungování listboxů úplně. Takto bylo možné realizovat nové
funkce snadněji než dříve. Opět jsme představili spoustu nových funkcí.Nejdůležitější byly zápatí s výpočty, zamčené sloupce, dynamická výška záhlaví a zápatí, stejně jako buňka dostupná pro vstup.
!Ale pojďme se nyní podívat na nové funkce pro V14, které jsou: • Styly buňky listboxu • Duplikace sloupce listboxu • Automatické akce pro listboxy • Zalamování slov v buňkách listboxu Některé budou zmíněnny až v další části předvedení.
!! Styly v buňkách listboxu !Až do 4D v13 listboxy mohly být formátovány po řadách nebo sloupcích a proveditelné to bylo
pouze v prostředí návrháře, nebo pomocí array stylu pro řady. Každý řádek nebo sloupec může mít jiný formát, ale všechny buňky určité řady nebo sloupce mají stejný formát.
!S v14 jsou nyní 3 možná řešení pro formátování buněk:
!• Array přiřazený v návrhovém režimu pro každý sloupec (tím každou buňku zvlášť) • Array přiřazený k sloupci listboxu za běhu • Přístup do buňky přímo programováním
!
Příklad 2-LiBo_Cells_v14
1.
Spusťte DB
6
2.Otevřete formulář “Cell_Format” v Návrháři
Místo, kde najít “array stylů" se změnil. Ve 4D v13: • Tyto arraye mohly být definovány pouze pro listbox samotný! • Byly definovány v tématu List Box v seznamu vlastností! • Žádný array stylu neexistoval pro sloupce
!Ve V14:
• Ve vlastnostech list boxu lze stále najít skrytý array řad!
• Nyní lze najít Array Stylu řad a Array barvy písma řad v tématu Text
a Array Barvy pozadí řad v tématu Pozadí a ohraničení!
! ! !
! Můžete si všimnout, že v tomto demu nejsou k samotnému listboxu přiřazeny žádné arraye stylů.
!
7
3. Zobrazte seznam vlastností pro jeden sloupec
!
Podíváte-li se na vlastnosti sloupce, uvidíte, že nyní každý sloupec může mít své vlastní array pro: • Styl řádek! • Barvu písma řádek! • Barvu pozadí řádek!
! !
4. Zobrazte metodu objektu tlačítka “Inicializovat/Odstranit” • S v13 jsme museli deklarovat array stylu řad! • S v14 nyní můžeme deklarovat arraye stylů sloupců! • Hodnoty jsou přiřazeny k sloupcům! • Arraye stylu jsou definovány tak, aby přijaly hodnoty array přiřazené v návrhářském režimu!
!
!
Vezměte prosím na vědomí, že jsem nepřejmenoval array "Row" na "Col". Takže nebylo nutné měnit programování (oproti demu v13).!
5. Zobrazte metodu objektu tlačítka “Zděděná barva”
!
• K obnově nastavení definovanému v prostředí návrháře můžete nyní použít konstantu
Listbox inherited a nemusíte použít -255!
6. Spusťe metodu “Start_Demo” 7. Stiskněte tlačítko “Inicializuj/Odstraň” Listbox má tentýž vzhled jako bychom užili array řad na úrovni listboxu.!
!
8. Tlačítko “Barva písma C1” Barevný text je pouze ve sloupci 1.!
8
! 9. Tlačítko “Styl písma C2”
!
Písmo se stylem je pouze ve sloupci 2.!
10. Tlačítko “Barva pozadí C3” Pozadí je změněno pouze ve sloupci 3.!
!
11. Tlačítko “Zděděná barva pozadí” Zde můžete resetovat sloupec C3 k hodnotám nastaveným v prostředí návrháře. Ve všech tlačítkách “Zděděné..” resetujeme pouze buňky 5 až 15.!
!
12. Tlačítko “Gradient”
!
A tři poslední tlačítka pracují rovněž jako v prvním případě. S rozdílem, že nyní každá buňka ve sloupci má svůj individuální formát.!
13. Tlačítko “Mix všeho” několikrát 14. Tlačítko “Animovat” 15. Tlačítko “Animovat” opět pro zastavení animace To je mnohem lepší než u v13, ve v14 se může formátovat listbox na bázi buněk. Stejně jako před tím lze arraye upravit individuálně za běhu, ale stále v tomto přístupu musí být definovány v prostředí návrháře staticky, natvrdo.!
! !
Nyní se pojďme podívat na další nové funkce v V14, jak přiřadit array stylu za běhu. To znamená, že nemáme žádný array definovaný pro listbox v prostředí návrháře, ani pro listbox celkem a ani pro sloupce. Arraye jsou vytvořeny, naplněny hodnotami a přiřazeny programováním, až když je potřebujeme.!
!
1. Přepněte na záložku “Array vytvořený dynamicky” Zde můžete vidět tentýž listbox jako předtím
!
2. Stiskněte postupně všechna 4 tlačítka To je to co jsem chtěl ukázat, Je rozdíl mezi chováním statických array z Návrháře a dynamickými přiřazenými za běhu v runtime.!
!
3. Stiskněte tlačítko “Vymazat přiřazená array”, možno s krokováním Můžete rovněž vymazat/zrušit přiřazení array stylů v listboxu.
!
4. Přepněte se do prostředí návrháře Vidíte tentýž listbox, co jsme užívali předtím.
!
9
5. Metoda objektu tlačítka “Inicializuj/Odstraň” • První část je stejná, vytvoření a dimenzování array pro sloupce! • Dále se arraye naplní hodnotami a zděděnými hodnotami stylu! • Nakonec jsou array přiřazeny novým příkazem!
!
O LIST BOX SET ARRAYS! O Se 3 možnými konstantami pro styl písma, barvu písma a barvu pozadí
!
!
• Přiřazení arraye pomocí ukazatelů!
6. Metoda objektu tlačítka “Barva písma C1” Další 3 metody objektů k úpravám hodnot array pracují stejně jako předchozí
!
7. Metoda objektu tlačítka “Vymazat přiřazená array” Pokud zavřete formulář a listbox již není v paměti, pak přiřazení již není platné. Ale pokud chcete, můžete také odstranit přiřazení přiřazením nulového ukazatele místo array.
! Mějte na paměti, že toto rozhodně nevymaže samotné array z paměti.! !
Proč je opravdu užitečné přiřadit arraye listboxu v běhu? Dám vám 2 velice jednoduché příklady.!
!
Někteří vývojáři používají listboxy s array definujícími 0 sloupců v režimu návrhu. Přidávají nové sloupce pomocí příkazu LISTBOX INSERT COLUMN. Protože tyto dynamické arraye neexistují v prostředí návrháře nelze jim v návrháři přiřadit array stylů. A přidání sloupce příkazem
LISTBOX INSERT COLUMN automaticky nepřidá array stylu.!
!
Další příklad je také listbox s 0 sloupci a vyplnění tohoto seznamu příkazem SQL SELECT. Pojďme se podívat na další příklad.!
!
1. Přepněte se na záložku “Barva buňky SQL LiBo”
!
2. Sliskněte tlačítko “Naplnit SQL” A máme nějaká data k předvedení, co se stane s buňkami v tomto případě.
!
3. Klepněte na tlačítko “Získat arraye LiBo” 4D vytvořila sloupce dynamicky. Každý sloupec má určitou lokální proměnnou. Zde určíme názvy proměnných. Demo má ukázat pouze to, že můžeme pracovat s dynamicky vytvořenými sloupci, jen musíme zjistit, jak se jmenují.
!
4. Stiskněte tlačítko “Barva Col 3” A tady to máme. Rozdílné formátování a barvy pozadí v buňkách dynamicky tvořených listboxů.
!
5. Přepněte se do prostředí návrháře
!
6. Metoda objektu tlačítka “Barva Col 3” 10
Programování je stejné jako v předchozích příkladech. Arraye stylu jsou vyplněny ve smyčce. Dále jsou arraye přiřazeny za běhu. !
!
Buďte obezřetní co se týče druhu array, pokud jde o paměťový rozsah. Nemusí to být meziprocesní arraye. Rovněž arraye procesu jsou možné.Neměli by jste však používat lokální array. Proč? !
! !
V metodě, která skončí i arraye dále neexistují a listbox bez array stylů nemůže zobrazit žádný styl.!
Dále můžeme nastavit styly řádek nebo sloupců listboxu bez array. Zde jsou některé nové příkazy pro nastavení a získání toho, co bylo nastaveno.!
!
1. Přepněte se na záložku “Vytvořeno programem”
!
2. Klepněte na tlačítko “Nastavit hodnoty sloupců”`` Máme nějaká data k ukázání toho co se stane.
!
3. Klepněte na tlačítko “Barva písma R-1” Zde vidíte starý způsob práce založený na řadách.
!
4. Stiskněte tlačítko “Reset barvy řad” Resetuje barvu písma.
!
5. Klepněte na tlačítko “Barva písma C1” Nebo formátujeme některé z buněk, jak je to nově ve 4Dv14.
!
6. Udělejte tytéž kroky pro styl písma a barvu pozadí To vypadá přesně jako to, co jsme vytvořili předtím.
!
7. Stiskněte tlačítko “Kontrola” Sledujte Alert, myslíte si, že pracujete bez array? Ano, vy ano, ale 4D ne.
!
8. Přepněte se do prostředí návrháře
!
9. Metoda objektu tlačítka “Barva písma R-1” V tomto případě není nutné se zabývat definováním array, plněním jejich hodnoty a přiřazováním, jejich hodnoty řádkům nebo sloupcům.!
!
Můžete jednoduše použít nový příkaz LISTBOX SET ROW COLOR. S 5. parametrem, kterým vyberete, jestli chcete nastavit barvu písma nebo barvu pozadí.!
!
11
Čtvrtým parametrem rozhodujete, jestli chcete nastavit určitou barvu, nebo přepnout zpět do barvy definované v prostředí návrháře.
!
10. Metoda objektu tlačítka “Barva písma C1” Podle toho, zda je parametr 2 v příkazu listbox nebo sloupec příkaz pracuje na řady nebo! buňky sloupce. To je velmi snadné použití.!
!
Chcete-li nastavit styl písma je nový příkaz LISTBOX SET ROW FONT STYLE bez dalšího (5tého) parametru, ale také je k použití pro listboxy nebo jejich buňky sloupce.
!
11. Metoda objektu tlačítka “Kontrola” A konečně se podívejme na OMetodu s alertem.!
!
Pokud nechcete pracovat s array stylů, použijte nové příkazy. Ale 4D se musí zabývat styly listboxů a pak použije arraye interně.!
!
Z interního názvu můžete vidět, že jsou tyto arraye vytvořeny v běhu stejným způsobem jako 4D používá sloupcové array dynamicky jako v případě SQL listboxů.!
! A samozřejmě jsou zde i gettery pro tyto nové příkazy.! ! ! !
Předtím, než se mě někdo zeptá. Ano, je možné míchat práci s array a práci s novými příkazy. Ale pro mě to nemá moc smysl. Myslím si, že byste měli pracovat jedním nebo druhým způsobem. Neexistuje žádný přínos při míchání obou způsobů kromě vytváření zmatku.!
Hierarchie definic stylů Také v v13 byla určitá hierarchie jak a na které místo definovat styl a barvu a jakou mají vůči sobě prioritu. Nyní s V14 existuje více možností, jak definovat styly a pořadí priorit je trochu složitější.!
!
1. Přepněte na záložku “Hierarchie stylů” To co budeme probírat, se týká stylů písma, barvy písma a barvy pozadí.!
!
2. Klepněte na tlačítko “Vyplnit” Máme zde listbox, nastavený na prosté písmo pomocí zatrhávacích okének ve vlastnostech.!
!
To znamená, že všechny řádky, sloupce či buňky jsou zobrazeny v prostém písmu.!
12
!
Druhý sloupec je ale podle vlastností v kurzívě!
Jak můžete vidět je 2. sloupec opravdu v kurzívě, zatímco první stále zůstává v prostém písmu, druhý sloupec je přepsán proti nastavení celého listboxu. To znamená, že nastavení sloupce má vyšší prioritu než nastavení celého listboxu.
!
3. Klepněte na tlačítko “Nastavit řady Libo…” Tady je listboxu přiřazen array nastavení stylů písma.!
!
Použití array k nastavení písma Listboxu má přednost před všemi nastaveními provedenými
v seznamu vlastností v návrhářském režimu. Nyní máme první sloupec prostým písmem, druhý sloupec kurzívou a řádek 6 tučně. Kurzíva v nastavení buňky B6 je přepsána:
!
! ! ! !
4. Klepněte na tlačítko “Nastavit sloupce Libo…” 2. sloupec má také přiřazen array stylů písma!
13
!
Jestli nastavíme 6 prvek tohoto array na tučné a podtržené pouze 6 prvek tohoto sloupce bude takto nastaven, ostatní buňky budou nezměněny. Nastavení buňky sloupce má vyšší prioritu.
!
!
Ještě vyšší prioritu má, jestliže k formátování víceřádkových a vícestylových buněk použijeme span tag (značky rozpětí)
!
5. Klepněte na tlačítko “Odstranit” 6. Klepněte na “Nastavení sloupce Libo…” a potom “Nastavení řady Libo…” Provedeno je nastavení vyšší úrovně a pak nastavení nižší úrovně - vyšší úroveň vždy vyhrává. Buňka 6 sloupce 2. sloupce zůstane vždy tučně a podtržena. Podtržení není přepsáno.!
! !
S těmito znalostmi nyní si můžete dělat tak složité formátování, jak budete potřebovat s využitím všech možností, a hrát si s prioritními pravidly.!
Chování stylů ve vícestylových buňkách Jak už jsem říkal předtím, styl přidělený na úrovni s nižší prioritou je zcela ignorován. To je trochu jiné v případě multi-stylových buněk a práce s tagy rozpětí.!
1.
!
Přepněte se na záložku “Užití multi textu”
2. Klepněte na tlačítko “Vyplnit” Máme tentýž listbox jak předtím, 2. sloupec je nastaven v kurzívě v návrháři a možnost multi styl je aktivní (zatrženo Vícestylová v seznamu vlastností sloupce).
!
3. Klepněte na tlačítko “Nastavit span…” Text v buňce B5 je změněn programem. Styl je nastaven na červeně a podtrženě. Není nastaven na kurzívu, takže by měl být normálně v podtrženém písmu.!
!
14
!
Pouze v případě vícestylové buňky jsou spojeny nastavení span tagů a nastavení nižší úroveně priority. Ale nastavení z prostředí návrháře není zahrnuto jako span tag v buňce. Takže buďte opatrní, pokud používáte tuto kombinaci. OBJECT Get styled text nebude vracet nastavení provedené v prostředí návrháře, nebo arrayi stylů.
! !
Styly hierarchických listboxů Styly v hierarchických listboxech pracují principiálně stejně jako styly v normálních listboxech. Následující demo vám ukáže některá specifika, jež byste měli znát.!
!
1.
(Po každém z následujích tlačítek užijte tlačítko “Odstanit”)
2.
Přepněte na záložku “Styly HLB” Tady vidíte 2 malé listboxy nižší je hierarchický. Obsah obou je stejný, abychom mohli demonstrovat rozdíly v používání stylů na tyto listboxy.!
3.
!
Klepněte na tlačítko “Styl řada 2” Chete-li použít styl jen na určitý řádek, např. řádek 2, můžete to udělat jednoduše pomocí array stylu, nebo samozřejmě novými příkazy, jako je LISTBOX SET ROW FONT STYLE.!
!
V normálním listboxu je ovlivněn celý řádek, v HLB pouze sloupce, které nejsou zahrnuty v úrovni hierarchií.!
4.
!
Klepněte na tlačítko “Styl sl. 2” Chcete-li nastavit styl prvků v hierarchických úrovních, arraye stylů nefungují. V tomto případě použijte příkaz OBJECT SET FONT STYLE.!
!
I to je zřejmé. Nastavení stylu sloupce 2 v horní části seznamu ovlivňuje úroveň 2 hierarchie v HLB. Jsou zobrazeny tučně pouze položky region.
Klepněte na tlačítko “Max populace zeleně”! Buňka maximální populace dostane zelenou barvou. V obou seznamech je stejný prvek, ale v různých řadách.!
!
Zde opět můžete pracovat s array nebo novými příkazy, protože tento prvek není v žádné úrovni hierarchie.!
5.
!
Klepněte na tlačítko “Styl 1. buňky v sl. 1” 15
V neposlední řadě chceme nastavit 1. prvek v první řadě na tučně a tady vidíme velký rozdíl.!
!
V horním seznamu je ovlivněn 1 prvek v řadě 1. V dolním seznamu 1 prvek v 1. řadě patří do hierarchie. Jinými slovy zde to bude řádek 3, který do hierarchie nepatří.!
!
Při pohledu na metodu objektu je vidět, že není možné použít ani array stylu ani nový příkaz listboxu, protože prvek je uvnitř úrovně hierarchie.!
6.
! Ale jak můžete tento problém vyřešit? Použití span tagu v obsahu buňky.! !
Uzavřete formulář
! !
Tisk listboxů se styly Poslední věc, kterou chceme ukázat, je tisk listboxů se styly.!
1.
!
Spusťte metodu “Start_Print” Máme jednoduchý formulář s listboxem a několika tlačítky!
2.
!
Stiskněte tlačítko “Naplnit LiBo” Tento listbox má 2 sloupce s nějakými hodnotami.!
3.
!
Klepněte na tlačítko “Vybarvit” Podle určitých pravidel jsou některé hodnoty vybarveny, aby se zdůraznila jejich důležitost.!
4.
!
Klepněte na tlačítko “Tisk” a zobrazte jako PDF v náhledu. Na naplnění listboxu hodnotami, není nic nového, takže jsme se nestarali o metodu objektu, která vyplní listbox na obrazovce.!
5.
!
Uzavřete náhled a formulář a otevřete formulář “Print” v návrháři Zde využíváme jeden z nových příkazů pro nastavení seznamu stylů bez použití array v programování.!
6.
!
Metoda objektu tlačítka “Vybarvit” Tady používáme jeden z nových příkazů k nastavení stylů listboxu bez použití arrayů v programování.!
7.
!
Metoda objektu tlačítka “Tisk” Listbox je tištěn v oddělené tiskové úloze pomocí příkazu Print object.!
8.
!
Metoda objektu listboxu Programování vyplní listbox hodnotami, záhlaví a zápatí pro tisk je přesně stejné jako u formuláře na obrazovku.!
!
Proč musíme vyplnit listbox podruhé?!
16
!
Teoreticky máme 2 instance stejného listboxu v hlavní paměti. Jedena instance listboxu se používá pro zobrazení a jedena pro tisk. Ačkoliv mají stejné názvy, existují dvakrát. Proto obě instance musí být naplněny obsahem.!
!
Na konci metody můžete vidět, jak jsou definovány styly. Vezměte prosím na vědomí, že styl je definován pomocí array. Nové příkazy k definování stylů bez použití array nebudou při tisku fungovat.!
!
Proč? Instance tisk tohoto listboxu nežije na obrazovce. Takže "$" arraye stylu nemohou být vytvořeny samotnou 4D. Musíme pracovat s reálně exitujícími array.!
! ! !
Živé sledování vaší aplikace
!4D V14 představuje nový nástroj sledování problémů tzv "Real Time Monitor”. Sledování v
reálném čase vám ukáže, co se děje ve vaší databázi, když běží v jednom uživateli nebo na
4D Server. To vám může pomoci, když:
!• Vaše databáze je celkově pomalá
• 4D Clienti mají dlouhou dobu reakce na své požadavky • 4D Clienti se zdají viset
!
Příklad “23-Real_time”
1.
Spusťte příklad pomocí 4D Serveru
2.
Přepněte na záložku “Monitor reálného času”
Zde můžete vidět nový monitor reálného času. Zobrazuje nejpoužívanější a časově nejnáročnější operace jež běží. V tuto chvíli se nic nestane, protože nic na 4D Serveru neběží.
!
3. Připojte se pomocí 4D Clienta 4. Menu “Soubor”, příkaz “Zatížit DB”
Tento příkaz nabídky zahájí tvoření záznamů, mazání, vyhledávání a třídění. Pokud existuje více záznamů v datovém souboru příklad běží pomaleji. Ve vzorku najdete prázdný datový soubor. Může trvat nějakou dobu, než se při své práci zpomalí.
5. Stiskněte tlačítko “Pauza”
Mějte na paměti, že tato záložka zpomaluje 4D Server. Neměli byste ji požívat bezdůvodně.
17
Chcete-li se podrobně podívat na položky, můžete zastavit aktualizace displeje. Můžete sledovat:
• Čas zahájení provozu
• Jak dlouho operace trvá
• Jaké operace dělá
To vám může dát představu, co se děje s vaší databází a možná budete moci vyřešit problém při pohledu do svého kódu.
Pokud to nepomůže, obraťte se na 4D podporu se žádostí o pomoc. Ale co můžete dát hochům z podpory? Screen shot? Ano. Od verze v14R4 lze sejmout operace do schránky:
6. Přepněte se do 4D Clienta a nabídky “Soubor”, položka “Monitor”
Toto je můj vlastní monitor
18
7. Stiskněte tlačítko “Sejmout”
Takto vypadá. Je detailnější než obrazovka monitoru rálného času. Můžete vidět následující informace:
• Message/Zpráva: to, co dělá operace
• MaxValue/MaxHodnota: celkový počet záznamů, které se zpracovávají
• CurrentValue/SočasnáHodnota: počet záznamů zpracovávaných teď
• Interruptible/Přerušitelná: v případě, že operace může být přerušena (1), nebo ne (0)
• Remote/Vzdálená: operace běží na vzdáleném stroji (0), nebo ne (1)
• UUID: jedinečný identifikátor pro operaci
• TaskID/ÚlohaID: číslo procesu operace
• StartTime/ČasPočátku: datum a čas, kdy je zahájena operace
• Duration/Trvání: jak dlouho operace trvá až do současnosti
Kromě toho je možné mít tzv dílčí operace. Tato situace může nastat v případě, že nový záznam je uložen v tabulce s jedinečným, ale ne indexovaným polem. Kontrola jedinečnosti běží jako dílčí operace pro hlavní operaci "Uložit záznam".
!
8. Uzavřete monitor, přepněte se do návrháře, metoda projektu “Get_Activity”
Tato metoda získává obrázek detailní aktivity operací ve vaší databázi:
• GET AKTIVITY SNAPSHOT vrátí data potřebná pro každou operaci
• jako array objektů
• nebo jako "normální" jednotlivá array příslušných typů
• Převod do čitelného řetězece JSON stringify array
Zkopírujte tento řetězec do e-mailu a můžete jej poslat hochům z podpory. Pokud možno z anglické verze 4D.
! “ON STARTUP” a “ON EXIT” v komponentách
!Od verze v11 má 4D novou koncepci komponent. Ale neděste se, nebudu vysvětlovat tento koncept znovu. !Až do v13 včetně, mimo jiných věcí, nebylo možné volat metody databáze uvnitř komponenty. Takže nebyla žádná šance dělat inicializace nebo de-inicializace v komponentě. !Jako vývojář komponenty jste z tohoto důvodu museli psát a sdílet metody. Vývojář hostitelské databáze musel volat tyto metody z komponenty v pravý čas se správnými parametry, aby byla komponenta připravena ke spuštění.
!Díky této nové funkci ve v14 by teď měla být komponenta schopna se inicializovat. Nemusí to být provedeno z venku z hostitelské databáze. !Stále komponenty nemohou mít metody databáze On Startup a On Exit. Ale my jsme integrovali
novou metodu databáze On Host Database Event . Tato metoda může běžet uvnitř komponenty, pokud je načtena při spuštění databáze hostitele. Tímto způsobem může být kód spuštěn uvnitř komponenty.
!
19
Můžete si to představit jako funkci “auto run” DVD, které je možné zapnout nebo vypnout. Také v 4D z bezpečnostních důvodů je nutné výslovně uvést, že komponenta může spustit kód z metody databáze “On Host Databese Event” při startu:
!
Pokud aktivujete toto nastavení, hostitelská databáze umožní komponentě se inicializovat. Pokud vypnete toto nastavení, komponenta musí být inicializována jako předtím. Podělit se o potřebné metody komponent a volat je v hostitelské databázi samotné.
!
Příklad “14-Components”
1. Všimněte si alertu při startu databáze
• On before host database startup : Alert “Před startem hostitelské databáze”. Tato událost je generována v komponentě před spuštěním On Startup v hostitelské db
• Hostitelská databáze nyní startuje (On Startup) : On Startup hostitelské db běží
• On after host database startup: Alert “Po startu hostitelské databáze”. Poté co On Startup hostitelské db je dokončena, je tato událost generována v komponentě
To znamená, že budete mít na výběr, pokud potřebujete udělat nějaké inicializace před tím, než hostitel začne, nebo při spuštění hostitele.
2. Přepněme se do prostředí návrháře a podívejme se na metody komponenty
Žádná metoda této komponenty není sdílena k spuštění v hostitelské databázi
3. Podívejme se na metody On Startup a On Exit
Máme zde Alert, že metody databáze v hostitelské databázi jsou právě spuštěny.
4. Podívejme se na metodu On Host Database Event
Jak můžeme vidět, tato metoda v hostitelské databázi je zcela prázdná
5. Ukončete databázi
• On before host database exit : Alert “Před koncem hostitelské databáze”. Tato událost je generována v komponentě před spuštěním On Exit v hostitelském db
• Hostitelská databáze nyní končí (On Exit) : On Exit hostitelského db běží
• On after host database exit : Aalert “Po konci hostitelské databáze”. Poté, co On Exit hostitelské db je dokončena, tato událost je generována v komponentě
20
Také pro de-inicializaci se můžete rozhodnout, zda je nutná před nebo po de-inicializaci hostitele.
6. Nastartujte komponentu z vnitřku balíčku 7. Otevřete metodu databáze “On Host Database Event”
V parametru $1 databáze hostitele říká komponentě stav začátku nebo konce procesu. Po získání těchto informací může komponenta reagovat odpovídajícím způsobem.
Všechno funguje synchronně. To znamená, že hostitel a komponenta budou čekat na sebe navzájem, než se bude pokračovat dál.
21