急!!一个有关计算公式的问题。。。(200分)

  • 主题发起人 主题发起人 fanxin119
  • 开始时间 开始时间
F

fanxin119

Unregistered / Unconfirmed
GUEST, unregistred user!
各位老大,现在有个问题,麻烦大家了:
是这样:现在有个程序,其中需要计算一个序列号,这个序列号是根据前面一个锁号的变量代入特定的计算公式以后算出来的,其中它的计算公式是和一个可选的专业对应的,也就是说一个专业对应一个计算公式,然后把锁号代入这个计算公式就可以算出序列号了,现在的问题是用户希望自己可以随意增加专业和与专业对应的计算公式,然后算出序列号,我该怎么做才能让程序识别用户新增加的计算公式来计算序列号啊?
拜托大家了 比较急,随时联系
 
会有哪些可能的计算公式呢?只是+、-、*、/还是会有其它的复杂运算?
 
例如 int(SQRT(b/24)*1124+SIN(b/24)*2495004) 这个,都是些类似的公式吧,这个里面的b就是需要代入的那个变量,锁号。主要是他的公式会有新添加的,形式不一样了,不知道程序怎么来认它了 呵呵 拜托啊,最好有代码的
 
一个字:难。希望高手能有好办法,帮顶。
 
一个专业有一个对应的序列号计算公式
用户要自定义设置公式,计算序列号.
可以这样理解吗?
 
就是个公式计算啊
 
回复 xiangsni : 是这样的,好像公式可以按照字符串直接取出来,这样好像就可以了,不过还没有试。。。
 
首先有一个字符判断问题,例如SQRTSIN等等,公式越多越复杂,还有就是括号,也就是优先级的问题,也要判断好,个人感觉没有这么容易。看看有没有好的方法。
 
下面的方法是否可行?
function CalcExpr(Expr :string):string;
var 
qury: TADODataSet;      
begin
 qury := TADODataset.Create(nil);
 try
  qury.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;' +
    'Data Source=dBASE Files';
  qury.CommandText := 'Select '+ Expr + ' As Result';
  qury.Open;
  Result := Expr +' = ' + qury.fieldbyname('Result').AsString;
 finally
  qury.Free;
 end;
end;
 
一个普通的公式么,可以使用公式控件或者sql取出来
 
是有一定的难度,主要是添加公式后的优先级,要是能自动识别就好了,
 
还有一个问题, 就是我把计算公式以字符串类型存到数据库里去,然后程序把它读出拉后怎么从字符串类型还原成公式本身啊?
 
你就用 Select 公式 As r,就像我写的那样可以吗?
 
你那个方法我正在试呢 呵呵 能不能问下比方说一个datagrid里的列宽我手动拉宽了,哪个函数能自动得到现在的这个列宽啊?
 
简单:
function TPublicFunc.f_ExpressCalc(exp: string): real;
var
co: Variant;
begin
Co := CreateOleObject('ScriptControl');
co.Language := 'VBScript';
//co.Language := 'JavaScript';
Result := co.Eval(exp);
end;
 
ColumnWidth := DBGrid.Columns[1].Width;
 
int(SQRT(b/24)*1124+SIN(b/24)*2495004):
[方法]
b := 3.2 ;
Strb := floatToStr(b) ;
exp := 'int(SQRT('+Strb +'/24)*1124+SIN('+Strb +'/24)*2495004)';
result := f_ExpressCalc(exp) ;
 
对szhcracker: 你写的这个我知道啊,但是现在表里会有很多列啊 ,每一列的宽度都在变,那么当我重画这个表的时候,每一列的宽度都要取成我随意拉动后的宽度,怎么写啊?呵呵 谢谢拉
对hcm0790:你说的这个方法好像很好啊,呵呵 谢谢了,不过上面那个函数里还要用到脚本嘛?直接那么用的话 delphi里能通过不?
 
对hcm0790:
还有啊 要使用CreateOleObject()这个方法需要引用哪个单元啊?呵呵 现在的公式是从数据库里以string类型取出来的,我该怎么把取出来的公式和变量B结合来完成你的exp := 'int(SQRT('+Strb +'/24)*1124+SIN('+Strb +'/24)*2495004)';这一步啊?因为你这只有一个公式,可以轻松的拆开写,可我从库里取出来的公式都是变化的,怎么组合成你这个exp变量啊?
 
引用ComObj,至于后面的问题,完全是字符串的查找处理,应该不难的
 
后退
顶部