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


Required、Precision、MaxValue、MinValue:
begin
  { Required: 必填字段 }
  with TIntegerField.Create(Self) do begin
    FieldName := 'ID';
    Required := True;
    DataSet := ClientDataSet1;
  end;

  { Precision: 浮点数精度}
  with TFloatField.Create(Self) do begin
    FieldName := 'Float';
    Precision := 3; { 譬如: 输入 1.2345 只会保留 1.23 }
    DataSet := ClientDataSet1;
  end;

  { MaxValue、MinValue }
  with TIntegerField.Create(Self) do begin
    FieldName := 'Integer';
    MinValue := 1;
    MaxValue := 99;
    DataSet := ClientDataSet1;
  end;

  ClientDataSet1.CreateDataSet;
end;


可在字段的 CustomConstraint 属性中按 SQL 语法指定约束规则;
并用字段的 ConstraintErrorMessage 属性指定违反规则后的错误提示.
procedure TForm1.FormCreate(Sender: TObject);
begin
  with TIntegerField.Create(Self) do begin
    FieldName := 'ID';
    CustomConstraint := 'x>0 and x<100'; { 其中的 x 是随意的, 表示当前字段值 }
    ConstraintErrorMessage := 'Err1';
    DataSet := ClientDataSet1;
  end;

  with TStringField.Create(Self) do begin
    FieldName := 'Name';
    Size := 11;
    CustomConstraint := 'x Like ''张%'''; { 假如只要姓张的 }
    ConstraintErrorMessage := 'Err2';
    DataSet := ClientDataSet1;
  end;

  with TStringField.Create(Self) do begin
    FieldName := 'Sex';
    Size := 2; { 如果使用 TWideStringField 这里应该是 1 }
    CustomConstraint := 'x in(''男'', ''女'')'; { 只能输入: 男或女 }
    ConstraintErrorMessage := 'Err3';
    DataSet := ClientDataSet1;
  end;

  with TStringField.Create(Self) do begin
    FieldName := 'Email';
    Size := 21;
    CustomConstraint := 'Lower(x) Like ''%@gmail.com'''; { 假如只能是 Google 信箱}
    ConstraintErrorMessage := 'Err4';
    DataSet := ClientDataSet1;
  end;

  ClientDataSet1.CreateDataSet;

  ClientDataSet1.AppendRecord([1, '张三', '男', '123@gmail.com']);
  ClientDataSet1.AppendRecord([2, '张四', '女', 'ABC@GMAIL.COM']);
end;

{ 禁用限制 }
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.DisableConstraints;
end;

{ 启用限制 }
procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet1.EnableConstraints;
end;


使用数据集的 Constraints 属性重做上面的例子:
procedure TForm1.FormCreate(Sender: TObject);
begin
  with ClientDataSet1.FieldDefs do begin
    Add('ID', ftInteger);
    Add('Name', ftString, 11);
    Add('Sex', ftString, 2);
    Add('Email', ftString, 21);
  end;

  with ClientDataSet1.Constraints.Add do begin
    CustomConstraint := 'ID>0 and ID<100'; { 其中的 ID 是字段名 }
    ErrorMessage := 'Err1';
  end;

  with ClientDataSet1.Constraints.Add do begin
    CustomConstraint := 'Name Like ''张%''';
    ErrorMessage := 'Err2';
  end;

  with ClientDataSet1.Constraints.Add do begin
    CustomConstraint := 'Sex in(''男'', ''女'')';
    ErrorMessage := 'Err3';
  end;

  with ClientDataSet1.Constraints.Add do begin
    CustomConstraint := 'Lower(Email) Like ''%@gmail.com''';
    ErrorMessage := 'Err4';
  end;

  ClientDataSet1.CreateDataSet;

  ClientDataSet1.AppendRecord([1, '张三', '男', '123@gmail.com']);
  ClientDataSet1.AppendRecord([2, '张四', '女', 'ABC@GMAIL.COM']);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.DisableConstraints;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet1.EnableConstraints;
end;


数据集的 Constraints 和字段的 CustomConstraint 也都可以在设计时完成.

不过其中的 ConstraintErrorMessage 和 ErrorMessage 在当前版本(14.0.3593.25826)中有 bug;
我在 Delphi 2007 中测试了一下, 没有问题.

posted on   万一  阅读(4771)  评论(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吧
历史上的今天:
2008-02-09 WinAPI: PolyPolyline - 绘制多组线段
2008-02-09 WinAPI: PolyPolygon - 绘制一组多边形
2008-02-09 WinAPI: PolylineTo - 绘制一组连续线段(更新当前位置)
2008-02-09 WinAPI: Polyline - 绘制一组连续线段
2008-02-09 WinAPI: Polygon - 绘制多边形
2008-02-09 WinAPI: PolyBezierTo - 绘制贝塞尔线(更新当前位置)
2008-02-09 WinAPI: PolyBezier - 绘制贝塞尔线


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