Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Запустить код из текстовой переменной(аналог eval)


Автор: AntiLL 20.4.2006, 22:44
Доброго времени суток!
Есть ли в делфи какая-нибудь функция позволяющая запустить код, хранящийся в строковой переменной? Я такую штуку использую часто в php - функция eval. А есть что - нибудь такое в Delphi.
Помогите плз. 

Автор: Guedda 21.4.2006, 07:31
Нет. Надо самому написать. Просто парcишь строку, и каждое новое действие описываешь...  

Автор: Alexeis 21.4.2006, 09:54
AntiLL, в делфи можно испльзовать eval от VB
Код

procedure TForm1.Button1Click(Sender: TObject);     
var     
  sc: Variant;     
begin     
  SC:=CreateOLEObject('ScriptControl');     
  try     
    SC.Language:='VBScript';     
    SC.Timeout:=-1;     
    SC.AllowUI:=True;     
    Label1.Caption:=SC.Eval(Edit1.Text);     
  finally     
    SC:=Unassigned;     
  end;     
end;


спасибо Демо smile  

Автор: Girder 21.4.2006, 10:04
http://www.fast-report.com/en/products/products.php?BID=24

И т.д и т.п. smile 

Автор: SlePoY_SniPeR 17.4.2010, 15:45
Цитата

в делфи можно испльзовать eval от VB

А как именно? И если посчитаете этот вопрос слишком банальным, намекните, где можно про это почитать..
Код

  SC:=CreateOLEObject('ScriptControl');  

У меня Delphi7 матернулся на этой строке, undeclared identifier: 'CreateOLEObject'. Я так полагаю, нужно какой-то модуль прописать в "Uses"?

Автор: Akella 17.4.2010, 16:20
Посмотри в каком модуле это объявлено

Автор: Данкинг 17.4.2010, 17:10
Цитата(SlePoY_SniPeR @  17.4.2010,  16:45 Найти цитируемый пост)
Я так полагаю, нужно какой-то модуль прописать в "Uses"? 

...comobj

Автор: Alexeis 17.4.2010, 23:09
Кстати, вдруг кто захочет создать как COM объект. Вот модуль с описанием всех интерфейсов.
Код

{*******************************************************}
{                                                       }
{         Vladimir Gaitanoff Delphi VCL Library         }
{         Scripting: MS Script control                  }
{                                                       }
{         Source is auto-generated                      }
{         Copyright (c) 1997, 2000                      }
{                                                       }
{*******************************************************}

//{$I VG.INC }
{$D-,L-}

unit MSScript;

{ This file contains pascal declarations imported from a type library.
  This file will be written during each import or refresh of the type
  library editor.  Changes to this file will be discarded during the
  refresh process. }

{ Microsoft Script Control 1.0 }
{ Version 1.0 }

{ Conversion log:
  Warning: 'Procedure' is a reserved word. Procedure changed to Procedure_
  Warning: ScriptControlConstants: Modules are not supported.
  Warning: 'Object' is a reserved word. Parameter 'Object' in IScriptModuleCollection.Add changed to 'Object_'
  Warning: 'Object' is a reserved word. Parameter 'Object' in IScriptControl.AddObject changed to 'Object_'
  Warning: IScriptModule.Run parameter Parameters of type PSafeArray was written as OleVariant.
  Warning: IScriptControl.Run parameter Parameters of type PSafeArray was written as OleVariant.
 }

interface

uses Windows, ActiveX, Classes, OleCtrls;

const
  LIBID_MSScriptControl: TGUID = '{0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}';

const

{ States into which the scripting engine can be placed }

{ ScriptControlStates }

  Initialized = 0;
  Connected = 1;

const

{ Component class GUIDs }
  Class_Procedure_: TGUID = '{0E59F1DA-1FBE-11D0-8FF2-00A0D10038BC}';
  Class_Procedures: TGUID = '{0E59F1DB-1FBE-11D0-8FF2-00A0D10038BC}';
  Class_Module: TGUID = '{0E59F1DC-1FBE-11D0-8FF2-00A0D10038BC}';
  Class_Modules: TGUID = '{0E59F1DD-1FBE-11D0-8FF2-00A0D10038BC}';
  Class_Error: TGUID = '{0E59F1DE-1FBE-11D0-8FF2-00A0D10038BC}';
  Class_ScriptControl: TGUID = '{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}';

