如何在程序中执行动态生成的Delphi代码

经常发现有人提这类问题,或者提问内容最后归结成这种问题

前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧。

这里提供三种方法,都是借助第三方的组件来实现的。

1、MicroSoft Windows Script Control(http://www.microsoft.com/downloads/details.aspx?FamilyID=d7e31492-2595-49e6-8c02-1426fec693ac&DisplayLang=en)
这是微软的东西,OCX的,我对OCX的东西一向没什么好感,:)但总算是解决问题的一个方法。
到以上地址下载回来sct10en.exe,这是个安装程序,安装完成以后,在安装目录里有一个msscript.ocx,就是它了。
在Delphi中Import OCX...导入安装,在窗体上添加一个TScriptControl类的实例。
设置好它的Scriptanguage属性:VBScript,JScript...IE认识的它都认识,没有Object Pascal?不要急,好戏总是放在后头嘛...
以VbScript为例:
运行脚本:ScriptControl1.ExecuteStatement('msgbox("Runing....")');
计算公式:ShowMessage(scriptcontrol1.Eval('1+1'));

优点:皇家的东西,相信它,没错的
缺点:发布程序带个OCX,只能支持微软的Script

2、Dream Collection中的DCScripter(ftp://202.117.210.28/file/dream4.rar)
安装好以后在控件面板DreamCompany里面有一个向右的黑色箭头,就是它了。
以VbScript为例:
运行脚本:DCScripter1.Script.Add('msgbox("Script Runing...")');
DCScripter1.Run;
计算公式:ShowMessage(DCScripter1.Evaluate('1+1'));

优点:VCL的,除支持微软的脚本以外,还支持Perl,Python
缺点:还是不支持Object Pascal...(别打,就来了...)

3、DelphiWebScriptII(http://prdownloads.sourceforge.net/dws/dws2src11.zip)
这个东西好啊,功能超强,太强了,太强了,真强...
安装完成以后,将TDelphiWebScriptII,Tdws2GUIFunctions加入窗体,引用dws2Exprs单元。
运行脚本:
var
prg: TProgram;
begin
prg := DelphiWebScriptII1.Compile('ShowMessage(''hi'');');
prg.Execute;
end;
这个东西是用稍微复杂一点,不过看看Demo吧,接下来的造化就看你自己的了。

优点:VCL的,功能超强,支持Object Pascal...
缺点:只支持Object Pascal...

以上三个各有忧缺点,大家可能比较欣赏DelphiWebScript的功能,但是我觉得如果是给用户使用的话,还是Dream Scripter比较好,毕竟VbScript等比较容易为用户所接受。其实现在很多网管等都很习惯于利用系统提供的COM对象,使用纯脚本进行编程。很方便的。

如何在程序中执行动态生成的Delphi代码的更多相关文章

  1. Delphi 如何在程序中执行动态生成的Delphi代码

    如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...

  2. winform WebBrowser控件中,cs后台代码执行动态生成的js

    很多文章都是好介绍C# 后台cs和js如何交互,cs调用js方法(js方法必须是页面上存在的,已经定义好的),js调用cs方法, 但如果想用cs里面执行动态生成的js代码,如何实现呢? 思路大致是这样 ...

  3. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  4. 在Web应用程序中执行计划任务(多线程)

    在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQ ...

  5. jQuery EasyUI中DataGird动态生成列的方法

    EasyUI中使用DataGird显示数据列表中,有时需要根据需要显示不同的列,例如,在权限管理中,不同的用户登录后只能查看自己权限范围内的列表字段,这就需要DataGird动态组合列,下面介绍Eas ...

  6. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

  7. Java | 在 Java 中执行动态表达式语句: 前中后缀、Ognl、SpEL、Groovy、Jexl3

    在一些规则集或者工作流项目中,经常会遇到动态解析表达式并执行得出结果的功能. 规则引擎是一种嵌入在应用程序中的组件,它可以将业务规则从业务代码中剥离出来,使用预先定义好的语义规范来实现这些剥离出来的业 ...

  8. 区分execl与system——应用程序中执行命令

    execl:相关函数:fork, execle, execlp, execv, execve, execvp表头文件:#include <unistd.h>函数定义:int execl(c ...

  9. 为TextView设置两种状态,程序中可以动态切换

    经常会需要用文字的两种状态来表示当前系统的某两种状态.比如:         这里的第一个TextView和后两个TextView就表示了两种状态.我们可以在程序的动态的切换状态(而不是直接修改颜色) ...

随机推荐

  1. signer information does not match signer information of other classes in the same package

    报错日志: java.lang.SecurityException: class "org.bouncycastle.asn1.ASN1ObjectIdentifier"'s si ...

  2. GIT安装包备用地址

    如果官网下载被禁止,可在下面这个地址下载,速度飞快 http://www.wmzhe.com/soft-38801.html#download

  3. 【项目管理和构建】——Maven简介(一)

    在现实的企业中,以低成本.高效率.高质量的完成项目,不仅仅需要技术大牛,企业更加需要管理大牛,管理者只懂技术是远远不够的.当然,管理可以说有很多的方面,例如:对人员的管理,也有对项目的管理等等.如果你 ...

  4. Red Hat 6网络配置笔记

    1.重启网卡/etc/init.d/network restart server network restart2.运行结果报错 关闭NetworkManagerservice NetworkMana ...

  5. 2019.7.26 NOIP 模拟赛

    这次模拟赛真的,,卡常赛. The solution of T1: std是打表,,考场上sb想自己改进匈牙利然后wei了(好像匈牙利是错的. 大力剪枝搜索.代码不放了. 这是什么神仙D1T1,爆蛋T ...

  6. python学习笔记:try与except处理异常语句

    写代码的时候会遇到各种各样的异常,那么代码就不会继续往下走了.比如说10除以0是错误的,因为除数不能为零学会捕捉异常,在异常出现的时候我们要做什么操作. 本文中只做简单使用的讲解,详细使用方法可以参考 ...

  7. 洛谷 P1111 修复公路——并查集

    先上一波链接qwq https://www.luogu.org/problem/P1111 这题就是裸的并查集咯qwq 维护一下连通块的数目 数目变为一的时候整个图就连通了 输出此时的答案就okay拉 ...

  8. java中Comparator比较器顺序问题,源码分析

    提示: 分析过程是个人的一些理解,如有不对的地方,还请大家见谅,指出错误,共同学习. 源码分析过程中由于我写的注释比较啰嗦.比较多,导致文中源代码不清晰,还请一遍参照源代码,一遍参照本文进行阅读. 原 ...

  9. go 学习之字符串

    字符串 字符串是不可变值类型,内部⽤用指针指向 UTF-8 字节数组.默认值是空字符串 "".用索引号访问某字节,如 s[i], i不能是负数.不能⽤用序号获取字节元素指针,&am ...

  10. redis 入门之集合

    sadd 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略.假如 key 不存在,则创建一个只包含 member 元素作成员的集合.当 key 不 ...