yemao4587 发表于 2011-4-3 14:52:47

希望来个高手指点一下脚本的编译过程

我想在我的软件中实现脚本功能。但对delphi编程不是非常精通。。
如:memo中字符串为:(goto(111,222);
然后调拥走路
call (goto(111,222);
因为我程序中的走路CALL就是goto(x,y);
因为执行了memo中的goto(111,222) 是一个字符串的类型。没办法直接调用这个CALL。。
想找朋友们帮帮忙。。应该如何编译这个过程并能识别这个CALL。。

pinkx 发表于 2011-4-3 14:53:05

你自己都说了是字符串类型,转换一下整数或者浮点不就OK了么
StrToInt

没搞过脚本,据说Delphi也有Lua组件,不过笨方法就是对字符串判断 也可以实现的

if pos('goto',s)>0 then
....
if pos('hanhua',s)>0 then
.....
if pos('xxx',s)>0 then

clarexxg 发表于 2011-4-3 14:54:25

我觉得字符串判断很实在, 查找文本中的x,y 循环录入就可以咯

wangyt312 发表于 2011-4-3 14:54:46

找本文+1
任务脚本什么的,都有变通的方式
重点是简单易懂,辅助客户也好上手

cywsh 发表于 2011-4-3 14:55:02

看了你的另外个帖子.我的建议是 自己写个脚本解释器比较简单.也比较好用.

大规模可能控件更省事.但是一个WG能有多少功能啊.加起来最多30个函数搞定.

先写简单的功能实现.再慢慢添加.摸索学习吧.这个的好处是简单省事.坏处是好多东西都得写死.脚本里进行判断是最别扭的一件事.

最简单的脚本就是这个样子的.


function gogo(x,y,z:single):bool;stdcall;
begin
xxx
end;


走路


先用字符串分割把命令分出来.再把分割的参数转换类型传进去.

feiyang025 发表于 2011-4-3 14:55:30

首先定义个结构 用来保存脚本的命令和参数.

type
Tscript=packed record
act:string;//命令
s:array of ShortString;//参数 最多9个
end;

写个函数用来分割脚本.并且返回这个结构

Function SuperScript(tmps:string):Tscript;
var i,ii:Integer;
d:DWORD;
s,ss:string;
st,sst:TStringList;
begin
for i:=1 to 9 do//初始化返回值
begin
    result.s:='';
    end;
result.act:='';
s:=StringReplace(s,'[','/',);//替换掉符号
s:=StringReplace(s,']','/',);   
s:=StringReplace(s,',','/',);
s:=StringReplace(s,'走路','gogo',);//替换掉命令 因为GOGO比走路好打些

//这时候脚本就成了gogo/100/200/30/
st:=form1.ss(trim(tmps)); //用SS函数把脚本分割开 注意去除空格
if st.count>0 then
begin
if st<>'' then
begin
result.act:=st;//返回命令
for i:=1 to st.count-1 do
begin
result.s:=st.strings; //返回参数
end;
end;
end;
st.free;//注意释放ST
end;

function Tform1.ss(const source:ShortString):TStringList; //直接返回字串列表
var
temp:shortstring;
i:integer;
begin
result:=tstringlist.Create;
temp:=source;
Result.Delimiter:='/';
result.DelimitedText:=temp;
end;


然后就是调用了.假设你用了个LISTBOX来显示脚本.当点击开始后.脚本从上到下执行.设置LISTBOX的ITEMINDEX就行了.

var a:tscript;
s:string;
x,y,z:single;

s:=lst1.items.strings;//从LISTBOX获取脚本
a:=form1.superscript(s);   //分拆参数


with a do
begin
if act=''gogo' then//取命令
begin
if trystrtofloat(s,x) and trystrtofloat(s,y) and trystrtofloat(s,z) then//参数转换
form1.gogo(x,y,z);   //走路实现.至于如何判定到达目的地.自己追加.
end;
end;


我的是这样写的.至于脚本的判断和脚本的暂停和继续.你可以参考下堆栈的处理方式.不再多说.

ACT取出命令 S1-9保存参数.根据脚本的不同转换不同的类型调用.自己的脚本解释器就写出来了.
页: [1]
查看完整版本: 希望来个高手指点一下脚本的编译过程