当前位置: 首页 > news >正文

delphi 让数据列拥有简单的计算能力

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

image

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

image

 

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;

 

效果如图所示:

test

 

http://www.jsqmd.com/news/722722/

相关文章:

  • 一人公司的新操作系统:Gumroad 创始人把创业方法论变成了 10 个 Claude Code Skill
  • 汽配店老板亲测:汽车erp进销存软件推荐避坑指南
  • Qwen3.5-9B-AWQ-4bit多场景落地:医疗报告图识别、教学PPT内容解析、证件OCR辅助
  • AI语音转录终极指南:faster-whisper-GUI完整使用教程
  • 异步流内存泄漏与死锁频发?C# 13新增IAsyncEnumerator.DisposeAsync()深度解析,含.NET 8.0.3 Runtime源码级验证
  • 真实结构光栅效应的研究
  • 2026年热浸锌桥架厂家top5实测排行:喷塑防火电缆桥架,四川桥架厂家,弱电桥架,托盘桥架,优选推荐! - 优质品牌商家
  • Claude Code 42 条技巧
  • 011、RAG入门:为什么需要检索增强生成
  • 2026 年起,人形机器人将在东京羽田机场“上岗”,能否胜任仍待观察
  • PHP 8.9 JIT调优黄金窗口期只剩47天!——PHP官方已标记jit.enable为“deprecated in 9.0”,速领迁移过渡方案
  • 基于Haskell与纯文本的smos任务管理器:构建可编程的个人工作流系统
  • C语言里的‘潜规则’:那些没人明说但你必须懂的编码细节
  • 专业钢结构厂房供应商推荐
  • PyTorch 2.8深度学习镜像实战教程:RTX 4090D一键部署大模型推理环境
  • 最适配Claude code的终端:Wave Terminal
  • 2026成都豪车租赁TOP5可靠公司技术维度全评测 - 优质品牌商家
  • HarmonyOS RichEditor组件禁止编辑功能全解析
  • SpringBoot 2.x整合Quartz踩坑记:那个诡异的‘unnamed module’类转换异常,我是这样解决的
  • RK3588双网口+WiFi混合组网实战:从独立IP、网桥到带宽测试(iperf3验证)
  • 告别Dapper和EF Core的纠结?试试用SqlSugarCore在.NET 6/8项目里快速搞定增删改查
  • 车载C#中控实时通信“黑盒”深度拆解:Wireshark抓包+ETW事件追踪+CANoe仿真三重验证(附独家诊断工具链)
  • ARM PMUv3性能监控单元原理与实践指南
  • 告别jstest:手把手教你为Ubuntu 20.04编写一个实时手柄状态监控工具
  • el-input 限制输入数字方法
  • AIDEGen工具详解:从Android 10源码里挖出来的IDE自动化神器,到底省了哪些事?
  • ARM架构PMU性能监控单元详解与实践
  • 在虚拟机 VMware 下装完操作系统后安装 vmTools 工具
  • 马斯克说的“第一性原理“是什么?
  • MyTV-Android:如何打造一款极致流畅的电视直播应用终极指南