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: <
>(<>) 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 <> to <>“ 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 := '<<>>';
mZip.Open('<<>>', zfomWrite);
mZip.AddFile('<<>>');
mZip.AddFile('<<>>');
mZip.AddFile('<<>>'); mZip.Add; finally mZip.Free; end;
mZip.AddFile('<<>>'); 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 := '<<>>';
try
mZip.ExtrBaseDir := '<<<extractpath>>>';
mZip.Open('<<>>', 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('!! Chyba !!
'+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('Špatné číslo objednávky'); end else begin mOrder.Load(mID, nil); mOrderRows := mOrder.GetLoadedCollectionMonikerForFieldCode(mOrder.GetFieldCode('Rows')); mRes.Add(''); mRes.Add( 'Položka | Počet | Jednotka | Celková cena | DPH | ‘ + 'Datum dodání |
'); for i := 0 to mOrderrows.Count - 1 do begin mRes.Add(''+NxEvalObjectExprAsString(mOrderRows.BusinessObject[i], 'StoreCard_ID.Name')+' | '+ ''+FloatTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('Quantity'))+' | '+ ''+mOrderRows.BusinessObject[i].GetFieldValueAsString('QUnit')+' | '+ ''+FloatTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('TAmount'))+' | '+ ''+FloatTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('VatRate'))+' | '+ ''+DateTostr(mOrderRows.BusinessObject[i].GetFieldValueAsFloat('DeliveryDate$DATE'))+' |
'); end; mRes.Add('
'); Result := TEncoding.ANSI.GetBytes(mRes.text); end; finally mOrder.Free;
Stránka 14 z 22
mRes.Free; end; end else result := TEncoding.ANSI.GetBytes('Musíte zadat číslo objednávky'); 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