文档章节

执行数学公式的函数 - 回复 "heyongan" 的问题

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 652
阅读 8
收藏 0
点赞 0
评论 0
问题来源: http://www.cnblogs.com/del/archive/2008/08/16/1268786.html#1289015

本例在 Delphi 2007 和 Delphi 2009 中均调试通过, 运行效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ComObj;

//执行数学公式的函数 RunForm:
//原理是借用 JavaScrip 脚本, 代码参考的是 Delphi 的 Format 函数;
//第一个参数是公式, 公式中的常量要用 A B C D E F G H I J 十个大写字母依次标识;
//第二个参数是参数组, 按顺序给出常量值(使用字符串的方式);
//目前支持的函数在下面列着呢, 不过在这里为了和后面的参数区别只能都弄成小写.
function RunForm(Formula: string; const Args: array of const): string;
const
  f = 'acos    = Math.acos;' +
      'asin    = Math.asin;' +
      'atan    = Math.atan;' +
      'atan2   = Math.atan2;' +
      'ceil    = Math.ceil;' +
      'cos     = Math.cos;' +
      'e       = Math.E;' +
      'exp     = Math.exp;' +
      'floor   = Math.floor;' +
      'ln10    = Math.LN10;' +
      'ln2     = Math.LN2;' +
      'log     = Math.log;' +
      'log10e  = Math.LOG10E;' +
      'log2e   = Math.LOG2E;' +
      'max     = Math.max;' +
      'min     = Math.min;' +
      'pi      = Math.PI;' +
      'pow     = Math.pow;' +
      'random  = Math.random;' +
      'round   = Math.round;' +
      'sin     = Math.sin;' +
      'sqrt    = Math.sqrt;' +
      'sqrt2   = Math.SQRT2;' +
      'tan     = Math.tan;';
var
  Len, BufLen: Integer;
  Buffer: array[0..4095] of Char;
  script: OleVariant;
  i: Integer;
begin
  for i := 0 to 9 do
    Formula := StringReplace(Formula, Char(i+65), '%' + IntToStr(i) + ':s', [rfReplaceAll]);

  BufLen := Length(Buffer);
  if Length(Formula) < (Length(Buffer) - (Length(Buffer) div 4)) then
    Len := FormatBuf(Buffer, Length(Buffer) - 1, Pointer(Formula)^, Length(Formula), Args)
  else
  begin
    BufLen := Length(Formula);
    Len := BufLen;
  end;
  if Len >= BufLen - 1 then
  begin
    while Len >= BufLen - 1 do
    begin
      Inc(BufLen, BufLen);
      Result := '';
      SetLength(Result, BufLen);
{$IFDEF UNICODE}
      Len := FormatBuf(PChar(Result), BufLen - 1, Pointer(Formula)^, Length(Formula), Args);
{$ELSE}
      Len := FormatBuf(Pointer(Result)^, BufLen - 1, Pointer(Formula)^, Length(Formula), Args);
{$ENDIF}
    end;
    SetLength(Result, Len);
  end
  else
    SetString(Result, Buffer, Len);

  try
    script := CreateOleObject('ScriptControl');
    script.Language := 'JavaScript';
    script.ExecuteStatement(f + 'str = ' + Result);
    Result := script.Eval('str');
  except
    Result := 'Err';
  end;
end; {RunForm 函数结束}


//测试一: 注意第二个参数要以字符串数组的方式给出
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s := RunForm('(A + B) / (A - B)', ['6','4']); {这里 A = 6; B = 4}
//  s := RunForm('(6 + 4) / (6 - 4)', []);        {这样也可以}
  ShowMessage(s); {5}
end;

//测试二: 使用的命令有大小写的区别
procedure TForm1.Button2Click(Sender: TObject);
var
  s: string;
begin
  s := RunForm('sin(A) + cos(B) + tan(A)', ['0.8','0.9']);
  ShowMessage(s); {2.36860461622055}
end;

