看流星社区

 找回密码
 注册账号
查看: 2898|回复: 5

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

[复制链接]

该用户从未签到

发表于 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。。

该用户从未签到

发表于 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

该用户从未签到

发表于 2011-4-3 14:54:25 | 显示全部楼层
我觉得字符串判断很实在, 查找文本中的x,y 循环录入就可以咯

该用户从未签到

发表于 2011-4-3 14:54:46 | 显示全部楼层
找本文+1
任务脚本什么的,都有变通的方式
重点是简单易懂,辅助客户也好上手

该用户从未签到

发表于 2011-4-3 14:55:02 | 显示全部楼层
看了你的另外个帖子.我的建议是 自己写个脚本解释器比较简单.也比较好用.

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

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

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


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


走路[100,200,30]


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

该用户从未签到

发表于 2011-4-3 14:55:30 | 显示全部楼层
首先定义个结构 用来保存脚本的命令和参数.

type
  Tscript=packed record
  act:string;  //命令
  s:array [1..9] 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,'[','/',[rfreplaceall]);  //替换掉符号
s:=StringReplace(s,']','/',[rfreplaceall]);   
  s:=StringReplace(s,',','/',[rfreplaceall]);
  s:=StringReplace(s,'走路','gogo',[rfreplaceall]);  //替换掉命令 因为GOGO比走路好打些

//这时候脚本就成了  gogo/100/200/30/
st:=form1.ss(trim(tmps)); //用SS函数把脚本分割开 注意去除空格
if st.count>0 then
begin
if st[0]<>'' then
begin
result.act:=st[0];  //返回命令
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[lst1.itemindex];  //从LISTBOX获取脚本
a:=form1.superscript(s);   //分拆参数


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


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

ACT取出命令 S1-9保存参数.根据脚本的不同转换不同的类型调用.自己的脚本解释器就写出来了.
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-20 12:11

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表