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


浙公网安备 33010602011771号