návod na úpravu skriptů, naleznete zde
Transkript
ZMĚNY VE SKRIPTOVÁNÍ MEZI VERZEMI 14.51(XE2) A VERZEMI PŘEDCHOZÍMI (14.02 A NIŽŠÍMI) 1. Obsah 1. OBSAH .......................................................................................................................................... 2 2. ZMĚNY VE SKRIPTOVÁNÍ OD VERZE ABRA GX 14.51 ........................................................... 3 2.1 ZASTARALÉ SKRIPTY Z PŘEDCHOZÍCH VERZÍ ................................................................................... 3 2.2 ZAVEDENÍ UNICODE - ŘETĚZCŮ ........................................................................................................... 3 2.2.1 KÓDOVÁNÍ UNICODE ........................................................................................................................... 3 2.2.2 ODSTRANĚNÍ TYPU ANSISTRING ....................................................................................................... 4 3. ATRIBUTY PRVKŮ SKRIPTOVÁNÍ ............................................................................................. 6 3.1 DEPRECATED .......................................................................................................................................... 6 3.2 ÚPRAVA SKRIPTŮ ZA POMOCI NOVÝCH ATRIBUTŮ ........................................................................... 6 4. NÁSTROJ PRO ZJIŠTĚNÍ ZMĚN DEFINIC SKRIPTOVÁNÍ MEZI VERZEMI (DEFSCOMP) ..... 7 5. DÍLČÍ ZMĚNY VE SKRIPTOVÁNÍ ................................................................................................ 8 5.1 PŘETYPOVÁNÍ ......................................................................................................................................... 8 5.2 TŘÍDA TENCODING ................................................................................................................................. 8 5.3 FUNKCE ENCODEBASE64, DECODEBASE64 ....................................................................................... 9 5.4 ZMĚNY VE STREAMECH ...................................................................................................................... 10 5.5 ZMĚNY V TISKU A EXPORTU ............................................................................................................... 10 5.5.1 FUNKCE PRO TISK A EXPORT .......................................................................................................... 10 5.5.2 UKONČENÍ PODPORY FORMÁTU ARP ............................................................................................. 11 5.6 ODSTRANĚNÍ TCUSTOM- KOMPONENT ............................................................................................ 11 5.7 PROPERTY DATAFIELD A DATASOURCE ........................................................................................... 11 5.8 TŘÍDA TCOMBOBOX ............................................................................................................................. 11 5.9 TŘÍDA TLABEL JAKO NÁHRADA ZA TDBTEXT A TNXDBTEXT .......................................................... 11 5.10 VÝČTOVÉ TYPY ..................................................................................................................................... 12 5.11 POUŽITÍ FUNKCE NXGETSITEAPPFORM ........................................................................................... 12 5.12 POUŽITÍ TŘÍDY TZIPFILE (NÁHRADA ZA TZIPMASTER19) ................................................................ 12 5.13 ZRUŠENÍ FUNKCE NXFINDCHILDCONTROLBYCLASS ...................................................................... 13 5.14 REST WEBOVÉ SLUŽBY ....................................................................................................................... 13 5.15 METODA SHOW TŘÍDY TCONTROL A JEJÍCH POTOMKŮ ................................................................. 16 5.16 ZMĚNY V METODÁCH PRO KOMUNIKACI S EXTERNÍMI KNIHOVNAMI DLL ................................... 16 5.17 ZMĚNA POUŽITÍ ENCODINGU V TŘÍDĚ TNXSCRIPTINGXMLWRAPPER .......................................... 16 5.18 POZNÁMKY K PRÁCI S FORMULÁŘI VE SKRIPTOVÁNÍ ..................................................................... 17 5.19 PROPERTA FONT.COLOR V ABRA-VZHLEDU .................................................................................... 17 6. BINÁRNÍ DATA VS. STRING ..................................................................................................... 18 7. PŘÍLOHA Č. 1: PŘEHLED ODSTRANĚNÝCH POLOŽEK K VERZI 14.51.08 ......................... 19 Stránka 2 z 22 2. Změny ve skriptování od verze ABRA Gx 14.51 Změna prostředí, kódování, komponent atd., k níž došlo v této verzi v rámci přechodu na nové vývojové prostředí RAD studio XE2 (z původního Delphi7), se dotýká i skriptování. Je třeba převést všechny používané balíčky skriptů, tj. zkontrolovat je, dle potřeby upravit a nově zkompilovat. Tento dokument se věnuje popisu nejčastějších obtíží při přechodu skriptů na novou verzi. 2.1 Zastaralé skripty z předchozích verzí Došlo ke zcela zásadním změnám v definicích různých prvků skriptování a způsob jejich použití se v určitých případech může velice podstatně lišit od předchozích verzí ABRA Gx. Hrozí tedy nebezpečí, že stávající skripty by bez řádné kontroly a kompilace na nové verzi 14.51 (a novějších) mohly mít fatální následky pro uživatele (nemožnost použití funkcí, chybové hlášky, hrozba porušení konzistence dat, atd.). Není proto možné tyto původní skripty ze starších verzí ponechat funkční do verze 14.51. Všechny původní skripty ze starších verzí ABRA Gx (před verzí 14.51), jsou při procesu update automaticky nastaveny jako „zastaralé“ a je zamezeno jejich spuštění. Při pokusu o spuštění zastaralých skriptů se objevuje chyba „Verze kompilace je zastaralá. Balíček již není platný a je třeba jej znovu zkompilovat, aby byl funkční“. Pokud je zastaralý skript spojen s agendou, objevuje se při otevření takové skriptované agendy chyba „Tohoto zástupce již nelze spustit“. Otázka: Jak správně ošetřit zastaralý skript, aby byl zase funkční? Každý existující skript zkompilovaný pod staršími verzemi ABRA Gx je třeba znovu zkompilovat pod novou verzí a ověřit jeho funkčnost. Kompilace odhalí většinu problémů, které plynou z rozdílů v definicích skriptování mezi verzemi. Na některé další možné problémy, které kompilace neodhalí, upozorňujeme v 5. kapitole. Po úspěšné kompilaci zastaralého skriptu tedy doporučujeme ověřit jeho funkčnost právě s ohledem na změny zmíněné v této kapitole. Tento proces může být náročnější na čas a může vyžadovat odborný zásah. Proto také doporučujeme vyhradit na proces přechodu na verzi 14.51 (a novější) z verze 13.01 (a starší) dostatek času a nejdříve skripty vyzkoušet na testovací verzi ABRA Gx před ostrým nasazením do produkčního systému. Otázka: Jak zjistím, jaké skripty v agendě Balíčky skriptů jsou zastaralé? Po update na verzi 14.51 (a novější) jsou všechny stávající skripty zastaralé. Na řádcích Balíčků skriptů (záložka Detail – sub-záložka Projekt) je nový příznak „Verze kompilace skriptu“, který nabývá hodnot „Zastaralá“ a „Aktuální“. Za tyto hodnoty lze omezovat na záložce Omezení – Řádky – Aktuální verze kompilace skriptu. 2.2 Zavedení Unicode - řetězců 2.2.1 Kódování Unicode V Abra Gx je od verze 14.51 implementováno kódování řetězců (typ string) Unicode, které umožňuje používat znaky různých abeced, symboly apod. současně. Oproti Ansi-kódování z předchozích verzí Abra Gx, ve kterém je znak zakódován na 1 Bytu, je kódování Unicode dvoubytové. Nyní tedy platí: funkce Length pro zjištění délky řetězce vrátí počet znaků, ale NE počet Bytů, ve kterých je řetězec uložen funkce ByteLength počet Bytů, ve kterých je řetězec uložen funkce StringElementSize vrátí počet Bytů, ve kterých je uložen (zakódován) 1 znak řetězce Stránka 3 z 22 pro převody řetězců mezi různými typy kódování slouží třída TEncoding (viz kapitolu 5.1) Uvedené změny s sebou přinášejí nutnost změny některých programovacích postupů. Nekorektní práci s řetězci neodhalí překladač a v lepším případě se projeví chybou za běhu programu. 2.2.2 Odstranění typu AnsiString Skriptování v Abra Gx od verze 14.51 již neobsahuje typ AnsiString. Z toho plyne také změna v deklaracích některých funkcí a procedur, které s tímto typem pracovaly a které nyní pracují pouze s typem string (tedy s dvoubytovým Unicodovým řetězcem). To se týká např. funkcí ReverseString(), LeftStr(), RightStr() a MidStr(). Pro zachování kompatibility byly ve skriptování funkce, které zpracovávaly AnsiStringy, zatím ponechány a označeny atributem Deprecated. Tyto funkce (zpravidla s prefixem Ansi v názvu) interně volají své ekvivalenty bez tohoto prefixu, pracující s Unicodovými řetězci. Výjimka ve třídě CfxString: Odstranění typu Ansistring nesouvisí s class-funkcemi a procedurami třídy CfxString, které zajišťují převody dat mezi textovými řetězci a bloky paměti. Třída CfxString nyní obsahuje metody dvojího typu: metody se sufixem A: kopírují řetězce po převodu na AnsiString na určené místo v paměti (např. StrPCopyA()), resp. AnsiStringový obsah paměti převedou do Unicodového řetězce (např. PStrCopyA()) metody se sufixem W: kopírují Unicodové řetězce na určené místo v paměti (např. StrPCopyW()), resp. obsah paměti převedou do Unicodového řetězce (např. PStrCopyW()) Rozdíly v práci s řetězci ukazují následující příklady: Původní chování Nové chování Zjištění délky řetězce ve znacích, resp. v Bytech var s: string; begin var s: string; begin s := ‘abc‘; s := ‘abc‘; // zobrazí se číslo ‘3‘: // zobrazí se číslo ‘3‘ (znaky): ShowMessage(IntToStr(Length(s))); ShowMessage(IntToStr(Length(s)); // funkce ByteLength ve skriptingu nebyla zavedena // zobrazí číslo ‘6‘ (Bytů): // počet znaků odpovídá počtu Bytů ShowMessage(IntToStr(ByteLength(s))); end; end; Přesun dat procedurou Move var s1, s2: string; p1, p2: pointer; begin var s1, s2: string; p1, p2: pointer; begin s1 := 'abc'; s1 := 'abc'; s2 := '12345'; s2 := '12345'; p1 := @s1; p1 := @s1; p2 := @s2; p2 := @s2; Stránka 4 z 22 // přesun obsahu řetězce s1 do s2 // CHYBNÝ (neúplný) přesun obsahu řetězce s1 do s2 Move(p1, p2, Length(s1)); Move(p1, p2, Length(1)); // zobrazí se 'abc45' // zobrazí se 'ab345' ShowMessage(s2); ShowMessage(s2); end; // korektní přesun obsahu řetězce s1 do s2 Move(p1, p2, ByteLength(s1)); // zobrazí se 'abc45' ShowMessage(s2); end; Zápis do a čtení ze streamu var s1, s2: string; var s1, s2: string; p1, p2: pointer; p1, p2: pointer; mStream: TStream; mStream: TStream; begin begin mStream := TMemoryStream.Create; mStream := TMemoryStream.Create; try try s1 := 'abc'; s1 := 'abc'; s2 := '12345'; s2 := '12345'; p1 := @s1; p1 := @s1; p2 := @s2; p2 := @s2; // zápis obsahu řetězce s1 do streamu // CHYBNÝ (neúplný) zápis obsahu řetězce s1 do streamu mStream.Write(p1, Length(s1)); mStream.Write(p1, Length(s1)); mStream.Position := 0; mStream.Position := 0; mStream.Read(p2, Length(s1)); mStream.Read(p2, Length(s1)); // zobrazí se 'abc45' // zobrazí se 'ab345' ShowMessage(s2); ShowMessage(s2); finally mStream.Free; end; end; // korektní zápis obsahu řetězce s1 do streamu mStream.Write(p1, ByteLength(s1)); mStream.Position := 0; mStream.Read(p2, ByteLength(s1)); // zobrazí se 'abc45' ShowMessage(s2); finally mStream.Free; end; end; Stránka 5 z 22 3. Atributy prvků skriptování Pro lepší podporu životního cyklu prvků zveřejněných v definicích skriptování byly zavedeny nové atributy, které lze použít u libovolného prvku skriptování (třída, funkce, atp.). Cílem této úpravy je dát uživatelům, kteří pracují se skripty dostatek času na přípravu na budoucí změny. Používané atributy Deprecated upozorňují na zastaralé prvky skriptování. Označení jedním z těchto atributů upozorňuje na to, že daný prvek je možné zatím ve skriptování používat, ale zároveň je třeba počítat s tím, že bude v některé z budoucích verzí úplně vyřazen. V upozornění je doporučena i náhrada daného prvku, která zpravidla také zjednodušuje práci oproti předchozím verzím. Místa, ve kterých se informace o přiřazení atributů zobrazují, jsou následující: ClassExplorer v agendě Balíčky skriptů – zobrazuje se červený text „Položka je zastaralá a je určena ke zrušení. Doporucená náhrada: XXX (platí od verze xx.xx.x)“ Nástroj DefsComp (viz kapitolu 4) – u jednotlivých prvků se zobrazuje přímo daný atribut. 3.1 Deprecated Atributem Deprecated jsou zpravidla označené dílčí prvky skriptování (např. funkce, metody a property tříd apod.), se kterými se do budoucnosti nepočítá ani v kódu Abry, protože byly nahrazeny alternativním kódem. 3.2 Úprava skriptů za pomoci nových atributů Cílem těchto nových atributů skriptování je, aby správce skriptů mohl v dostatečném časovém předstihu prvky skriptování nahradit jejich aktuálními zveřejněnými verzemi. Aby takováto revize mohla proběhnout, je umožněno upravit chování skriptování ABRA Gx k těmto prvkům označeným atributy „Deprecated“ nastavením v konfiguračním souboru ABRA Gx. POZOR!!! – jakákoliv změna parametrů popsaných níže v Nexus.CFG v sekci [Scripting] automaticky znamená nutnost provedení kompilace u všech skriptů podobně jako po update na verzi 14.51!!! Důrazně varujeme, že změny parametru HideDeprecated na jiné než defaultní hodnoty nejsou určeny pro ostrou verzi, která se používá v provozu u uživatele!!! Parametry lze změnit na testovací verzi a upravené a otestované skripty vyexportovat do ostré verze. Konfigurace v souboru NEXUS.CFG umožňuje skrýt prvky označené určitým atributem tak, že tento prvek není při startu ABRA Gx do skriptování zaregistrován a není tedy možné jej používat, tj. použití takového prvku skriptování vyvolá nefunkčnost skriptu nebo chybu kompilace a lze ho tedy s pomocí validačních hlášek odstranit. Nastavení skrývání prvků s atributy se provádí v sekci souboru NEXUS.CFG [Scripting]: [Scripting] HideDeprecated =1 Hodnota 1 znamená zapnutí skrývání (dané prvky se do skriptování neregistrují). Hodnota 0 znamená vypnutí (dané prvky se do skriptování registrují). Defaultní hodnoty: HideDeprecated=0 (skrývání vypnuto – Deprecated prvky lze ve skriptování použít) Stránka 6 z 22 4. Nástroj pro zjištění změn definic skriptování mezi verzemi (DefsComp) Pro lepší orientaci ve změnách skriptování bude generován vždy s novou verzí soubor s definicemi skriptování dané verze s příponou ADC (ABRA Definition Compare). Pro verzi 13.01.12 byl vygenerován soubor 13.01.12.adc. Další definiční soubor bude vygenerován pro certifikovanou legislativní verzi 14.01.xx. Pro verze 14.51.xx budou s každou vydanou verzí generovány soubory 14.51.xx.adc. Tyto soubory budou dostupné v adresáři Doc\DefsComp instalace ABRA Gx. Nástroj DefsComp.exe se nachází v instalačním adresáři ABRA Gx. Pro jeho správnou funkci je tedy třeba mít k dispozici dva soubory ADC z různých verzí ABRA Gx k vlastnímu porovnání a nainstalovaný freewarový SW WinMerge (http://winmerge.org/). Po spuštění DefsComp.exe se vyberou definiční soubory verzí, které se mají porovnávat a stiskem tlačítka Další se provede výpočet porovnání definic (může trvat i déle jak 15 sec.). Objeví se výsledné okno porovnání definic, ve kterém je možné zobrazit nové, změněné, odstraněné a nezměněné definice. Omezit seznam lze pomocí pole „Like podmínka“. Pro zobrazení detailu změn stačí stisk CTRL-ENTER (nebo tlačítko „Porovnání ve WinMerge“, případně dvojklik myší na daném řádku) na zvolené definici, který změny zobrazí v aplikaci WinMerge. Dále je možné tlačítky „Přehled Deprecated položek“ a „Přehled odstraněných položek“ uložit do Htmlsouboru příslušný přehled. V příloze č. 1 s názvem „Skriptovani_zmeny_D7_XE_priloha_1“ navíc uvádíme přehled odstraněných definic vybraných tříd k verzi 14.51.06 s jejich doporučenými náhradami. Kompletní přehled odstraněných položek k verzi 14.51.06 pak obsahuje v příloha č. 2 s názvem „Skriptovani_zmeny_D7_XE_priloha_2“. Obrázek – Nástroj DefsComp.exe Stránka 7 z 22 5. Dílčí změny ve skriptování V této kapitole budou popsány dílčí změny konkrétních prvků skriptování v ABRA Gx. 5.1 Přetypování Přetypování objektů ve skriptování má následující vlastnosti: Syntaxe: <<cílová třída>>(<<zdrojová třída>>) Při tomto zápisu je kontrolována kompatibilita cílové třídy se zdrojovou tak, jako je tomu u přetypování s operátorem AS v Delphi-kódu. Pokud tedy cílová třída není se zdrojovou kompatibilní a nelze přetypování provést, je vyvolána výjimka „Invalid classes type cast <<zdrojová třída>> to <<cílová třída>>“ Samotný operátor AS ve skriptování k dispozici není. Kompatibilitu tříd lze otestovat pomocí operátoru IS, který naopak ve skriptování k dispozici je. Příklad procedure Test(APanel: TPanel); var mControl: TControl; mWinControl: TWinControl; begin // př. 1: // - nalezení komponenty edName typu TEdit na panelu APanel mControl := NxFindChildControl(APanel, ‘edName‘); // - přetypování: TEdit je potomkem třídy TWinContol ==> přetypování proběhne v pořádku mWinControl := TWinControl(mControl); // př. 2: // - nalezení komponenty lblName typu TLabel na panelu APanel mControl := NxFindChildControl(APanel, ‘lblName‘); // - přetypování: TLabel není potomkem třídy TWinContol ==> přetypování vyvolá výjimku mWinControl := TWinControl(mControl); end; 5.2 Třída TEncoding Třída Encoding slouží především k převádění dat mezi různými kódovými stránkami a nahrazuje tak zrušené samostatné funkce pro převody kódování řetězců, jako byly např. NxTranslateText a NxRemoveDiacritics. Třída také umožňuje převod řetězců na pole Bytů a naopak s možností definovat zdrojové a cílové kódování. Pro odstranění diakritiky z textového řetězce třída obsahuje metodu RemoveDiacritics. Třída podporuje práci s kódovými stránkami, které jsou vyjádřené následujícími konstantami: o Encoding_cp1250: Integer = 1250 (Win1250 - Ansi) o Encoding_cp852: Integer = 852 (IBM-Latin2) o Encoding_cpASCII: Integer = 20127 o Encoding_cpISO_8859_2: Integer = 28592 (ISO-Latin2) Stránka 8 z 22 o o o o Encoding_cpKamenicky: Integer = 895 Encoding_cpMacIntosh: Integer = 10029 Encoding_cpUTF_8: Integer = 65001 Encoding_cpUTF_16: Integer = 1200 (Unicode) Příklady použití // příklad převodu kódování z Win1250 (Ansi) do Unicode function ExampleConvertEncoding(AAnsiBytes: TBytes): string; var mUnicodeBytes: TBytes; begin mUnicodeBytes := TEncoding.Convert(AAnsiBytes, Encoding_cp1250, Encoding_cpUTF_16); Result := TEncoding.Unicode.GetString(mUnicodeBytes); end; // příklad odstranění diakritiky function ExampleRemoveDiacrits(AValue: String): String; begin Result := TEncoding.RemoveDiacritics(AValue); end; // příklad převodu z řetězce na pole Bytů function ExampleGetBytesFromString(AValue:String): TBytes; begin Result := TEncoding.Unicode.GetBytes(AValue); end; 5.3 Funkce EncodeBase64, DecodeBase64 Tyto funkce nyní pracují s polem Bytů (TBytes) takto: function EncodeBase64(const Value: TBytes): String; function DecodeBase64(const Value: String): TBytes; Původní použití Nové použití {Encode64} {Encode64} function Encode64(aValue:String):String; function Encode64(aValue: String):String; begin var Result := EncodeBase64(aValue); end; mBytes: TBytes; begin mBytes := TEncoding.Unicode.GetBytes(aValue); Result := EncodeBase64(aValue); Stránka 9 z 22 end; {Decode64} {Decode64} function Decode64(aValue:String):String; function Decode64(aValue:String):String; begin var Result:= DecodeBase64(aValue); end; mBytes: TBytes; begin mBytes := DecodeBase64(aValue); Result := TEncoding.Unicode.GetString(mBytes); end; 5.4 Změny ve Streamech TStringStream byl odstraněn. Pro ukládání / načtení řetězců do / ze souborů je potřeba použít funkce přímo pro práci se soubory nebo TMemoryStream a TEncoding. U TMemoryStream byla zrušena properta Memory. Pro čtení a zápis se používají funkce Read() Write(). Případně je možné využít nové funkce GetBytes() a SetBytes(). TMapStream byl zabalen do nové obálky. TFileStream byl zabalen do nové obálky. THandleStream byl odstraněn. 5.5 Změny v Tisku a Exportu 5.5.1 Funkce pro tisk a export Tyto původní funkce pro tisk a export byly označené jako deprecated: NxGetFilterTextFromPrintExportKind NxGetFileExtensionFromPrintExportKind NxPrintByIDs NxExportByIDs NxB2BExportByIDs Dále byla odstraněna třída CFxPrintToFile a její funkce byly převedeny do nové třídy CFxReportManager, která navíc obsahuje uvedené funkce označené jako deprecated a některé další: PrintByIDsToTempFile PrintByIDsToBytes PrintIDsToSignedPDFToBytes PrintByIDs PrintByIDsWithParentForm PrintByIDsToTempFile PrintByIDsToBytes PrintByIDsToSignedPDF PrintByIDsToSignedPDFWithParentForm PrintByIDsToSignedPDFToBytes ExportByIDs B2BExportByIDs Stránka 10 z 22 5.5.2 GetFilterTextFromPrintExportKind GetFileExtensionFromPrintExportKind Ukončení podpory formátu ARP ABRA Gx od verze 14.51 přestala podporovat formát pro tisk do souboru ARP. Při tisku pomocí skriptování jej tedy již nelze používat ani pro tisk do souboru, ani pro náhled na obrazovku. 5.6 Odstranění TCustom- komponent Z definic skriptování byly odstraněny komponenty TCustom. Tím došlo k celkovému zjednodušení hierarchie tříd zveřejněných ve skriptingu, ale také ke změnám dědičnosti. Místo Custom-tříd je třeba používat jejich potomky, kteří zveřejňují vlastnosti své i svého předka. Příklad změn v dědičnosti komponenty TreeView (posloupnost od potomka k předkům): Původní hierarchie Nová hierarchie TNxTreeView TTreeView TTreeView TWinControl TCustomTreeView TWinControl V novém modelu komponenta TTreeView plně nahrazuje původní TNxTreeView.. 5.7 Property DataField a DataSource 5.8 Třída TComboBox 5.9 Původní komponenty s napojením na dataset, které měly v názvu třídy „DB“ (např. TDBEdit, TNxDBEdit), nahrazujeme jednou novou společnou komponentou, která už v názvu „DB“ nemá (např. TEdit) a používá jak ve spojení s datasetem, tak bez něj. Napojení na dataset se realizuje prostřednictvím propert DataField a DataSource, jako tomu bylo u původních DB-komponent. Použití původních DB-komponent je tedy třeba nahradit komponentami novými. Properta EnableValues je read only, na true ji nastavuje hodnota Values.Count > 0 (nelze ji tedy měnit přiřazením) Třída Tlabel jako náhrada za TDBText a TNxDBText Třída TLabel kromě svého původního použití nově také nahrazuje dříve používané komponenty s obdobnými vlastnostmi TDBText a TNxDBText. Tato náhrada plyne ze změn v kódu Abry. Při nahrazování těchto komponent je třeba vést v patrnosti následující skutečnosti: TLabel je potomkem TControl a nelze jej tedy přetypovat na TWincontrol, což bylo u TDBText a TNxDBText možné, protože obě tyto komponenty byly potomky třídy TWinControl. Při pokusu o přetypování proměnné, která obsahuje TLabel, na TWinControl, je za běhu programu ohlášena chyba. Stránka 11 z 22 5.10 Výčtové typy Od verze 14.51 dochází ke změnám v některých výčtových typech, resp. v pozicích některých jejich členů. Pokud skript pracuje s pozicí členu ve výčtu, jeho překlad takovou změnu neodhalí a je třeba jej zkontrolovat. Dále uvádíme výčtové typy, u kterých k uvedeným změnám došlo (konkrétní rozdíly je možné zobrazit v nástroji DefsComp): 5.11 TNxPOSExtraParams – už ve verzi 13.01 se lišil výčet v kódu ABRA Gx od definice tohoto typu ve skriptování, a to nejen položkami přidávanými na konec výčtu, ale i položkou pexMacroCardBegin vloženou dovnitř výčtu TSynStateFlag – na předposlední místo výčtu přibyl člen sfInsideRedo TFieldType – výčet byl rozšířen o nové členy. Pozor, pokud kód skriptu detekuje přítomnost fieldů různých typů v datasetu, je také třeba počítat s tím, že typy definované ve skriptech pod Abrou do verze 14.01 (resp. 14.02) jako ftString a ftMemo, jsou nyní typu ftWideString a ftWideMemo. Pro zachován kompatibility skriptu je tedy třeba příslušnou detekci o tyto typy rozšířit. Použití funkce NxGetSiteAppForm Funkci NxGetSiteAppForm nelze použít v háčku FormCreate_Hook, protože v metodě FormCreate není k dispozici SiteAppForm. Použití funkce v tomto místě končí výjimkou. 5.12 Použití třídy TZipFile (náhrada za TZipMaster19) Původní použití Nové použití Příklad vytvoření nového archivu s jedním zkomprimovaným souborem: var mZip: TZipMaster19; begin mZip := TZipMaster19.Create(nil); try var mZip: TZipFile; begin mZip := TZipFile.Create; try mZip.ZipFileName := '<<<zipfilearchiv>>>'; mZip.Open('<<<zipfilearchiv>>>', zfomWrite); mZip.AddFile('<<<filename>>>'); mZip.AddFile('<<<filename>>>'); mZip.AddFile('<<<filename>>>'); mZip.Add; finally mZip.Free; end; mZip.AddFile('<<<filename>>>'); finally mZip.Free; // provede uložení na disk end; end; end; Příklad rozbalení archivu do zvoleného adresáře: var mZip: TZipMaster19; begin mZip := TZipMaster19.Create(nil); var mZip: TZipFile; begin // Extract zip Stránka 12 z 22 try mZip := TZipFile.Create; mZip.ZipFileName := '<<<zipfilearchiv>>>'; try mZip.ExtrBaseDir := '<<<extractpath>>>'; mZip.Open('<<<zipfilearchiv>>>', zfomRead); mZip.Extract; mZip.ExtractAll('<<<extractpath>>>'); finally finally mZip.Free; end; end; end; 5.13 mZip.Free; end; Zrušení funkce NxFindChildControlByClass Funkce NxFindChildControlByClass byla používána k vyhledání nepojmenované komponenty podle její třídy. Nyní lze komponentu vyhledávat pouze podle jména funkcí NxFindChildControl a je tedy nutné mít komponenty pojmenované. 5.14 REST webové služby Definice volané skriptovací funkce se nezměnily. procedure GET(Self: TNxWebServicesHelper; ARequest: TNxHTTPRequest; AResponse: TNxHTTPResponse); Změna nastala v objektech Request a Response. Properta Response.Content.Content je typu TBytes (dříve byla typu string). Vzorový příklad použití REST implementace procedure GET(Self: TNxWebServicesHelper; ARequest: TNxHTTPRequest; AResponse: TNxHTTPResponse); var mFileName: String; begin try if uppercase(Arequest.Path) = '/PDF' then begin AResponse.Content.Content :=getPDF(self.Context); AResponse.Content.ContentType := 'Application/pdf'; AResponse.Content.ContentDisposition := ''; end else if uppercase(Arequest.Path) = '/ORDER' then begin AResponse.Content.Content := getOrderInfo(Self.ObjectSpace, ARequest.Arguments); Aresponse.Content.ContentType := 'text/html'; end; except AResponse.Content.Content := TEncoding.ANSI.GetBytes('<B>!! Chyba !! </B> <BR>'+ExceptionMessage); Aresponse.Content.ContentType := 'text/html'; end; end; Stránka 13 z 22 function getOrderInfo(AObjectSpace: TNxCustomObjectSpace; Arguments: String): TBytes; var mArgs, mRes: TStrings; mID: String; mOrder: TNxCustombusinessObject; mOrderRows: TNxCustomBusinessMonikerCollection; i: Integer; begin mArgs := TStringList.Create; try mArgs.Delimiter := ','; mArgs.DelimitedText := Arguments; mID := mArgs.Values['ID']; if not NxIsEmptyOID(mID) then begin mOrder := AObjectSpace.CreateObject(Class_ReceivedOrder); mRes := TStringList.Create; try if not mOrder.Test(mID) then begin Result := TEncoding.ANSI.GetBytes('<B>Špatné číslo objednávky</B>'); end else begin mOrder.Load(mID, nil); mOrderRows := mOrder.GetLoadedCollectionMonikerForFieldCode(mOrder.GetFieldCode('Rows')); mRes.Add('<table border="1">'); mRes.Add( '<tr><th>Položka</th><th>Počet</th><th>Jednotka</th><th>Celková cena</th><th>DPH</th>‘ + '<th>Datum dodání</th></tr>'); for i := 0 to mOrderrows.Count - 1 do begin mRes.Add('<tr><td>'+NxEvalObjectExprAsString(mOrderRows.BusinessObject[i], 'StoreCard_ID.Name')+'</td>'+ '<td>'+FloatTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('Quantity'))+'</td>'+ '<td>'+mOrderRows.BusinessObject[i].GetFieldValueAsString('QUnit')+'</td>'+ '<td>'+FloatTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('TAmount'))+'</td>'+ '<td>'+FloatTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('VatRate'))+'</td>'+ '<td>'+DateTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('DeliveryDate$DATE'))+'</td></tr>'); end; mRes.Add('</table>'); Result := TEncoding.ANSI.GetBytes(mRes.text); end; finally mOrder.Free; Stránka 14 z 22 mRes.Free; end; end else result := TEncoding.ANSI.GetBytes('<B>Musíte zadat číslo objednávky</B>'); finally mArgs.Free; end; end; function getPdf(AContext: TNxContext): TBytes; begin Result := PrintIssuedInvoice(AContext, '2J00000101' , 'W400000001'); //Faktura vydana end; function PrintIssuedInvoice(AContext: TNxContext; ADocumentID: String; AReportID: String): TBytes; var mOLEApp: Variant; mCommand: Variant; mCond: Variant; mTempDir: String; mIDs: TStrings; mFileName: String; begin mFileName := CFxGUID.CreateNew + '.pdf'; mIDs := TStringList.Create; try mIDs.Add(ADocumentID); mTempDir := NxGetTempDir; NxPrintByIDs(AContext, mIDs, '40SBPEINEFD13ACM03KIU0CLP4', AReportID, rtoFile, pekPDF, mTempDir, mFileName); Result := Get_PDF(NxAddSlash(mTempDir) + mFileName); DeleteFile(mTempDir + mFileName); finally mIDs.Free; end; end; function Get_PDF(AFileNAme: String):TBytes; var mFS: TFileStream; mSS: TMemoryStream; Stránka 15 z 22 begin mFS := TFileStream.Create(AFileName, fmOpenRead); try mFS.Seek(0, soFromBeginning); mSS := TMemoryStream.Create; try mSS.CopyFrom(mFS, mFS.Size); Result := mSS.GetBytes; finally mSS.Free; end; finally mFS.Free; end; end; begin end. 5.15 Metoda Show třídy TControl a jejích potomků Pro „zviditelnění“ vizuální komponenty na formuláři slouží jednak nastavení property Visible na True, a kromě toho také volání metody Show. Na rozdíl od Delphi D7 však v Delphi XE2 volání Show způsobí také přepnutí na záložku PageControlu, na které se daná komponenta nachází. Pokud se tedy např. komponenta nachází na záložce TabSheet2 a v okamžiku volání Show je aktivní záložka TabSheet1, po vyvolání Show bude aktivní TabSheet2. Pod D7 zůstávala aktivní záložka TabSheet1. Doporučujeme proto pro nastavení viditelnosti používat funkci NxSetVisible(). 5.16 Změny v metodách pro komunikaci s externími knihovnami DLL Původní funkce NxDllCall() a CallProcOnAddress() byly určené pro komunikaci s externími knihovnami DLL podporujícími pouze řetězce typu AnsiString. V Abra Gx od verze 14.51 je komunikace s knihovnami DLL zajištěna následujícímu funkcemi: 5.17 NxDllCallA() a CallProcOnAddressA() – pro komunikaci s knihovnami podporujícími řetězce typu AnsiString (= náhrada původních NxDllCall() a CallProcOnAddress()) NxDllCallW() a CallProcOnAddressW() – pro komunikaci s knihovnami podporujícími řetězce typu WideString (řetězce Unicode) Změna použití encodingu v třídě TNxScriptingXMLWrapper Pro kódování XML dokumentu je nyní k dispozici properta Encoding (read/write). Naopak z parametrů metod saveToBytes(),saveToFile() a saveToStream() byla volba kódování odstraněna. Pokud se tedy má XML dokument uložit v jiném než aktuálním kódování, je třeba před voláním příslušné metody saveTo… přiřadit požadované kódování propertě Encoding. Stránka 16 z 22 Původní použití Nové použití var var mXml: TNxScriptingXMLWrapper; begin mXml: TNxScriptingXMLWrapper; begin mXml := TNxScriptingXMLWrapper.Create; mXml := TNxScriptingXMLWrapper.Create; try try mxml.loadFromFile('n:\!firmy.test.XML'); mxml.loadFromFile('n:\!firmy.test.XML'); mXml.saveToFile('n:\!firmy.test2.XML', 'UTF-8'); mXml.Encoding := 'UTF-8'; finally mXml.saveToFile('n:\!firmy.test2.XML'); mXml.Free; finally end; mXml.Free; end; end; end; 5.18 Poznámky k práci s formuláři ve skriptování 5.19 Formuláře vytvářené skriptem musí mít definovanou výšku a šířku pomocí propert ClientWidth a ClientHeight a tedy ne pomocí Width a Height. Doporučený postup vytváření formuláře s tlačítky ve spodním panelu v Abra vzhledu: na formulář se vloží panel se zarovnáním dolů a na něj se vkládají tlačítka. Tomuto panelu se pak nastaví properta BottomInModalDialog:= true a tím se v Abra vzhledu panel vybarví barvou aplikace. Properta Font.Color v Abra-vzhledu V předchozích verzích bylo možné u komponent zveřejněných ve skriptování ovlivňovat a barvu pozadí nastavením property Color a barvu písma nastavením property Font.Color. Je-li v XE2-verzi nastaven styl vzhledu „Abra vzhled“ nebo „Abra vzhled - alternativní“, nelze barvy u většiny komponent těmito propertami měnit. Barvu tak určuje výhradně nastavení barev v systému. Výjimkou jsou následující komponenty: TLabel, TEdit, TComboEdit, TDateEdit, TDirectoryEdit , TLabeledEdit , TNumEdit , TObjectComboEdit a TRollComboEdit. U těchto komponent barvy nastavením uvedených propert ovlivnit lze. Je-li nastaven styl vzhledu „Podle Windows“, jsou změny barev pomocí uvedených propert účinné. Stránka 17 z 22 6. Binární data vs. string Jak bylo vedeno výše, v Abra Gx od verze 14.51 jsou řetězce (typ string) unicodové, nejedná se tedy o prosté pole Bytů a není tedy vhodné je používat k předávání binárních dat. Pokud už je třeba binární data přenášet v řetězcích (to se může týkat např. webových služeb SOAP i REST), je třeba je ukládat v kódování Base64. Stránka 18 z 22 7. Příloha č. 1: přehled odstraněných položek k verzi 14.51.08 Odstraněná položka Náhrada Poznámka enumset AddOpts = bez náhrady [AddDirNames, AddRecurseDirs, AddMove, AddFreshen, AddUpdate, AddHiddenFiles, AddArchiveOnly, AddResetArchive, AddEncrypt, AddEmptyDirs, AddVolume, AddFromDate, AddSafe, AddVersion, AddNTFS] výčet původně použitý v odstraněné komponentě TZipMaster19 type AnsiString string přechod skriptování na Unicode řetězce class CFxPrintToFile CFxReportManager změna delphi-komponenty enumset ExtrOpts = [ExtrDirNames, ExtrOverWrite, ExtrFreshen, ExtrUpdate ,ExtrTest, ExtrForceDirs] bez náhrady výčet původně použitý v odstraněné komponentě TZipMaster19 class TAnimatedImage (TRxImageControl) TAnimate změna delphi-komponenty class TContainedAction (TBasicAction) TBasicAction zjednodušení struktury komponent skriptování class TCurrencyEdit (TCustomNumEdit) TNumEdit změna delphi-komponenty class TCustomAction (TContainedAction) TBasicAction zjednodušení struktury komponent skriptování class TCustomActionList (TComponent) TActionList zjednodušení struktury komponent skriptování class TCustomCheckBox (TButtonControl) TCheckBox zjednodušení struktury komponent skriptování class TCustomCombo (TCustomListControl) TComboBox zjednodušení struktury komponent skriptování class TCustomComboBox (TCustomCombo) TComboBox zjednodušení struktury komponent skriptování class TCustomComboEdit (TCustomMaskEdit) TComboEdit zjednodušení struktury komponent skriptování class TCustomDBComboBox (TCustomComboBox) TComboBox zjednodušení struktury komponent skriptování class TCustomDBGrid (TCustomGrid) TDBGrid zjednodušení struktury komponent skriptování class TCustomDateEdit (TCustomComboEdit) TDateEdit zjednodušení struktury komponent skriptování class TCustomDrawGrid (TCustomGrid) TDrawGrid zjednodušení struktury komponent skriptování class TCustomEdit (TWinControl) TEdit zjednodušení struktury komponent skriptování class TCustomFrame (TScrollingWinControl) TFrame zjednodušení struktury komponent skriptování class TCustomGrid (TCustomControl) TDBGrid, TDrawGrid, TStringGrid zjednodušení struktury komponent skriptování class TCustomGroupBox (TCustomControl) TGroupBox zjednodušení struktury komponent skriptování class TCustomLabel (TGraphicControl) TLabel zjednodušení struktury komponent skriptování class TCustomLabeledEdit (TCustomEdit) TLabeledEdit zjednodušení struktury komponent skriptování class TCustomListBox (TCustomMultiSelectListControl) TListBox zjednodušení struktury komponent skriptování zjednodušení struktury komponent skriptování class TCustomListControl (TWinControl) TCheckListBox, TComboBox, TListBox, TListView class TCustomListView (TCustomMultiSelectListControl) TListView zjednodušení struktury komponent skriptování class TCustomMaskEdit (TCustomEdit) TEdit zjednodušení struktury komponent skriptování class TCustomMemo (TCustomEdit) TMemo zjednodušení struktury komponent skriptování class TCustomMemoryStream (TStream) TMemoryStream zjednodušení struktury komponent skriptování class TCustomMultiSelectListControl (TCustomListControl) TListBox, TListView zjednodušení struktury komponent skriptování class TCustomNumEdit (TCustomComboEdit) TNumEdit zjednodušení struktury komponent skriptování class TCustomPanel (TCustomControl) TPanel zjednodušení struktury komponent skriptování class TCustomRadioGroup (TCustomGroupBox) TRadioGroup zjednodušení struktury komponent skriptování class TCustomRichEdit (TCustomMemo) TRichEdit zjednodušení struktury komponent skriptování class TCustomSynEdit (TCustomControl) TSynEdit zjednodušení struktury komponent skriptování class TCustomTabControl (TWinControl) TTabControl zjednodušení struktury komponent skriptování class TCustomTreeView (TWinControl) TTreeView zjednodušení struktury komponent skriptování Stránka 19 z 22 class TDBCheckBox (TCustomCheckBox) TCheckBox zjednodušení struktury komponent skriptování class TDBComboBox (TCustomComboBox) TComboBox zjednodušení struktury komponent skriptování class TDBDateEdit (TCustomDateEdit) TDateEdit zjednodušení struktury komponent skriptování class TDBEdit (TCustomMaskEdit) TEdit zjednodušení struktury komponent skriptování class TDBMemo (TCustomMemo) TMemo zjednodušení struktury komponent skriptování class TDBText (TCustomLabel) TLabel zjednodušení struktury komponent skriptování class TEditButton (TRxSpeedButton) TSpeedButton zjednodušení struktury komponent skriptování class TGIFFrame (TPersistent) bez náhrady v XE-verzi není odpovídající delphi komponenta enum TGlyphOrientation = (goHorizontal,goVertical) bez náhrady v XE-verzi není odpovídající delphi-výčet class THandleStream (TStream) TMemoryStream v XE-verzi není delphi-komponenta podporovaná class TMaskEdit (TCustomMaskEdit) TEdit zjednodušení struktury komponent skriptování class TMemoryRecord (TPersistent) bez náhrady v XE-verzi není delphi-komponenta podporovaná enum TMimeChar = (ISO_8859_1,ISO_8859_2,ISO_8859_3,ISO_8859_4,ISO_8 859_5,ISO_8859_6,ISO_8859_7,ISO_8859_8,ISO_8859_9, ISO_8859_10,ISO_8859_13,ISO_8859_14,ISO_8859_15,C P1250,CP1251,CP1252,CP1253,CP1254,CP1255,CP1256, CP1257,CP1258,KOI8_R,CP895,CP852,UCS_2,UCS_4,UT F_8,UTF_7,UTF_7mod,UCS_2LE,UCS_4LE,UTF_16,UTF_ 16LE,UTF_32,UTF_32LE,C99,JAVA,ISO_8859_16,KOI8_U, KOI8_RU,CP862,CP866,MAC,MACCE,MACICE,MACCRO, MACRO,MACCYR,MACUK,MACGR,MACTU,MACHEB,MA CAR,MACTH,ROMAN8,NEXTSTEP,ARMASCII,GEORGIA N_AC,GEORGIAN_PS,KOI8_T,MULELAO,CP1133,TIS620, CP874,VISCII,TCVN,ISO_IR_14,JIS_X0201,JIS_X0208,JIS _X0212,GB1988_80,GB2312_80,ISO_IR_165,ISO_IR_149, EUC_JP,SHIFT_JIS,CP932,ISO_2022_JP,ISO_2022_JP1,I SO_2022_JP2,GB2312,CP936,GB18030,ISO_2022_CN,IS O_2022_CNE,HZ,EUC_TW,BIG5,CP950,BIG5_HKSCS,EU C_KR,CP949,CP1361,ISO_2022_KR,CP737,CP775,CP853 ,CP855,CP857,CP858,CP860,CP861,CP863,CP864,CP865 ,CP869,CP1125) konstanty v XE-verzi je pro převody kódování řetězců Encoding_cpKamenicky, použitá třída TEncoding Encoding_cp852, Encoding_cp1250, Encoding_cpISO_8859_2, Encoding_cpASCII, Encoding_cpMacIntosh, Encoding_cpUTF_8, Encoding_cpUTF_16 class TNxAction (TNxCustomAction) TAction zjednodušení struktury komponent skriptování class TNxActionList (TCustomActionList) TActionList zjednodušení struktury komponent skriptování class TNxActionListController (TNxCustomActionListController) TActionListController zjednodušení struktury komponent skriptování class TNxButton (TButton) TButton zjednodušení struktury komponent skriptování class TNxCheckAction (TNxAction) TCheckAction zjednodušení struktury komponent skriptování class TNxColorDialog (TColorDialog) TColorDialog zjednodušení struktury komponent skriptování class TNxComboBevel (TNxCustomPanel) TComboBevel zjednodušení struktury komponent skriptování class TNxConditionLink (TObject) TConditionLink zjednodušení struktury komponent skriptování class TNxConditionList (TNxCustomConditionList) TConditionList zjednodušení struktury komponent skriptování class TNxConditionListItem (TNxCustomConditionListItem) TConditionListItem zjednodušení struktury komponent skriptování class TNxControlBox (TNxPanel) TControlBox zjednodušení struktury komponent skriptování enum TNxControlBoxLayoutDirection = (ldVertical,ldHorizontal,ldVerticalBottom,ldHorizontalRight) TLayoutDirection zjednodušení struktury komponent skriptování enum TNxControlBoxLayoutType = (ltFront,ltCenter,ltOpposite,ltAutosize) TLayoutType zjednodušení struktury komponent skriptování konstanty v XE-verzi je pro převody kódování řetězců Encoding_cpKamenicky, použitá třída TEncoding enum TNxCpDefinition = Encoding_cp852, (cpKamenicky,cpWin31CE,cpWin1250,cpECMA,cpLatin2,cp Encoding_cp1250, UsaAnsi,cpIbm,cpSemigraph,cpMacIntosh) Encoding_cpISO_8859_2, Encoding_cpASCII, Encoding_cpMacIntosh, Stránka 20 z 22 Encoding_cpUTF_8, Encoding_cpUTF_16 class TNxCustomAction (TCustomAction) TAction zjednodušení struktury komponent skriptování class TNxCustomActionListController (TComponent) TActionListController zjednodušení struktury komponent skriptování class TNxCustomComboEdit (TCustomComboEdit) TComboEdit zjednodušení struktury komponent skriptování class TNxCustomConditionList (TCustomControl) TConditionList zjednodušení struktury komponent skriptování class TNxCustomConditionListItem (TObject) TConditionListItem zjednodušení struktury komponent skriptování class TNxCustomDBComboEdit (TNxCustomComboEdit) TComboEdit zjednodušení struktury komponent skriptování class TNxCustomDirectoryEdit (TCustomComboEdit) TDirectoryEdit zjednodušení struktury komponent skriptování class TNxCustomInfoGridPanel (TNxPanel) TInfoGridPanel zjednodušení struktury komponent skriptování class TNxCustomMultiGrid (TCustomControl) TMultiGrid zjednodušení struktury komponent skriptování class TNxCustomNumEdit (TRxCustomCalcEdit) TNumEdit zjednodušení struktury komponent skriptování class TNxCustomPageControl (TPageControl) TPageControl zjednodušení struktury komponent skriptování class TNxCustomPanel (TPanel) TPanel zjednodušení struktury komponent skriptování class TNxDBCheckBox (TDBCheckBox) TCheckBox zjednodušení struktury komponent skriptování class TNxDBComboBox (TRxDBComboBox) TComboBox zjednodušení struktury komponent skriptování class TNxDBComboEdit (TNxCustomDBComboEdit) TComboEdit zjednodušení struktury komponent skriptování class TNxDBDateEdit (TDBDateEdit) TDateEdit zjednodušení struktury komponent skriptování class TNxDBDirectoryEdit (TNxDirectoryEdit) TDirectoryEdit zjednodušení struktury komponent skriptování class TNxDBEdit (TDBEdit) TEdit zjednodušení struktury komponent skriptování class TNxDBGrid (TRXDBGrid) TDBGrid zjednodušení struktury komponent skriptování class TNxDBMemo (TDBMemo) TMemo zjednodušení struktury komponent skriptování class TNxDBNumEdit (TNxCustomNumEdit) TNumEdit zjednodušení struktury komponent skriptování class TNxDBObjectComboEdit (TNxCustomDBComboEdit) TObjectComboEdit zjednodušení struktury komponent skriptování class TNxDBRadioGroup (TCustomRadioGroup) TRadioGroup zjednodušení struktury komponent skriptování class TNxDBRoundPanel (TCustomPanel) TDbRoundPanel zjednodušení struktury komponent skriptování class TNxDBText (TDBText) TLabel zjednodušení struktury komponent skriptování class TNxDirectoryEdit (TNxCustomDirectoryEdit) TDirectoryEdit zjednodušení struktury komponent skriptování class TNxFindDialog (TFindDialog) TFindDialog zjednodušení struktury komponent skriptování class TNxFontDialog (TFontDialog) TFontDialog zjednodušení struktury komponent skriptování class TNxInfoGridPanel (TNxCustomInfoGridPanel) TInfoGridPanel zjednodušení struktury komponent skriptování class TNxListView (TListView) TListView zjednodušení struktury komponent skriptování class TNxMainMenu (TMainMenu) TMainMenu zjednodušení struktury komponent skriptování class TNxMultiAction (TNxAction) TMultiAction zjednodušení struktury komponent skriptování class TNxMultiGrid (TNxCustomMultiGrid) TMultiGrid zjednodušení struktury komponent skriptování class TNxNumEdit (TNxCustomNumEdit) TNumEdit zjednodušení struktury komponent skriptování class TNxOpenDialog (TpsvOpenDialog) TOpenDialog zjednodušení struktury komponent skriptování class TNxOrderByPanel (TNxPanel) TOrderByPanel zjednodušení struktury komponent skriptování class TNxPageControl (TNxCustomPageControl) TPageControl zjednodušení struktury komponent skriptování class TNxPanel (TNxCustomPanel) TPanel zjednodušení struktury komponent skriptování enum TNxPanelColor = (pcDefault,pcCustom,pcWizardWhite,pcTabSheetGray) TPanelColor zjednodušení struktury komponent skriptování class TNxPrintDialog (TPrintDialog) TPrintDialog zjednodušení struktury komponent skriptování class TNxPrinterSetupDialog (TPrinterSetupDialog) TPrinterSetupDialog zjednodušení struktury komponent skriptování class TNxRadioGroup (TRadioGroup) TRadioGroup zjednodušení struktury komponent skriptování class TNxReplaceDialog (TReplaceDialog) TReplaceDialog zjednodušení struktury komponent skriptování class TNxSaveDialog (TpsvSaveDialog) TSaveDialog zjednodušení struktury komponent skriptování Stránka 21 z 22 class TNxScrollBox (TScrollBox) TScrollBox zjednodušení struktury komponent skriptování class TNxSeparatorAction (TNxCustomAction) TSeparatorAction zjednodušení struktury komponent skriptování class TNxShortCutList (TStringList) TShortCutList zjednodušení struktury komponent skriptování class TNxTreeView (TTreeView) TTreeView zjednodušení struktury komponent skriptování class TNxWebBrowser (TEmbeddedWB) TWebBrowser zjednodušení struktury komponent skriptování class TNxXHTMLEditor (TWinControl) TXHTMLEditor zjednodušení struktury komponent skriptování class TRxCalcEdit (TRxCustomCalcEdit) TNumEdit v XE-verzi není odpovídající delphi komponenta class TRxCustomCalcEdit (TCustomNumEdit) TNumEdit v XE-verzi není odpovídající delphi komponenta class TRxDBComboBox (TCustomDBComboBox) TComboBox v XE-verzi není odpovídající delphi komponenta class TRxDBGrid (TDBGrid) TDBGrid v XE-verzi není odpovídající delphi komponenta enum TRxDropDownMenuPos = (dmpBottom,dmpRight) bez náhrady v XE-verzi není odpovídající delphi-výčet class TRxGIFAnimator (TRxImageControl) TAnimate v XE-verzi není odpovídající delphi komponenta class TRxImageControl (TGraphicControl) TAnimate v XE-verzi není odpovídající delphi komponenta class TRxMemoryData (TDataSet) TMemoryDataset v XE-verzi není odpovídající delphi komponenta type TRxNumGlyphs TNumGlyphs v XE-verzi není odpovídající delphi-typ class TRxSpeedButton (TGraphicControl) TSpeedButton v XE-verzi není odpovídající delphi komponenta class TStringStream (TStream) TMemoryStream v XE-verzi není delphi-komponenta podporovaná class TZipMaster19 (TComponent) TZipFile v XE-verzi není odpovídající delphi komponenta class TpsvOpenDialog (TOpenDialog) TOpenDialog v XE-verzi není odpovídající delphi komponenta class TpsvSaveDialog (TSaveDialog) TSaveDialog v XE-verzi není odpovídající delphi komponenta const faVolumeID: Integer = 8 bez náhrady v XE-verzi není konstanta podporovaná enum TNxBucketEventType = (beInsert,beRemove,beChangeData,beChangeState) bez náhrady výčet nemá smysl ve skriptování zveřejňovat class TNxBucket (TObject) bez náhrady třídu nemá smysl ve skriptování zveřejňovat class TNxKeyBucket (TNxBucket) bez náhrady třídu nemá smysl ve skriptování zveřejňovat class TNxContainer (TObject) bez náhrady třídu nemá smysl ve skriptování zveřejňovat class TNxCollection (TNxContainer) bez náhrady třídu nemá smysl ve skriptování zveřejňovat Stránka 22 z 22
Podobné dokumenty
Diplomová práce
Typ proměnné je jeden z výše uvedených datových typů. Pro deklaraci celého pole
proměnných se použije název proměnné []. Proměnné, kterým není přiřazen typ,
jsou METAPOSTem chápány, jako by byly ty...
1. Seznámení s C++ Builderem
programové jednotky další soubor, obsahující popis vzhledu formuláře (vlastnosti formuláře a objektů
umístěných na formuláři). Tento soubor má příponu DFM, jedná se o binární soubor, který si běžný...
Elektronická verze - Zpravodaj Československého sdružení
Jednak je dobré si uvědomit, že PostScript je interpretovaný jazyk. To
znamená, že součástí každého výstupního zařízení podporující PostScript je
interpret, program, který se stará o vykonávání pří...
C++ Builder 4.0 - Tvorba software
nazveme ho třeba okno.cpp a uložíme ho do adresáře Projects\01. Přitom se zároveň uloží i hlavičkový
soubor (okno.h) a soubor s popisem okna (okno.dfm). Poté se nás prostředí zeptá na jméno projekt...
close
Funkce pro sockety
int getsockopt(int sck, int lvl, int
optname, char* optval, int* optlen)
int setsockopt(int sck, int lvl, int
optname, char* optval, int optlen)
Dokumentace k API Balíkobot v1.75 2016-09-14
$aResponse = json_decode($response); // převod návratových hodnot do pole
DOPRAVCE – nahraďte za zkratku dopravce, přes kterého se bude balík posílat (cp – Česká pošta,
dpd – DPD, ppl – PPL, atd. v...
imigranti v české republice - Research Support Scheme
transformačních změn neodmyslitelně spojují s nutnou emigrací části populace transformující se
společnosti (např. Massey 1988). Na druhé straně jsou v této oblasti také další transformující se země...
01 WT3-WK3_12-Seiter_cz.qxd:WT3-WK3_12
Princip funkce . . .
Proud vzduchu temperovaný nebo
klimatizovaný na přesně zadanou
žádanou hodnotu proudí kontinuálně zkušebním prostorem a zaručuje optimální prostorové rozdělení
vzduchu a teplot...