type

{ Forward declarations: Interfaces }
  IScriptProcedure = interface;
  IScriptProcedureDisp = dispinterface;
  IScriptProcedureCollection = interface;
  IScriptProcedureCollectionDisp = dispinterface;
  IScriptModule = interface;
  IScriptModuleDisp = dispinterface;
  IScriptModuleCollection = interface;
  IScriptModuleCollectionDisp = dispinterface;
  IScriptError = interface;
  IScriptErrorDisp = dispinterface;
  IScriptControl = interface;
  IScriptControlDisp = dispinterface;
  DScriptControlSource = dispinterface;

{ Forward declarations: CoClasses }
  ScriptControl = IScriptControl;

{ Forward declarations: Enums }
  ScriptControlStates = TOleEnum;

{ Describes a procedure }

  IScriptProcedure = interface(IDispatch)
    ['{70841C73-067D-11D0-95D8-00A02463AB28}']
    function Get_Name: WideString; safecall;
    function Get_NumArgs: Integer; safecall;
    function Get_HasReturnValue: WordBool; safecall;
    property Name: WideString read Get_Name;
    property NumArgs: Integer read Get_NumArgs;
    property HasReturnValue: WordBool read Get_HasReturnValue;
  end;

{ DispInterface declaration for Dual Interface IScriptProcedure }

  IScriptProcedureDisp = dispinterface
    ['{70841C73-067D-11D0-95D8-00A02463AB28}']
    property Name: WideString readonly dispid 0;
    property NumArgs: Integer readonly dispid 100;
    property HasReturnValue: WordBool readonly dispid 101;
  end;

{ Collection of procedures }

  IScriptProcedureCollection = interface(IDispatch)
    ['{70841C71-067D-11D0-95D8-00A02463AB28}']
    function Get__NewEnum: IUnknown; safecall;
    function Get_Item(Index: OleVariant): IScriptProcedure; safecall;
    function Get_Count: Integer; safecall;
    property NewEnum: IUnknown read Get__NewEnum;
    property Item[Index: OleVariant]: IScriptProcedure read Get_Item; default;
    property Count: Integer read Get_Count;
  end;

{ DispInterface declaration for Dual Interface IScriptProcedureCollection }

  IScriptProcedureCollectionDisp = dispinterface
    ['{70841C71-067D-11D0-95D8-00A02463AB28}']
    property NewEnum: IUnknown readonly dispid -4;
    property Item[Index: OleVariant]: IScriptProcedure readonly dispid 0; default;
    property Count: Integer readonly dispid 1;
  end;

{ Context in which functions can be defined and expressions can be evaluated }

  IScriptModule = interface(IDispatch)
    ['{70841C70-067D-11D0-95D8-00A02463AB28}']
    function Get_Name: WideString; safecall;
    function Get_CodeObject: IDispatch; safecall;
    function Get_Procedures: IScriptProcedureCollection; safecall;
    procedure AddCode(const Code: WideString); safecall;
    function Eval(const Expression: WideString): OleVariant; safecall;
    procedure ExecuteStatement(const Statement: WideString); safecall;
    function Run(const ProcedureName: WideString; var Parameters: PSafeArray): OleVariant; safecall;
    property Name: WideString read Get_Name;
    property CodeObject: IDispatch read Get_CodeObject;
    property Procedures: IScriptProcedureCollection read Get_Procedures;
  end;

{ DispInterface declaration for Dual Interface IScriptModule }

  IScriptModuleDisp = dispinterface
    ['{70841C70-067D-11D0-95D8-00A02463AB28}']
    property Name: WideString readonly dispid 0;
    property CodeObject: IDispatch readonly dispid 1000;
    property Procedures: IScriptProcedureCollection readonly dispid 1001;
    procedure AddCode(const Code: WideString); dispid 2000;
    function Eval(const Expression: WideString): OleVariant; dispid 2001;
    procedure ExecuteStatement(const Statement: WideString); dispid 2002;
    function Run(const ProcedureName: WideString; var Parameters: OleVariant): OleVariant; dispid 2003;
  end;

