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

image

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

image

 

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;

 

效果如图所示:

test

 

posted @ 2026-04-30 03:02  一曲轻扬  阅读(27)  评论(0)    收藏  举报