delphi 有脚本功能吗? ( 积分: 200 )

  • 主题发起人 主题发起人 yeskert1
  • 开始时间 开始时间
Y

yeskert1

Unregistered / Unconfirmed
GUEST, unregistred user!
我希望在运行时执行pascal代码(我写的一个统计软件,公式太多且老变动,我希望不要因公式的改变而修改程序,希望用户利用我提供的定义公式的界面自己搞定公式的事情!),代码放在数据库中,需要的时候取过来执行!
看了几个script控件,都没有办法与主程序交互(我想,运行时无法通过变量名称访问delphi的变量的!对吧?),不知道谁有好的方法?
先谢谢!如果问题解决再送300分!
 
我希望在运行时执行pascal代码(我写的一个统计软件,公式太多且老变动,我希望不要因公式的改变而修改程序,希望用户利用我提供的定义公式的界面自己搞定公式的事情!),代码放在数据库中,需要的时候取过来执行!
看了几个script控件,都没有办法与主程序交互(我想,运行时无法通过变量名称访问delphi的变量的!对吧?),不知道谁有好的方法?
先谢谢!如果问题解决再送300分!
 
将你程序作成服务器,把计算的那一部分作成接口。就可以用教本控制了。
用什么教本那就随你便了
给我个邮箱,我有个例子,希望对你有帮助。
 
哈哈!这分肯定是我的了!我刚找到的控件解决了与你类似的问题!
绝对是交互的!
http://www.arraymicro.com/yk/download_xpascal.htm
 
to 东风在说:
谢谢!
正在下载中!看说明确实是我需要的!
 
那个 xpascal 没有源码!
只给你推荐最好的:pascalscript
http://www.remobjects.com/page.asp?id={9A30A672-62C8-4131-BA89-EEBBE7E302E6}
全免费,完全源码、例子,官方最新版是 3.0.53
著名的安装程序 inno setup 用的就是这个脚本引擎
象一般的变量、对象等交互对他简直是小菜 ...
 
FastReport中有个脚本引擎FastScript
 
非常感兴趣~!
强烈关注~!
 
不错,收藏
 
FastScript 不错 支持访问部分标准DELPHI控件
稍稍 修改一把 可以支持访问DELPHI自定义控件属性
 
偶比较过 FastScript 和 PascalScript,FastScript 支持 C、VB 等形式的脚本,他们实现的原理几乎是一样的,都采用类似与“预编译”成二进制字节码后再执行的方式。不过 FastScript 不是开源的,当前最新附带源码的只有 1.5;说到“自定义控件属性”其实 PascalScript 附带工具可以直接转换已有的组件等。
 
我也想要这东东,关注中...
 
关注中,还有其它更强大的控件么?
 
to 东风在说:
昨天下载了xpascal,并按照其使用说明试了一下,感觉很不错!非常感谢!
to LSUPER:
Pascal Script 到了3.0了!3.0的东西应该比较稳定了,而xpascal才1.0!我没有用过
Pascal Script ,不知道它怎样访问delphi的变量以及函数?这是我需要的!另外--这一点我目前不必要只是想了解--Pascal Script 是否也允许访问其内部变量?也支持语法扩展否?
LSUPER兄,宝贵经验可舍得分享?
 
=^0^= 其实他的 demo 已经非常清楚了,这是我以前写的一个例子的片断,包括变量交互、delphi 已有对象封装、自定义类导入等等的使用:

需要整个例子的留下 mail ....

-----------------------------------------

unit MainFrm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Menus, uPSComponent, uPSCompiler, uPSRuntime, InterOp;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Compile1: TMenuItem;
MainMenu1: TMainMenu;
Memo1: TMemo;
Memo2: TMemo;
Program1: TMenuItem;
PS3DllPlugin: TPSDllPlugin;
PSScript: TPSScript;
Splitter1: TSplitter;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Compile1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure IFPS3ClassesPlugin1CompImport(Sender: TObject;
x: TPSPascalCompiler);
procedure IFPS3ClassesPlugin1ExecImport(Sender: TObject
Exec: TPSExec;
x: TPSRuntimeClassImporter);
procedure PSScriptCompile(Sender: TPSScript);
procedure PSScriptExecute(Sender: TPSScript);
private
FDouValue: Double;
FIntValue: Integer;
FOp: TInterOp;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses
uPSUtils,

