问题感觉不容易搞定,高手们进来看看。

flashwolf 2001-09-29 09:53:01
procedure TForm1.Button1Click(Sender: TObject);
var a,b :integer;
var s:string;
begin
a:=1;
b:=2;
s:='a<b';
if a<b then
begin
showmessage('ok');
end;
end;
end.

if 后面是条件,我想用S来替换。(即把'a<b'改为我最先设定的条件字符串s)怎么做???
...全文
1581 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eagle_118 2001-10-15
  • 打赏
  • 举报
回复
自己进行运算式分解吧!
这好象才能满足你的要求!
荒原独歌 2001-10-14
  • 打赏
  • 举报
回复
var a,b :integer;
var s:boolean;
begin
a:=1;
b:=2;
s:=a<b;
if s then
begin
showmessage('ok');
end;
end;
end.
xiaoxiaoli 2001-10-14
  • 打赏
  • 举报
回复
高,使用SQL语句来解决。
以前我在做这个的时候,苦于没有办法。
只好把条件规定的很规范,再使用CASE语句来做的(也就是做简单的字符串分析)。

另外,我也想知道脚本语言怎么建立,也就是在配置文件中写出一段自己的代码。
再在编译器中确定执行!
boby_v 2001-10-13
  • 打赏
  • 举报
回复
按编译原理的思路,自己写个函数来解析字符串,并求值,这里调用函数。
stockwalker 2001-10-13
  • 打赏
  • 举报
回复
嘿嘿, 看来我是对牛弹琴. 走也.
Only_I 2001-10-13
  • 打赏
  • 举报
回复
.
haodaniu 2001-10-13
  • 打赏
  • 举报
回复
我看你把"<"">""="等符号用droplist来存储,然后用分支语句来判断,在把edit1
中的"a"转换成实际数据类型,edit2中的"b"转换成实际类型,这样不就行了
Almzg_0 2001-10-12
  • 打赏
  • 举报
回复
同意 callous(Dialog) 的方法。
将字符串解释成SQL语句,让QUERY去判断是否。
stockwalker 2001-10-12
  • 打赏
  • 举报
回复
**************************
完美解决方案
**************************
能实现的,这是一个设计模式的问题, 用OOP的方法来做, 充分利用类的多态特性.
因为条件判断是可变化的, 所以不能写死在程序里, 要单独抽出来做一个虚类:
type TMycond = class(TObject)
public
function IsTrue: Boolean;virtual;abstract;
end;
这里 IsTrue是一个纯虚方法, 需要子类来实现.
定义一个变量:
father: TMycond;
好了,这时你的主程序流程里可以这样写了:
if father.IsTrue then
begin
...
end;
有没有看明白啊, 你可以用多个TMycond的子类来实现那个IsTrue函数了,每个子类的IsTrue函数里可以是a>b, 也可以是b>a,随便啦. 你的主程序是不用动了,只要根据不同的情况创建不同的子类并把实例变量赋值给father就行了.
luckytz 2001-10-09
  • 打赏
  • 举报
回复
不好意思这个SQL语句select 1 As Expr1 where '+Trim(Edit1.Text))是什么意思?
flashwolf 2001-10-09
  • 打赏
  • 举报
回复
sorry,sorry,今天才打开电脑,看到一堆高手回复了这个问题,感觉callous(Dialog)哥们的方法不错,但是没试出来?

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select 1 As Expr1 where '+Trim(Edit1.Text));
ADOQuery1.Prepared := true;
ADOQuery1.Open;
if(not ADOQuery1.IsEmpty) then
showmessage('TRUE')
else
showmessage('FALSE');
里面还要连数据库吗?
Except 2001-10-08
  • 打赏
  • 举报
回复
呵呵,你可以把计算算术表达式的方法(数据结构书里一般都有,在堆栈部分)般到这里来用,因为你这个是逻辑表达式,算术符号有点区别就是了,把+、-、*和/换成 AND、OR、NOT、<、>、<=、>=、=或者其他你定义的方法就可以了,写一个函数进去然后分析你的字符串表达式,注意你的变量的使用。

其实我比较赞成bluntknife(钝刀)的方法,如果可行的话就节省了不少时间,但是对用户给定表达式的方法一定要限制,不然除错处理也是要分析表达式的。
Cixy 2001-10-08
  • 打赏
  • 举报
回复
我想作者的意思是把s里的字符串作为语句执行,就像javascript里的setInterval


setInterval("location='www.sohu.com';",15000)

表示

在十五秒后执行location='www.sohu.com'这条js语句

只是。。。。pascal里怎么做呢?
粗线条Jackie 2001-10-07
  • 打赏
  • 举报
回复
不喜欢将简单的问题复杂化, 感兴趣用做个返回Boolean的函数.
niwalker 2001-10-07
  • 打赏
  • 举报
回复
你以为编译程序是什么?它目前还没有达到识别自然语言的功能,也就是说if后面的东西通过编译都会变成机器码。要是先你动态的判断过程,你不能走捷径。你可以做一个返回boolean的函数,通过处理你的字符串参数作相应的返回。如果简单的true和false不能满足你的要求,你可以把函数的返回值设成integer,然后在调用程序中不使用if语句改用switch语句,这种方法可能更为灵活。
bluntknife 2001-10-07
  • 打赏
  • 举报
回复
可以用脚本来解决这个问题
把S定义为布尔型,然后用脚本控件对表达式字符串s1进行运算,将结果赋值给S即可
注意,如果不能使用请安装脚本控件,在微软的网站上有下载
var
scTest:Variant;
s1:string; //要判断的表达式
s:Boolean;
begin
scTest := CreateOleObject('ScriptControl');
scTest.Language := 'VBScript';
scTest.SitehWnd := self.Handle;
scTest.Timeout:= -1;
s := scTest.Eval(s1);
if s then
showmessage('真')
else
showmessage('假');
end;
xswj77 2001-10-06
  • 打赏
  • 举报
回复
对呀,这实际是一个编译方法的问题。
DIABL0 2001-10-06
  • 打赏
  • 举报
回复
当然只有用编译的方法,或是调用其他编译器。例如SQL
bewill 2001-10-06
  • 打赏
  • 举报
回复
同意johnwesley(界限),其实也谈不上编译等等,如果你做过计算器程序的话,你一定可以
搞定。一般介绍算法的书上都会有例子的。
yxjjx 2001-10-06
  • 打赏
  • 举报
回复
怎么啦?这个问题不是解决了吗?
加载更多回复(41)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