Hallo,<BR> kann mir jemand ein Beispiel (bzw einen Literaturhinweis) nennen,<BR> aus dem ich erkennen kann, wie man aus einem Microsoft Script Control (VBScript) <BR> auf Programmeigene Objekte zugreifen kann?<BR>Das muss irgendwie über ScriptControl.AddObject funktionieren aber wie funktioniert das genau?
Announcement
Collapse
No announcement yet.
Microsoft Script Control
Collapse
X
-
Hallo,
das folgende Beispiel demonstriert, wie das eigene Programm Scripte ausführen kann, die der Anwender vorher in ein TMemo eingetippt hat. Dazu sind die folgenden Schritte notwendig:
1. TScriptControl-Eigenschaft <b>Language</b> mit 'VBScript' initialisieren <br>
2. TScriptControl-Eigenschaft <b>SitehWnd</b> mit dem Fensterhandle des Formulars initialisieren<br>
3. TScriptControl-Methode <b>AddCode</b> aufrufen, um den VBScript-Text zuzuweisen (es dürfen dort beliebig viele Funktionen übergeben werden)<br>
4. TScriptControl-Methode <b>Run</b> führt die VBScript-Funktion aus, der 1. Parameter enthält den Namen der Funktion
<pre>
{ ************************************************** **************
Autor : Andreas Kosch
Compiler : Delphi 6.01 Enterprise UpdatePack#1
Betriebssystem : Windows XP Professional
Erstellt am : 31.12.2001
Beschreibung : Microsoft Script Control im eigenen Programm
einsetzen
************************************************** ************** }
unit MSSCDemoFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, OleCtrls, MSScriptControl_TLB;
type
TForm1 = class(TForm)
ScriptControl1: TScriptControl;
Memo1: TMemo;
StatusBar1: TStatusBar;
ButtonCalc: TButton;
EditNetto: TEdit;
Netto: TLabel;
Brutto: TLabel;
StaticTextBrutto: TStaticText;
ButtonTest: TButton;
procedure ButtonCalcClick(Sender: TObject);
procedure ButtonTestClick(Sender: TObject);
procedure ScriptControl1Error(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ActiveX;
{ Fall a) VBScript-Funktion ohne Parameter aufrufen
function OSTest
OSTest = "Der Text aus der VBScript-Funktion"
end function
}
procedure TForm1.ButtonTestClick(Sender: TObject);
var
v : Variant;
begin
with ScriptControl1 do
begin
Language := 'VBScript';
SitehWnd := Handle;
AddCode(Memo1.Lines.Text);
end;
// Späte Bindung -> optionale Parameter ausnutzen
v := ScriptControl1.ControlInterface;
StatusBar1.SimpleText := v.Run('OSTest');
ScriptControl1.Reset;
end;
{ Fall b) VBScript-Funktion mit 2 Parameter aufrufen
function OSMWSt (Netto,SteuerSatz)
Dim vSt
vSt = 1 + (SteuerSatz / 100)
OSMWSt = Netto * vSt
end function
}
procedure TForm1.ButtonCalcClick(Sender: TObject);
var
Params : PSafeArray;
v : Variant;
begin
with ScriptControl1 do
begin
Language := 'VBScript';
SitehWnd := Handle;
AddCode(Memo1.Lines.Text);
end;
v := VarArrayCreate([0, 1], varVariant);
v[0] := EditNetto.Text;
v[1] := '16';
Params := PSafeArray(TVarData(v).VArray);
StaticTextBrutto.Caption := ScriptControl1.Run('OSMWSt', Params);
ScriptControl1.Reset;
end;
procedure TForm1.ScriptControl1Error(Sender: TObject);
begin
ShowMessage('Ein Problem!);
end;
end.
</pre>
Die <b>TScriptControl</b>-Komponente baut Delphi beim Import des ActiveX von <i>Microsoft Script Control 1.x</i> automatisch zusammen.
Wenn das Script auf eigene mit Delphi geschriebene COM-Objekte zugreifen will, muss dieses von <b>TAutoObject</b> abgeleitet werden (Delphi-Experte für ein Automatisierungsobjekt).
<pre>
procedure TForm1.FormShow(Sender: TObject);
begin
ScriptControl1.SitehWnd := Self.Handle;
FAutoObject := TOSScriptDemo.Create;
ScriptControl1.AddObject('OSScript', FAutoObject, False);
end;
</pre>
Danach ist das eigene Objekt auch in der Scriptsprache verfügbar
-
Hallo Herr Kosch,
vielen dank für die schnelle Antwort.<BR> Die Scriptausführung funktioniert auch einwandfrei. Ich möchte aber aus dem Script heraus auf Felder einer Paradox-Tabelle zugreifen (lesend und schreibend). Ist dies überhaupt möglich ohne den Tabellenzugriff komplett in VBSript zu realiesieren? <BR>Die TTable komponente existieren ja schließlich schon in meiner Anwendun
Comment
-
Hallo,
>Ich möchte aber aus dem Script heraus auf Felder einer Paradox-Tabelle zugreifen ...
in diesem Fall muss das eigene Automation-Objekt diese Funktionen über die Interface-Methoden veröffentlichen, so dass der folgende Zugriffsweg gilt:
Script -> Automation-Objekt -> BDE -> Paradox-Tabelle
Das Script ruft nur eine Interface-Methode des Automation-Objekts auf, und dort findet der tatsächliche Zugriff auf die Paradox-Tabelle statt, ohne das im Script diese ganzen Details extra angegeben werden müssen.
Beim Zugriff über ADO kommt das Script ohne eigenes Automation-Objekt aus, aber dafür müssen entsprechend viele Script-Zeilen eingetippt werden
Comment
Comment