{ Collection of modules }

  IScriptModuleCollection = interface(IDispatch)
    ['{70841C6F-067D-11D0-95D8-00A02463AB28}']
    function Get__NewEnum: IUnknown; safecall;
    function Get_Item(Index: OleVariant): IScriptModule; safecall;
    function Get_Count: Integer; safecall;
    function Add(const Name: WideString; var Object_: OleVariant): IScriptModule; safecall;
    property NewEnum: IUnknown read Get__NewEnum;
    property Item[Index: OleVariant]: IScriptModule read Get_Item; default;
    property Count: Integer read Get_Count;
  end;

{ DispInterface declaration for Dual Interface IScriptModuleCollection }

  IScriptModuleCollectionDisp = dispinterface
    ['{70841C6F-067D-11D0-95D8-00A02463AB28}']
    property NewEnum: IUnknown readonly dispid -4;
    property Item[Index: OleVariant]: IScriptModule readonly dispid 0; default;
    property Count: Integer readonly dispid 1;
    function Add(const Name: WideString; var Object_: OleVariant): IScriptModule; dispid 2;
  end;

{ Provides access to scripting error information }

  IScriptError = interface(IDispatch)
    ['{70841C78-067D-11D0-95D8-00A02463AB28}']
    function Get_Number: Integer; safecall;
    function Get_Source: WideString; safecall;
    function Get_Description: WideString; safecall;
    function Get_HelpFile: WideString; safecall;
    function Get_HelpContext: Integer; safecall;
    function Get_Text: WideString; safecall;
    function Get_Line: Integer; safecall;
    function Get_Column: Integer; safecall;
    procedure Clear; safecall;
    property Number: Integer read Get_Number;
    property Source: WideString read Get_Source;
    property Description: WideString read Get_Description;
    property HelpFile: WideString read Get_HelpFile;
    property HelpContext: Integer read Get_HelpContext;
    property Text: WideString read Get_Text;
    property Line: Integer read Get_Line;
    property Column: Integer read Get_Column;
  end;

{ DispInterface declaration for Dual Interface IScriptError }

  IScriptErrorDisp = dispinterface
    ['{70841C78-067D-11D0-95D8-00A02463AB28}']
    property Number: Integer readonly dispid 201;
    property Source: WideString readonly dispid 202;
    property Description: WideString readonly dispid 203;
    property HelpFile: WideString readonly dispid 204;
    property HelpContext: Integer readonly dispid 205;
    property Text: WideString readonly dispid -517;
    property Line: Integer readonly dispid 206;
    property Column: Integer readonly dispid 207;
    procedure Clear; dispid 208;
  end;

{ Control to host scripting engines that understand the ActiveX Scripting interface }

  IScriptControl = interface(IDispatch)
    ['{0E59F1D3-1FBE-11D0-8FF2-00A0D10038BC}']
    function Get_Language: WideString; safecall;
    procedure Set_Language(const Value: WideString); safecall;
    function Get_State: ScriptControlStates; safecall;
    procedure Set_State(Value: ScriptControlStates); safecall;
    procedure Set_SitehWnd(Value: Integer); safecall;
    function Get_SitehWnd: Integer; safecall;
    function Get_Timeout: Integer; safecall;
    procedure Set_Timeout(Value: Integer); safecall;
    function Get_AllowUI: WordBool; safecall;
    procedure Set_AllowUI(Value: WordBool); safecall;
    function Get_UseSafeSubset: WordBool; safecall;
    procedure Set_UseSafeSubset(Value: WordBool); safecall;
    function Get_Modules: IScriptModuleCollection; safecall;
    function Get_Error: IScriptError; safecall;
    function Get_CodeObject: IDispatch; safecall;
    function Get_Procedures: IScriptProcedureCollection; safecall;
    procedure AboutBox; safecall;
    procedure AddObject(const Name: WideString; Object_: IDispatch; AddMembers: WordBool); safecall;
    procedure Reset; safecall;
    procedure AddCode(const Code: WideString); safecall;
    function Eval(const Expression: WideString): OleVariant; safecall;
    procedure ExecuteStatement(const Statement: WideString); safecall;
    function Run(const ProcedureName: WideString; var Parameters: PSafeArray): OleVariant; safecall;
    property Language: WideString read Get_Language write Set_Language;
    property State: ScriptControlStates read Get_State write Set_State;
    property SitehWnd: Integer read Get_SitehWnd write Set_SitehWnd;
    property Timeout: Integer read Get_Timeout write Set_Timeout;
    property AllowUI: WordBool read Get_AllowUI write Set_AllowUI;
    property UseSafeSubset: WordBool read Get_UseSafeSubset write Set_UseSafeSubset;
    property Modules: IScriptModuleCollection read Get_Modules;
    property Error: IScriptError read Get_Error;
    property CodeObject: IDispatch read Get_CodeObject;
    property Procedures: IScriptProcedureCollection read Get_Procedures;
  end;

{ DispInterface declaration for Dual Interface IScriptControl }

  IScriptControlDisp = dispinterface
    ['{0E59F1D3-1FBE-11D0-8FF2-00A0D10038BC}']
    property Language: WideString dispid 1500;
    property State: ScriptControlStates dispid 1501;
    property SitehWnd: Integer dispid 1502;
    property Timeout: Integer dispid 1503;
    property AllowUI: WordBool dispid 1504;
    property UseSafeSubset: WordBool dispid 1505;
    property Modules: IScriptModuleCollection readonly dispid 1506;
    property Error: IScriptError readonly dispid 1507;
    property CodeObject: IDispatch readonly dispid 1000;
    property Procedures: IScriptProcedureCollection readonly dispid 1001;
    procedure AboutBox; dispid -552;
    procedure AddObject(const Name: WideString; Object_: IDispatch; AddMembers: WordBool); dispid 2500;
    procedure Reset; dispid 2501;
    procedure AddCode(const Code: WideString); dispid 2000;
    function Eval(const Expression: WideString): OleVariant; dispid 2001;
    procedure ExecuteStatement(const Statement: WideString); dispid 2002;
    function Run(const ProcedureName: WideString; var Parameters: OleVariant): OleVariant; dispid 2003;
  end;

  DScriptControlSource = dispinterface
    ['{8B167D60-8605-11D0-ABCB-00A0C90FFFC0}']
    procedure Error; dispid 3000;
    procedure Timeout; dispid 3001;
  end;

{ Control to host scripting engines that understand the ActiveX Scripting interface }

  TScriptControl = class(TOleControl)
  private
    FOnError: TNotifyEvent;
    FOnTimeout: TNotifyEvent;
    FIntf: IScriptControl;
    function GetControlInterface: IScriptControl;
    function Get_Modules: IScriptModuleCollection;
    function Get_Error: IScriptError;
    function Get_Procedures: IScriptProcedureCollection;
  protected
    procedure CreateControl;
    procedure InitControlData; override;
    function GetTOleEnumProp(Index: Integer): TOleEnum;
    procedure SetTOleEnumProp(Index: Integer; Value: TOleEnum);
  public
    procedure AboutBox;
    procedure AddObject(const Name: WideString; AObject: IDispatch; AddMembers: WordBool);
    procedure Reset;
    procedure AddCode(const Code: WideString);
    function Eval(const Expression: WideString): OleVariant;
    procedure ExecuteStatement(const Statement: WideString);
    function Run(const ProcedureName: WideString; var Parameters: PSafeArray): OleVariant;
    property ControlInterface: IScriptControl read GetControlInterface;
    property Modules: IScriptModuleCollection read Get_Modules;
    property ErrorObject: IScriptError read Get_Error;
    property CodeObject: IDispatch index 1000 read GetIDispatchProp;
    property Procedures: IScriptProcedureCollection read Get_Procedures;
  published
    property Language: WideString index 1500 read GetWideStringProp write SetWideStringProp stored False;
    property State: ScriptControlStates index 1501 read GetTOleEnumProp write SetTOleEnumProp stored False;
    property SitehWnd: Integer index 1502 read GetIntegerProp write SetIntegerProp stored False;
    property Timeout: Integer index 1503 read GetIntegerProp write SetIntegerProp stored False;
    property AllowUI: WordBool index 1504 read GetWordBoolProp write SetWordBoolProp stored False;
    property UseSafeSubset: WordBool index 1505 read GetWordBoolProp write SetWordBoolProp stored False;
    property OnError: TNotifyEvent read FOnError write FOnError;
    property OnTimeout: TNotifyEvent read FOnTimeout write FOnTimeout;
  end;

