您的位置:首页 > 其它

TClientDataSet[27]: 字段值的约束(或叫输入限制)

2010-02-09 20:03 399 查看
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 中测试了一下, 没有问题.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: