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;

 

 

image

如上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;

 

posted @ 2026-04-29 04:15  一曲轻扬  阅读(21)  评论(0)    收藏  举报