uPSR_std,
uPSC_std,
uPSR_stdctrls,
uPSC_stdctrls,
uPSR_forms,
uPSC_forms,
uPSC_graphics,
uPSC_controls,
uPSC_classes,
uPSR_graphics,
uPSR_controls,
uPSR_classes,

uPSI_Registry, Registry,
uPSI_IniFiles;

{$R *.DFM}

function ImportTest(S1: string
s2: Longint
s3: Byte
s4: word
var s5: string): string;
begin
Result := s1 + ' ' + IntToStr(s2) + ' ' + IntToStr(s3) + ' ' + IntToStr(s4) + ' - OK!';
S5 := s5 + ' '+ result + ' - OK2!';
end;

procedure MyWriteln(const s: string);
begin
Form1.Memo2.Lines.Add(s);
end;

function MyReadln(const question: string): string;
begin
Result := InputBox(question, '', '');
end;

{ TForm1 }

////////////////////////////////////////////////////////////////////////////////
//设计: Linc 2005.01.05
//功能: 为编译期额外定义 Registry 类,定义 MessageBox 函数
//参数:
////////////////////////////////////////////////////////////////////////////////
procedure TForm1.IFPS3ClassesPlugin1CompImport(Sender: TObject;
x: TIFPSPascalcompiler);
begin
SIRegister_Std(x);
SIRegister_Classes(x, true);
SIRegister_Graphics(x, true);
SIRegister_Controls(x);
SIRegister_stdctrls(x);
SIRegister_Forms(x);

with x do
begin
AddDelphiFunction('Procedure ShowMessage( const Msg : string)');
AddDelphiFunction('Procedure ShowMessagePos( const Msg : string
X, Y : Integer)');
AddDelphiFunction('Function InputBox( const ACaption, APrompt, ADefault : string) : string');
AddDelphiFunction('Function InputQuery( const ACaption, APrompt : string
var Value : string) : Boolean');
AddDelphiFunction('Function PromptForFileName( var AFileName : string
const AFilter : string
const ADefaultExt : string
const ATitle : string
const AInitialDir : string
SaveDialog : Boolean) : Boolean');
end;
SIRegister_Registry(x);
SIRegister_IniFiles(x);

SIRegisterInterOp(x);
end;

////////////////////////////////////////////////////////////////////////////////
//设计: Linc 2005.01.05
//功能: 为运行期映射 Registry 类,MessageBox 函数
//参数:
////////////////////////////////////////////////////////////////////////////////
procedure TForm1.IFPS3ClassesPlugin1ExecImport(Sender: TObject
Exec: TIFPSExec;
x: TIFPSRuntimeClassImporter);
begin
RIRegister_Std(x);
RIRegister_Classes(x, True);
RIRegister_Graphics(x, True);
RIRegister_Controls(x);
RIRegister_stdctrls(x);
RIRegister_Forms(x);

with Exec do
begin
RegisterDelphiFunction(@ShowMessage, 'ShowMessage', cdRegister);
RegisterDelphiFunction(@ShowMessagePos, 'ShowMessagePos', cdRegister);
RegisterDelphiFunction(@InputBox, 'InputBox', cdRegister);
RegisterDelphiFunction(@InputQuery, 'InputQuery', cdRegister);
RegisterDelphiFunction(@PromptForFileName, 'PromptForFileName', cdRegister);
end;
RIRegister_Registry(x);
RIRegister_IniFiles(x);

RIRegisterInterOp(x);
end;

