随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


方法有:
1、Filter、Filtered
2、OnFilterRecord
3、SetRange、ApplyRange 或 SetRangeStart、SetRangeEnd、ApplyRange
(Range 相关还有: CancelRange、EditRangeStart、EditRangeEnd、KeyExclusive、Ranged)

下面三个例子测试前都要: 先在窗体上放置 ClientDataSet1、DataSource1、DBGrid1 并关联.

Filter 测试:

{ 准备测试数据 }
procedure TForm1.FormCreate(Sender: TObject);
begin
  with ClientDataSet1 do begin
    FieldDefs.Add('ID', ftInteger);
    FieldDefs.Add('Name', ftString, 6);
    FieldDefs.Add('Age', ftWord);
    CreateDataSet;
    AppendRecord([1, 'A',    11]);
    AppendRecord([2, 'AB'22]);
    AppendRecord([3, 'ABC'33]);
    AppendRecord([4, 'ABCD', 44]);
    AppendRecord([5, 'a',    55]);
    AppendRecord([6, 'ab'66]);
    AppendRecord([7, 'abc'77]);
    AppendRecord([8, 'abcd', 88]);
    AppendRecord([9, 'abcde']);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Name = ' + QuotedStr('ab');
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Name = ''ab''';
  ClientDataSet1.FilterOptions := [foCaseInsensitive];
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Name = ''a*''';
//  ClientDataSet1.FilterOptions := [foNoPartialCompare]; { 此选项使 * 功能无效 }
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Name Like ''ab%''';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Name Like ''%c%''';
  ClientDataSet1.FilterOptions := [foCaseInsensitive];
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'ID>2 and Age<77';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'not(ID>2 and Age<77)';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'ID<=1 or Age>=88';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'ID<>1 and ID<>3 and ID<>5 and ID<>7';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Age - ID = 20';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button11Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Age + ID > 60';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button12Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Age * 2 = 22';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button13Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Age / 2 = 22';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button14Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Age<55 and Name Like ''AB%''';
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button15Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'Age = Null'; { 其中的 Null 大小写均可 }
  ClientDataSet1.Filtered := True;
end;

procedure TForm1.Button16Click(Sender: TObject);
begin
  ClientDataSet1.Filter := 'ID>6 and Age<>null';
  ClientDataSet1.Filtered := True;
end;


SetRange 等测试:

{ 准备测试数据 }
procedure TForm1.FormCreate(Sender: TObject);
begin
  with ClientDataSet1 do begin
    FieldDefs.Add('ID', ftInteger);
    FieldDefs.Add('Name', ftString, 6);
    FieldDefs.Add('Age', ftWord);
    CreateDataSet;
    AppendRecord([1, 'A',    11]);
    AppendRecord([2, 'AB'22]);
    AppendRecord([3, 'ABC'33]);
    AppendRecord([4, 'ABCD', 44]);
    AppendRecord([5, 'a',    55]);
    AppendRecord([6, 'ab'66]);
    AppendRecord([7, 'abc'77]);
    AppendRecord([8, 'abcd', 88]);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.IndexFieldNames := 'ID';

  ClientDataSet1.SetRangeStart;
  ClientDataSet1.FieldValues['ID'] := 3;
//  ClientDataSet1.KeyExclusive := True; { 排除边界值; 此值默认是 False, 也就是包含指定的边界 }

  ClientDataSet1.SetRangeEnd;
  ClientDataSet1.FieldValues['ID'] := 7;
//  ClientDataSet1.KeyExclusive := True; { 排除边界值 }

  ClientDataSet1.ApplyRange;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet1.IndexFieldNames := 'ID';

  ClientDataSet1.SetRange([2], [5]);
  ClientDataSet1.ApplyRange;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientDataSet1.IndexFieldNames := 'Age; Name';

  ClientDataSet1.SetRange([33, 'ABC'], [66, 'abc']);
  ClientDataSet1.ApplyRange;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  ClientDataSet1.IndexFieldNames := 'Age; Name';

  ClientDataSet1.SetRange([33, 'ABC'], [66, 'abc']);

  ClientDataSet1.EditRangeStart;
  ClientDataSet1.KeyExclusive := True;

  ClientDataSet1.EditRangeEnd;
  ClientDataSet1.KeyExclusive := True;

  ClientDataSet1.ApplyRange;
end;


OnFilterRecord 测试:

{ 准备测试数据 }
procedure TForm1.FormCreate(Sender: TObject);
begin
  with ClientDataSet1 do begin
    FieldDefs.Add('ID', ftInteger);
    FieldDefs.Add('Name', ftString, 6);
    FieldDefs.Add('Age', ftWord);
    CreateDataSet;
    AppendRecord([1, 'A',    11]);
    AppendRecord([2, 'AB'22]);
    AppendRecord([3, 'ABC'33]);
    AppendRecord([4, 'ABCD', 44]);
    AppendRecord([5, 'a',    55]);
    AppendRecord([6, 'ab'66]);
    AppendRecord([7, 'abc'77]);
    AppendRecord([8, 'abcd', 88]);
  end;
  ClientDataSet1.Filtered := True; { 激活 OnFilterRecord 事件 }
end;

procedure TForm1.ClientDataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  if DataSet.FieldValues['ID'] mod 2 = 0 then
    Accept := True
  else
    Accept := False;
end;


补充: _ 在使用 like 时课代表单个字符.
posted on   万一  阅读(8369)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2009-02-01 图解 CSS (11): 理解样式表的逻辑
2009-02-01 图解 CSS (10): 链接、继承、放缩、鼠标指针、其他(待补充...)
2009-02-01 图解 CSS (9): 列表


点击右上角即可分享
微信分享提示