Announcement

Collapse
No announcement yet.

Microsoft Script Control

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Microsoft Script Control

    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?

  • #2
    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

    Comment


    • #3
      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


      • #4
        Hallo,

        &gt;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

        Working...
        X