|
|
JavaScript, VBScript futtatása Delphi-ből
|
|
Példaprogram letöltése
21346 bájt
|
Mellékelt példában bemutatásra kerül a Microsoft egyik ActiveX objektuma, melynek segítségével Java script, vagy Visual Basic script-et futtathatunk Delphi-s alkalmazásunkból.
Hogy mire jó? Számtalan dologra. Az egyszerű példákon túl igen bonyolult programokig mindenre. Gondoljuk csak arra, hogy script-et, akár web lapról is futtathatunk és ezt akár kombinálhatjuk egy Delphi-s alkalmazás által nyújtott számtalan lehetőséggel, amibe belekeverhetünk akár más alkalmazásokat is, mint például egy Word, Excel, Outlook, stb.
A mellékelt példaprogram megnyitása előtt a Microsoft Script Control nevű ActiveX objektumát telepíteni kell a Delphi alá. Ehhez válassza a Component - Import ActiveX Control menüpontot, majd a megjelenő listából a Microsoft Script Control elemet. Ezek után kattintson az Install gombra és telepítse a komponenst egy tetszőleges csomagba, mely lehet akár a Delphi User's Components is.
Mellékelt példa két részből áll. Nézzük először a Step01 könyvtárban lévőt.
Ez egy igen egyszerű példa, segítségével csak a Microsoft Script Control alapvető működését kívánjuk bemutatni.
A Form-ra elhelyezünk egy TScriptControl komponenst, majd a Language property-ébe meg kell adnunk, hogy milyen nyelvű script-et szeretnénk futtatni.
Ezek után már csak a script futtatása marad, melyet az ExecuteStatement hívásával kell megtennünk. Paraméterként kell átadni egy sztringet. Ennek a sztringnek kell tartalmaznia a futtatandó script-et, mely most egy egyszerű üzenet ablakot jelenít meg, benne egy felirattal.
procedure TForm1.Button1Click(Sender: TObject);
begin
ScriptControl1.ExecuteStatement('MsgBox
"Delphi Software Online"');
end;
A második példát a Step02 könyvtárban találjuk. Itt már kissé bonyolódik a helyzet az előző példához képest. A kitűzött feladat a következő: a megvalósított script futtatásakor nyisson meg egy Word alkalmazást és egy új dokumentumba írjon szöveget.
Nézzük a megvalósítást:
Nyissunk egy új alkalmazást (File - New Application). Helyezzünk el ismét egy TScriptControl komponenst. A Language property-be ismét meg kell adnunk, hogy milyen nyelvű script-et szeretnénk futtatni. Ez most is VBScript. Mivel a most futtatandó script-ünk több mint egy sor, így célszerűbb külön állományba helyezni és ezt betölteni majd sztringként átadni a TScriptControl-nak.
Ez a script a mellékelt word.vbs állományban található. Ezt egy TStringList segítségével töltjük be, majd egyetlen sztringként átadjuk az ExecuteStatement függvénynek.
procedure TForm1.Button1Click(Sender: TObject);
var
list: TStringList;
begin
list:=TStringList.Create;
list.LoadFromFile(ExtractFilePath(Application.ExeName)+
'word.vbs');
ScriptControl1.ExecuteStatement(list.Text);
list.Free;
end;
Nézzük mit tartalmaz ez a script állomány:
Deklarálunk két változót.
Meghívjuk a Self nevű objektum Method1 nevű eljárását paraméterként a Word.Application sztringet és az egyik változót. A Method1 dolga létrehozni a kapcsolatot a Word programmal és ennek objektumát kapjuk vissza az átadott WordObj változóba.
Self.Method1 "Word.Application", WordObj
Ezek után ezt a változót használva láthatóvá tesszük a Word-öt és létrehozunk benne egy új alkalmazást.
WordObj.Visible=true
WordObj.Documents.Add
Lekérdezzük a Selection objektumot, melynek segítségével elvégezhetjük a szöveg "begépelését" a Word-be.
set Sel=WordObj.Documents.Application.Selection
sel.TypeText("Delphi Software Online")
sel.TypeParagraph
sel.TypeText("http://www.animare.hu/dso/")
A script tanulmányozása során felmerülhet a kérdés, hogy honnan jön a Self nevű objektum és miért is van Method1 nevű eljárása. Ez nyilván már nem a TScriptControl része, mivel egy egyedi funkciót valósít meg. Mivel azonban a script feldolgozása a TScriptControl feladata, így mégis csak kell, hogy legyen köze a Self nevű objektumhoz.
Mivel a TScriptControl nem rendelkezik olyan funkcióval, mely lehetőséget biztosít arra, hogy elérhessük a Word-öt, viszont rendelkezik olyan lehetőséggel, hogy egy tetszőleges objektumot adhassuk a TScriptControl-hoz, mely tetszőleges funkciókkal van felruházva.
Ezért létrehozunk egy TTestScript objektumot, mely képes erre. Ebből az objektumból egy példányt létrehozunk és a TScriptControl-hoz adjuk a programunk indulásakor, a Form-unk OnCreate eseményénél. Ehhez a TScriptControl AddObject függvénye szükséges. Itt első paraméterként a hozzáadandó objektumunk nevét kell megadnunk sztringként. Ezt most Self-re kereszteltük el. Második paraméterben pedig magát a létrehozott objektumot kell átadnunk. Ettől kezdve a script-ben már használható a Self nevű objektum, mellyel nem másra, mint a saját objektumunkra hivatkozhatunk.
procedure TForm1.FormCreate(Sender: TObject);
begin
ScriptControl1.AddObject('Self', TTestScript.Create, false);
end;
Nézzük miként is áll elő egy ilyen objektum és mit tesz a Method1 nevű eljárása.
Válasszuk a Delphi File - New menüpontját, majd a megjelenő ablakban az ActiveX lapot és itt az Automation Object-et. Ekkor megjelenik az Automation Object Wizard nevű ablak. Itt kell tetszés szerint nevet adnunk a létrehozandó objektumunknak. Mellékelt példában TestScript-nek neveztük el. Az Ok gomb után létrejön a Unit2.pas és a Project1_TLB.pas állomány. A Unit2-ben találjuk a TTestScript objektumot, mely a TAutoObject-ből származik, valamint az ITestScript interfészből. Ez utóbbit a Project1_TLB-ben találjuk meg.
Rögtön váltsunk is át erre és vegyünk fel egy új metódust a Type Library-ba.
Ehhez kattintsunk a New Method gombra. Az új metódusnak két paramétere legyen: az egyiket nevezzük AppName-nek típusa Variant legyen és bemenő paraméterként adjuk meg.
A másik AppObject névre hallgat, típusa Variant pointer és kimenő a típusa. A visszatérési értéke HRESULT kell, hogy legyen, mivel Automation Object esetén a függvényeknek nem adhatunk más visszatérési típust. Ha ezzel megvagyunk, akkor kattintsunk a Refresh Implementation gombra és ezzel az új metódus bekerül a forráskódba is.
Most térhetünk vissza a Unit2.pas-hoz, ahol a Method1 deklarációja már megjelent, így nekünk már csak az elvégzendő kódot kell begépelnünk. Mivel a feladat szerint a Method1 dolga, hogy létrehozzon kapcsolatot azzal az alkalmazással, melyet az AppName paraméter határoz meg, így nincs más teendőnk, mint a ComObj unit CreateOleObject függvényét meghívnunk és paraméterként továbbadni a kapott AppName változó értékét. Mivel a script-nek vissza kell adni a létrejött alkalmazás objektumát, melyet a CreateOleObject szolgáltat, így ennek értékét rögtön az AppObject paraméternek adjuk.
procedure TTestScript.Method1(AppName: OleVariant;
out AppObject: OleVariant);
begin
AppObject:=ComObj.CreateOleObject(AppName);
end;
Felhívnánk a figyelmet, hogy a mellékelt példa megvalósításánál figyelmen kívül hagytuk a hibakezelést. Éles alkalmazásban ezt nem célszerű kihagyni, mivel elképzelhető számtalan hibalehetőség, például az adott gépen nincs is telepítve a Word. Ettől kezdve a CreateOleObject sem fogja visszaadni a nem létező program objektumát, így a script is egy nem létező objektumra próbál hivatkozni.
Most tehát már a TScriptControl értelmezni tudja a Self nevű objektumot a script-ben, valamint képes lesz ennek Method1 nevű függvényét is meghívni. Így létrejön a kívánt eredmény.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 122. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|