//测试三, 可以使用 JavaScript 的常量, 不过要用小写字母
procedure TForm1.Button3Click(Sender: TObject);
var
  s: string;
begin
  s := RunForm('sqrt(pow(A, 2))', ['pi']);
  ShowMessage(s); {3.14159265358979}
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 130
  ClientWidth = 206
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 64
    Top = 24
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 64
    Top = 55
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 64
    Top = 86
    Width = 75
    Height = 25
    Caption = 'Button3'
    TabOrder = 2
    OnClick = Button3Click
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/08/16/1269478.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
函数式编程基础思想

说明 网上有很多深入语言层次讲解函数式编程的应用,很多人无法理解,能用但是一头雾水,死记硬背,原因究其是核心思想不清楚。 我说的语言层次上的,例如 Spark MapReduce lambda Groovy Rx...

热血沸腾 ⋅ 2017/12/20 ⋅ 0

如何用MathType编辑反三角函数

在使用文档写数学类的文章时候,常常会涉及到一些数学公式,由于数学公式中包含了很多的数学符号,如果使用文档自带的公式编辑器往往会发现很多的符号都不全或者不符合自己的要求。这个时候就...

学术研究软件 ⋅ 2016/06/29 ⋅ 0

Ng-ML|第七周SVM

第七周 SVM 视频内容摘要 Large Margin Classification Optimization Objective 优化目标的提出:从LR开始 从LR到SVM 优化目标的变化:Cost function, C Large Margin Intuition 最小化Cost ...

darlingwood2013 ⋅ 2017/08/22 ⋅ 0

Redis脚本 --lua

Redis脚本 使用脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的...

磨砂轮 ⋅ 2015/05/27 ⋅ 0

Python基础

最近开始在自学Python,所以在学习的时候也一边总结一些知识点 Python的输出 Python的输出和C语言类似,在函数里加上字符串(用单引号或者双引号,但是不能混用),例如: 函数也可以接受多个...

SkyHive ⋅ 2017/04/06 ⋅ 0

在线富文本编辑器--UMeditor

UMeditor,简称UM,是为满足广大门户网站对于简单发帖框,或者回复框需求所定制的在线富文本编辑器。 UM的主要特点就是容量和加载速度上的改变,全版本的代码量为125k,而且放弃了使用传统的...

战毅 ⋅ 2014/03/19 ⋅ 2

UMeditor 1.2.2 发布,在线富文本编辑器

# UMeditor Change List ## 1.2.2 ### 功能更新 1. 添加插入数学公式 2. 支持插入动态地图 3. 支持复制图片、截屏图片的粘贴 4. 添加自动保存插件,支持草稿箱功能 5. 支持拖放图片上传并插入...

战毅 ⋅ 2014/03/19 ⋅ 5

转帖关于new/delete的运算符和malloc()/free()的标准库函数

new--------delete malloc--------free 问题: 我又一个对象类,里面有一个指针链表,动态分配空间,在析构的时候释放。开始对对象进行new操作,但是执行delete对象操作的时候出错,提示在析...

lixun ⋅ 2012/08/29 ⋅ 0

数据库设计三大范式应用实例剖析

转贴地址:http://blog.csdn.net/songkexin/archive/2007/01/18/1486289.aspx 先说几句: 首先作者的劳动果实,让我对这个比较模糊到现在对范式有了一个比较清晰的认识。不过,结合我自己的实...

ChowJames ⋅ 2012/09/02 ⋅ 0

Excel在统计分析中的应用—第二章—描述性统计-分组数据的算术平均值、方差及标准差求解方法

看到网上有网友求助分组数据的标准差求解方法,但是得到的回答却很不具体,缺乏可操作性。 本文将理论(计算公式)及实际(实例)相结合,来解答这个入门级的问题。 对于非分组数据,可用Exc...

hpdlzu80100 ⋅ 01/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 32分钟前 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 44分钟前 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 51分钟前 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 58分钟前 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部