function CalculateExpression(const AExpr: string): Extended; varScript: Variant;Expr: string; begin// 移除空格Expr := StringReplace(AExpr, ' ', '', [rfReplaceAll]);//把++替换为*Expr:=StringReplace(Expr,'++','*',[rfreplaceall]);//把--改为/Expr:=StringReplace(Expr,'--','/',[rfreplaceall]);// 使用 Windows Script Control 计算Script := CreateOleObject('MSScriptControl.ScriptControl');Script.Language := 'VBScript';Result := Script.Eval(Expr); end;
uses
comobj,SysUtils;
说明,因为数量列不允许输入 * /,所以这里设计时,用++来代替*,用--来代替/
使用方法:
1.设置数量列Properties:=TextEdit

2.设置数量列的Properties.onvalidate事件

procedure TfraModuleCPRK.C数量PropertiesValidate(Sender: TObject; var DisplayValue:TcxEditValue; var ErrorText: TCaption; var Error: Boolean); varInputStr: string; // 存储用户输入的字符串CalcResult: Extended; // 存储表达式计算结果(扩展精度浮点数) begin// 检查输入值是否为 Null 或空值// VarIsNull: 检查是否为数据库 NULL 值// VarIsEmpty: 检查是否为未初始化的 Variant 变量if VarIsNull(DisplayValue) or VarIsEmpty(DisplayValue) thenExit; // 如果是空值,直接退出,不进行验证// 将 Variant 类型转换为字符串InputStr := VarToStr(DisplayValue);// 检查转换后的字符串是否为空if InputStr = '' thenExit; // 空字符串不做处理,直接退出// 检查字符串中是否包含数学运算符(+、-、*、/)// Pos 函数返回子串在父串中的位置,如果大于 0 表示找到了运算符if (Pos('+', InputStr) > 0) or (Pos('-', InputStr) > 0) or(Pos('*', InputStr) > 0) or (Pos('/', InputStr) > 0) thenbegintry// 尝试计算表达式// 调用数据模块中的 CalculateExpression 方法计算数学表达式// 例如:输入 "2+3*4" 会返回 14CalcResult := dm.CalculateExpression(InputStr);// 检查数据集状态,如果不是编辑或插入状态,则切换到编辑状态// 这样确保可以修改字段值if not (FDMemTable1.State in [dsEdit, dsInsert]) thenFDMemTable1.Edit; // 进入编辑模式// 将计算结果赋值给 '数量' 字段// AsFloat 将计算结果作为浮点数存储FDMemTable1.FieldByName('数量').AsFloat := CalcResult;// 将显示值更新为计算结果DisplayValue := CalcResult;// 验证通过,无错误Error := False;excepton E: Exception do // 捕获所有异常类型begin// 计算失败时,设置错误提示信息// E.Message 包含具体的异常信息(如除数为零、语法错误等)ErrorText := '计算错误:' + E.Message;// 将验证状态设置为错误,阻止用户离开当前控件Error := True;end;end;end; end;
效果如图所示:

