Vlastnosti ovladače
Ovladač nepoužívá parametrický ani mapovací soubor. V aplikaci
se definuje pouze jméno ovladače:
driver
excel {driver = 'cw_excel.dll'};
end_driver;
Ovladač pro práci s tabulkami používá aplikaci Microsoft Excel.
Excel je při práci s tabulkou spuštěný jako samostatný proces,
může být viditelný nebo skrytý. Pokud je Excel viditelný, může být
přepnutý v interaktivním režimu (uživatel v něm může pracovat),
nebo může být editace zakázaná (viz procedury SetVisiblea SetInteractive).
S ovladačem se pracuje vždy pouze prostřednictvím
nativních procedur. Některé operace mohou být časově náročnější,
proto existují ve dvou variantách:
blokující (synchronní) Například StartExcel(),
Open(), Save(), SaveAs() procedury
po celou dobu vykonávání požadované akce zablokují volajícího,
to způsobí zastavení celé aplikace. Tyto procedury je vhodné
používat pouze v aplikacích, které v daný okamžik mimo práce s
Excelem nevykonávají žádnou činnost.
neblokující (asynchronní) jména procedur začínají
klíčovým slovem Async. Například: AsyncStartExcel(),
AsyncOpen(), AsyncSave(), AsyncSaveAs() zavoláním
procedury pouze zahájí požadovanou operaci. Operace probíhá na
pozadí a po jejím dokončení je vyvolána výjimka ovladače a
nastaven kanál č 1. Na dokončení operace je možné čekat čtením
tohoto kanálu. Pokud je požadováno čtení a probíhá asynchronní
operace, ovladač dokončí čtení až po dokončení operace. Pokud má
tento kanál nastaven timeout, je možné čekat na jeho přečtení -
tedy na dokončení operace bez zablokování zbytku aplikace (čeká
jenom přístroj, který operaci spustil). Tento postup je
vysvětlen v samostatné ukázce v kapitole Asynchronní
operace Asynchronní operace.
Procedury ovladače
Procedury které pracují synchronně (nezačínají klíčovým slovem
Async) vrací jako návratovou hodnotu výsledek operace (pokud dojde
k chybě vrací false). Procedury začínající klíčovým slovem Async
pracuje asynchronně (pouze zahájí operaci a ihned skončí) vrací
false pokud není možné zahájit požadovanou operaci. To je v
případě kdy předchozí operace neskončila.
Ovladač poskytuje následující procedury:
Pro práci se soubory: New,Open,Save,SaveAs,Close
Editaci tabulek: SetValue,GetValue,HasFormula,GetFormula,SetFormula,SetTextColor,SetInteriorColor
Práce s listy (sheets): GetSheetsCount,ActivateSheet,GetSheetName,SetSheetName,CreateSheet,DeleteSheet
- StartExcel() : boolean
- AsyncStartExcel() : boolean
-
Procedura spustí Microsoft Excel. Pokud proběhne
spouštění úspěšně vrací funkce hodnotu true. Microsoft Excel
při spuštění vytvoří nový dokument, který obsahuje jeden
prázdný list.
- StopExcel() : boolean
- AsyncStopExcel() : boolean
-
Procedura ukončí Microsoft Excel. Pokud proběhne úspěšně
vrací funkce hodnotu true.
- SetVisible( visible : boolean ) : boolean
-
Procedura umožňuje nastavit viditelnost aplikace
Microsoft Excel. Pokud nastavení proběhne úspěšně vrací
funkce hodnotu true.
- SetInteractive( interactive : boolean ) : boolean
-
Procedura umožňuje povolit uživateli zasahovat do tabulek
v aplikaci Microsoft Excel. Pokud je interactive = false,
je editace v Excelu zakázána. Pokud nastavení proběhne
úspěšně vrací funkce hodnotu true.
- New() : boolean
- AsyncNew() : boolean
-
Procedura vytvoří nový prázdný soubor. Pokud proběhne
úspěšně vrací funkce hodnotu true.
- Open( FileName : string ) : boolean
- AsyncOpen( FileName : string ) : boolean
-
Procedura otevře soubor dle parametru FileName.
Pokud proběhne úspěšně vrací funkce hodnotu true.
- Save() : boolean
- AsyncSave() : boolean
-
Procedura uloží soubor. Pokud proběhne úspěšně vrací
funkce hodnotu true.
- SaveAs( FileName : string ) : boolean
- AsyncSaveAs( FileName : string ) : boolean
-
Procedura uloží soubor pod novým jménem dle parametru
FileName. Pokud proběhne úspěšně vrací funkce
hodnotu true.
- Close() : boolean
-
Procedura zavře aktuální soubor. Pokud proběhne úspěšně
vrací funkce hodnotu true.
- SetValue( Row, Column : longcard; Value : string ) :
boolean;
-
Procedura nastaví hodnotu Value do buňky dle
parametrů Row - řádek, Column -
sloupec. Touto procedurou je možné zadat také vzorek,
vkládaný text musí začínat rovnítkem.
- GetValue( Row, Column : longcard; var Value : string ) :
boolean;
-
Procedura vrátí obsah buňky dle parametrů Row
- řádek, Column - sloupec. Pokud buňka obsahuje
vzorec, procedura vrátí výsledek vzorce. Pro přečtení vzorce
slouží procedura GetFormula.
- HasFormula( Row, Column : loncard; var HasFormula :
boolean ) : boolean
-
Procedura umožňuje zjistit jestli buňka (dle parametrů
Row - řádek, Column - sloupec)
obsahuje vzorec.
- SetFormula( Row, Column : loncard; Formula : string ) :
boolean
-
Procedura nastaví vzorec do buňky dle parametrů Row
- řádek, Column - sloupec. Vzorec je zadáván
bez rovnítka na začátku.
- GetFormula( Row, Column : loncard; var Formula : string
) : boolean
-
Procedura v parametru Formula vrací vzorec
buňky dle parametrů Row - řádek, Column
- sloupec. Vzorec je bez rovnítka na začátku.
- SetTextColor( Row, Column : loncard; Red,Green,Blue :
cardinal ) : boolean
-
Procedura nastaví barvu textu v buňce určené parametry
Row - řádek, Column - sloupec.
- SetInteriorColor( Row, Column : loncard; Red,Green,Blue
: cardinal ) : boolean
-
Procedura nastaví barvu výplně buňky určené parametry
Row - řádek, Column - sloupec.
- GetSheetsCount() : longcard
-
Procedura vrací počet listů v souboru.
- ActivateSheet( Sheet : longcard ) : boolean;
-
Procedura nastaví vybraný list.
- GetSheetName( var SheetName : string ) : boolean;
-
Procedura vrací jméno aktivního listu.
- SetSheetName( SheetName : string ) : boolean;
-
Procedura nastaví jméno aktivního listu.
- CreateSheet() : boolean
-
Procedura vytvoří nový list.
- DeleteSheet() : boolean
-
Procedura smaže aktivní list. Microsoft Excel ve většině
verzí nedovolí smazat poslední list.
Asynchronní operace
V následujícím příkladu si ukážeme jak můžeme jednoduše čekat
na dokončení operace ovladačem bez zablokování zbytku aplikace. Ve
většině případů potřebujeme vykonat posloupnost několika operací
(například: spustit Excel, otevřít soubor, zapsat několik hodnot a
uložit soubor). Novou operaci je možné zahájit až po dokončení
předchozí operace. Nový požadavek můžeme zahájit až po skončení
předchozího. Pokud nemůžeme využít synchronní (blokující)
procedury (nemůžeme zablokovat celou aplikaci na dobu kdy Excel
pracuje) musíme používat asynchronní procedury a čekat v přístroji
na jejich dokončení.
K čekání využijeme kanál č 1. kterému nastavíme timeout. Čtení
tohoto kanálu trvá tak dlouho dokud pracuje procedurou spuštěná
operace.
V aplikaci definujeme ovladač a kanál:
driver
excel {driver = 'excel.dll'};
end_driver;
channel
ch_1 : boolean {driver = excel; driver_index = 1; direction = input; timeout = 10};
end_channel;
Celá sekvence musí proběhnout v časovém kroku přístroje.
Naprogramujeme ji tedy v proceduře OnActivate().
Nejprve zahájíme požadovanou operaci:
b := excel.AsyncStartExcel();
nyní musíme počkat na dokončení. Příkazem yield
přerušíme provádění procedury. Procedura bude pokračovat v
následujícím časovém kroku. V novém časovém kroku přečteme kanál č
1. Komunikace tohoto kanálu bude trvat tak dlouho dokud bude
ovladač vykonávat předchozí příkaz (AsyncStartExcel).
Aktivace našeho přístroje musí počkat na dokončení čtení tohoto
kanálu a díky tomu počká i na dokončení operace ovladače.
Maximální doba čekání odpovídá parametru timeout kanálu ch_1.
yield;
ok := ch_1;
Nyní zkontrolujeme výsledek operace a pokračujeme dalším
krokem:
if not ok then
stop;
end;
b := excel.AsyncOpen( 'a.xlsx' );
Kompletní příklad otevře soubor, zapíše 10 hodnot, uloží soubor
a ukončí Excel. Pro přehlednost je zde vynecháno kontrolování
výsledků operace.
driver
excel {driver = 'excel.dll'};
end_driver;
data
channel
ch_1 : boolean {driver = excel; driver_index = 1; direction = input; timeout = 10};
end_channel;
end_data;
instrument
button button_2;
gui
owner = panel_1;
position = 661, 14, 100, 51;
end_gui;
text_list
text = 'RUN';
end_text_list;
procedure OnActivate();
var
b,ok : boolean;
i : integer;
begin
b := excel.AsyncStartExcel();
yield; // *** Časový krok 2 ***************************************************
ok := ch_1;
b := excel.AsyncOpen( 'a.xlsx' );
yield; // *** Časový krok 3 ***************************************************
ok := ch_1;
for i := 1 to 10 do
b := excel.SetValue( i,1,'Row ' + i:s );
end;
b := excel.AsyncSaveAs( 'b.xlsx' );
yield; // *** Časový krok ***************************************************
ok := ch_1;
b := excel.Close();
end_procedure;
procedure OnPress();
begin
send self;
end_procedure;
end_button;
end_instrument;
|