Sfairadora

  • Referenční příručka

OLE objekty

OLE Automation (nebo jen Automation) představuje mechanismus operačního sytému Windows, umožňující jednotným způsobem propojovat různé programy. Technicky vzato jde o využití modelu COM (Component Object Model), které umožňuje jednomu programu využívat objekty vytvořené programem jiným prostřednictvím interfacu IDispatch.
Základní jednotkou mechanismu OLE je takzvaný objekt (OLE objekt), který má definované určité vlastnosti (properties) a metody. V jazyce Enki je definován typ OLE_object, který slouží k reprezentaci odkazu na OLE objekt. OLE objekt se vytvoří buď načtením souboru, v kterém jsou uložena data daného objektu – k tomu slouží funkce OLE_object_open_file, nebo vytvořením nového objektu funkcí OLE_object_create na základě zadaného názvu nebo identifikátoru třídy. Názvy a identifikátory tříd a jejich korespondence s příslušnými typy souborů jsou uloženy v registrech Windows instalací programu. Názvy dostupných tříd, jejich vlastností a metod tedy závisejí na konkrétních nainstalovaných programech.
Vlastnost OLE objektu se zjistí zapsáním jejího názvu odděleného tečkou za proměnnou objektu, zcela analogicky jako zjištění složky struktury:
var String name = ole_obj.Name;
Nastavení hodnoty vlastnosti se provede běžně některým z operátorů přiřazení:
ole_obj.Size += 5;
Vyvolání metody se provede zapsáním jejího názvu k objektu, stejně jako u názvů vlastností. Za názvem metody mohou být navíc parametry uzavřené v kulatých závorkách:
var OLE_object winf = ole_obj.GetFolder("C:\Windows");
Poznámka: vzhledem k tomu, že Enki nezkoumá očekávané typy parametrů metod, a vzhledem k tomu, že lze parametr předat i odkazem, je vhodné pro zvýšení efektivity parametry zadané jako l-hodnoty (tj. odkazy na proměnné či datové položky) přetypovat na příslušné očekávané typy. V opačném případě se takový parametr bude předávat odkazem, což je podstatně méně efektivní. Je tedy vhodné psát:
var OLE_object winf = ole_obj.GetFolder([String]složka);
místo
var OLE_object winf = ole_obj.GetFolder(složka);
Seznam právě existujících objektů (typicky dokumentů otevřených v jiných programech) lze získat funkcí OLE_running_object_table.
Některé OLE objekty představují takzvané kolekce (collection), to znamená, že obsahujíc seznam hodnot či jiných OLE objektů. Kolekce lze přirozeně procházet příkazem for.
Poznámka: vzhledem k tomu, že proměnná typu OLE_objekt neobsahuje skutečně daný objekt, ale jenom odkaz na něj, a vzhledem k tomu, že neexistuje žádný mechanismus, jak uložit do souboru odkaz na OLE objekt, není možné správně uložit stav výpočtu pracujícího s OLE objekty. Na rozdíl od ostatních případů, pokud se Sfairadora ukončí, zatímco probíhá nějaký výpočet, odkazy na OLE objekty se neuloží, takže po případném načtení a pokračováním ve výpočtu, bude výsledkem pokusu použít neobnovený OLE objekt chyba „objekt ztracen“.

Příklad 1

Zjištění seznamu souborů v dané složce a jeho uložení do tabulky spolu s velikostmi souborů:
var OLE_object fso = OLE_object_create("Scripting.FileSystemObject");
document.data.tabulka = INIT; // vymazání původního obsahu tabulky
for(x = fso.GetFolder(document.data.dir).Files)
(
document.data.tabulka <- insert({x.Name, x.Size})
)
Příklad předpokládá, že je v sekci dokumentu Data definována tabulky table se dvěma sloupci: jedním typu řetězec (String) a druhým typu celé číslo (Int). Dále přepokládá, že je v sekci Data definována položka dir typu String, ve které je uložena cesta k složce, jejíž soubory se mají zjistit.
Použitý objekt s názvem “Scripting.FileSystemObject” je standardní součástí Windows. Dokumentaci k němu lze získat na internetových stránkách msdn.microsoft.com.

Příklad 2

Načíst hodnotu buňky z tabulky aplikace Excel lze následovně:
var OLE_object workbook = OLE_object_open_file("C:\wb.xls");
var OLE_object sheet = workbook.Sheets("List1");
var OLE_object range = sheet.Range("A1");
var Union value = range.Value();
Tento příklad otevře soubor „wb.xls“ a z jeho listu „List1“ přečte hodnotu buňky „A1“. Hodnota je uložena do proměnné typu Union, takže je zachován typ dat uložený v buňce. Skutečná hodnota může být typu Real, String, nebo None, pokud je buňka prázdná. Aby příklad fungoval, je nutné, aby na počítači byla nainstalována aplikace Excel z balíku Microsoft Office.

Přehled