////////////////////////////////////////////////////////////////////////////////
//设计: Linc 2005.01.05
//功能: 定义变量、函数
//参数:
////////////////////////////////////////////////////////////////////////////////
procedure TForm1.PSScriptCompile(Sender: TPSScript);
begin
Sender.AddFunction(@MyWriteln, 'procedure Writeln(s: string);');
Sender.AddFunction(@MyReadln, 'function Readln(question: string): string;');
Sender.AddFunction(@ImportTest, 'function ImportTest(S1: string
s2: Longint
s3: Byte
s4: word
var s5: string): string;');
Sender.AddRegisteredVariable('Application', 'TApplication');
Sender.AddRegisteredVariable('Self', 'TForm');
Sender.AddRegisteredVariable('Memo1', 'TMemo');
Sender.AddRegisteredVariable('Memo2', 'TMemo');

Sender.AddRegisteredVariable('Op', 'TInterOp');
Sender.AddRegisteredVariable('IntValue', 'Integer');
Sender.AddRegisteredPTRVariable('DouValue', 'Double');
end;

////////////////////////////////////////////////////////////////////////////////
//设计: Linc 2005.01.05
//功能: 设置使用的变量
//参数:
////////////////////////////////////////////////////////////////////////////////
procedure TForm1.PSScriptExecute(Sender: TPSScript);
begin
PSScript.SetVarToInstance('APPLICATION', Application);
PSScript.SetVarToInstance('SELF', Self);
PSScript.SetVarToInstance('MEMO1', Memo1);
PSScript.SetVarToInstance('MEMO2', Memo2);

PSScript.SetVarToInstance('Op', FOp);

VSetInt(PSScript.GetVariable('IntValue'), 1234567);
PSScript.SetPointerToData('DouValue', @FDouValue, PSScript.FindBaseType(btDouble));
end;

procedure TForm1.Compile1Click(Sender: TObject);
procedure OutputMessages;
var
l: Longint;
b: Boolean;
begin
b := False;

for l := 0 to PSScript.CompilerMessageCount - 1 do
begin
Memo2.Lines.Add('Compiler: '+ PSScript.CompilerErrorToStr(l));
if (not b) and (PSScript.CompilerMessages[l] is TIFPSPascalCompilerError) then
begin
b := True;
Memo1.SelStart := PSScript.CompilerMessages[l].Pos;
end;
end;
end;
begin
Memo2.Lines.Clear;
PSScript.Script.Assign(Memo1.Lines);
Memo2.Lines.Add('Compiling');
if PSScript.Compile then
begin
OutputMessages;
Memo2.Lines.Add('Compiled succesfully');
if not PSScript.Execute then
begin
Memo1.SelStart := PSScript.ExecErrorPosition;
Memo2.Lines.Add(PSScript.ExecErrorToString +' at '+Inttostr(PSScript.ExecErrorProcNo)+'.'+Inttostr(PSScript.ExecErrorByteCodePosition));
end else Memo2.Lines.Add('Succesfully executed');
end else
begin
OutputMessages;
Memo2.Lines.Add('Compiling failed');
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FDouValue := 3.141592653589793;
FIntValue := 123456;
FOp := TInterOp.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FOp);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('/Software/Microsoft/Windows/CurrentVersion/Run', False) then
begin
GetValueNames(Memo2.Lines);
ShowMessage(Memo2.Lines.Text);
CloseKey;
end;
finally
Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage('double value (douvalue): ' + FloatToStr(FDouValue));
ShowMessage('integer value (intvalue): ' + IntToStr(FIntValue));
end;

end.
 
给我一个,swgzj@sina.com
 
LSUPER,谢谢你!我要研究研究!
 
给我也来一个,谢谢
dawnsong@sohu.com
 
还有没有更好的东西?
还有谁用过以上的工具?一起讨论讨论呀!
 
LSUPER,谢谢你先,我也要完整的
scottrayn2001@yahoo.com.cn
[:)]
 
后退
顶部