delphi 慎用split
前期的实现原理,看这里:
delphi cxgrid + PopupMenu 创建智能过虑功能的菜单 - 一曲轻扬 - 博客园 (cnblogs.com)
procedure TfraModuleCPRK.p2Click(Sender: TObject); begin var val := QuotedStr(p3.Caption.Split([' '])[1]); FDQSD.Filter := GridView2.Controller.FocusedColumn.Caption + '=' + val; end; procedure TfraModuleCPRK.p3Click(Sender: TObject); begin var val := QuotedStr(p3.Caption.Split([' '])[1]); FDQSD.Filter := GridView2.Controller.FocusedColumn.Caption + '<>' + val; end;

如上P2/P3事件分别对应菜单中的"等于xxx"和"不等于xxx". 代码中使用了split分割 等于和不等于后面的内容.
但是如果菜单的caption属性中额外多带了空格,比如图中的 "240W 电源",Split分割后返回的值就有问题了.这会导致筛选的效果与预想的效果存在偏差.
解决的方案是用copy来处理,而不是split
procedure TfraModuleCPRK.p2Click(Sender: TObject); begin var fullText := p2.Caption; // 例如: "等于 240W 电源" var spacePos := Pos(' ', fullText); // 找到第一个空格的位置 var val := QuotedStr(Copy(fullText, spacePos + 1, Length(fullText))); // 取空格后的所有内容 FDQSD.Filter := GridView2.Controller.FocusedColumn.Caption + '=' + val; end; procedure TfraModuleCPRK.p3Click(Sender: TObject); begin var fullText := p3.Caption; // 例如: "不等于 240W 电源" var spacePos := Pos(' ', fullText); // 找到第一个空格的位置 var val := QuotedStr(Copy(fullText, spacePos + 1, Length(fullText))); // 取空格后的所有内容 FDQSD.Filter := GridView2.Controller.FocusedColumn.Caption + '<>' + val; end;

浙公网安备 33010602011771号