implementation

uses ComObj;

procedure TScriptControl.InitControlData;
const
  CEventDispIDs: array[0..1] of Integer = (
    $00000BB8, $00000BB9);
  CControlData: TControlData = (
    ClassID: '{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}';
    EventIID: '{8B167D60-8605-11D0-ABCB-00A0C90FFFC0}';
    EventCount: 2;
    EventDispIDs: @CEventDispIDs;
    LicenseKey: nil;
    Flags: $00000000;
    Version: 300);
begin
  ControlData := @CControlData;
end;

procedure TScriptControl.CreateControl;

  procedure DoCreate;
  begin
    FIntf := IUnknown(OleObject) as IScriptControl;
  end;

begin
  if FIntf = nil then DoCreate;
end;

function TScriptControl.GetControlInterface: IScriptControl;
begin
  CreateControl;
  Result := FIntf;
end;

function TScriptControl.GetTOleEnumProp(Index: Integer): TOleEnum;
begin
  Result := GetIntegerProp(Index);
end;

procedure TScriptControl.SetTOleEnumProp(Index: Integer; Value: TOleEnum);
begin
  SetIntegerProp(Index, Value);
end;

procedure TScriptControl.AboutBox;
begin
  CreateControl;
  FIntf.AboutBox;

end;

procedure TScriptControl.AddObject(const Name: WideString; AObject: IDispatch; AddMembers: WordBool);
begin
  CreateControl;
  FIntf.AddObject(Name, AObject, AddMembers);
end;

procedure TScriptControl.Reset;
begin
  CreateControl;
  FIntf.Reset;
end;

procedure TScriptControl.AddCode(const Code: WideString);
begin
  CreateControl;
  FIntf.AddCode(Code);
end;

function TScriptControl.Eval(const Expression: WideString): OleVariant;
begin
  CreateControl;
  Result := FIntf.Eval(Expression);
end;

procedure TScriptControl.ExecuteStatement(const Statement: WideString);
begin
  CreateControl;

  FIntf.ExecuteStatement(Statement);
end;

function TScriptControl.Run(const ProcedureName: WideString; var Parameters: PSafeArray): OleVariant;
begin
  CreateControl;
  Result := FIntf.Run(ProcedureName, Parameters);
end;

function TScriptControl.Get_Modules: IScriptModuleCollection;
begin
  CreateControl;
  Result := FIntf.Modules;
end;

function TScriptControl.Get_Error: IScriptError;
begin
  CreateControl;
  Result := FIntf.Error;
end;

function TScriptControl.Get_Procedures: IScriptProcedureCollection;
begin
  CreateControl;
  Result := FIntf.Procedures;
end;

end.


Вот пример использования.

Код

uses ComObj, MSScript;

procedure TForm1.Button1Click(Sender: TObject);
var
  MSc : IScriptControl;
begin
  MSc := CreateComObject(Class_ScriptControl) as IScriptControl;
  try
    MSc.Language := 'VBScript';
    MSc.Timeout  := -1;
    MSc.AllowUI  := True;
    Edit2.Text   := MSc.Eval(Edit1.Text);
  finally
    MSc := nil;
  end;
end;

Автор: Mikel 19.4.2010, 13:50
Смотря для каких целей smile
http://torry.net/pages.php?id=280

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)