随笔 - 1869  文章 - 27 评论 - 8198 trackbacks - 253

提示1: 点击 标题 可进入首页;   提示2: 从搜索引擎中搜索 万一 可迅速找到这里.

随笔分类(2118)

随笔档案(1787)

积分与排名

  • 积分 - 2622122
  • 排名 - 7

最新评论

查看最新博客列表: 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

posted @ 2009-05-15 22:39 万一 阅读(3421) | 评论 (212)编辑

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 @ 2010-02-09 20:03 万一 阅读(33) | 评论 (0)编辑



procedure TForm1.FormCreate(Sender: TObject);
begin
  { DisplayFormat }
  with TIntegerField.Create(Self) do begin
    FieldName := 'Integer';
    DisplayFormat := '#, 元';
    DataSet := ClientDataSet1;
  end;
  with TDateField.Create(Self) do begin
    FieldName := 'Date';
    DisplayFormat := 'yyyy年m月d日';
    DataSet := ClientDataSet1;
  end;
  with TTimeField.Create(Self) do begin
    FieldName := 'Time';
    DisplayFormat := 'hh时mm分ss秒';
    DataSet := ClientDataSet1;
  end;
  with TFloatField.Create(Self) do begin
    FieldName := 'Float';
    DisplayFormat := '#.00'; { # 是有则用; 0 是不管有无都会占位 }
    DataSet := ClientDataSet1;
  end;

  { Alignment }
  with TFloatField.Create(Self) do begin
    FieldName := 'Alignment';
    Alignment := taCenter;
    DisplayFormat := '#.##';
    DataSet := ClientDataSet1;
  end;
  { currency }
  with TCurrencyField.Create(Self) do begin
    FieldName := 'Currency';
    currency := True;          { 这也是默认的 }
    DataSet := ClientDataSet1;
  end;
  { EditMask }
  with TStringField.Create(Self) do begin
    FieldName := 'EditMask';
    Size := 15;
    EditMask := '!\(999\)000-0000;1;_';
    DataSet := ClientDataSet1;
  end;

  with ClientDataSet1 do begin
    CreateDataSet;
    AppendRecord([1234,'2010-2-9','11:22:3',1.2,1.2,123,'(123)456-7890']);
  end;
end;

posted @ 2010-02-09 18:13 万一 阅读(35) | 评论 (0)编辑

自动增长字段:
//建立方法一:
begin
  with ClientDataSet1 do begin
    FieldDefs.Add('ID', ftAutoInc);
    FieldDefs.Add('Name', ftString, 11);
    CreateDataSet;
  end;
end;

//建立方法二:
begin
  with TAutoIncField.Create(Self) do begin
    FieldName := 'ID';
//    AutoGenerateValue := arAutoInc; { 不起作用 }
    DataSet := ClientDataSet1;
  end;
  with TStringField.Create(Self) do begin
    FieldName := 'Name';
    Size := 11;
    DataSet := ClientDataSet1;
  end;
  ClientDataSet1.CreateDataSet;
end;


字段默认值:
begin
  with TStringField.Create(Self) do begin
    FieldName := 'Name';
    Size := 11;
    DataSet := ClientDataSet1;
  end;
  with TIntegerField.Create(Self) do begin
    FieldName := 'Age';
    DefaultExpression := '18';
    DataSet := ClientDataSet1;
  end;
  ClientDataSet1.CreateDataSet;
end;

posted @ 2010-02-09 16:00 万一 阅读(46) | 评论 (0)编辑

测试使用了官方的范例文件(主表: orders.xml; 从表: items.xml).



//先在窗体上添加: 
//ClientDataSet1、DataSource1、DBGrid1、ClientDataSet2、DataSource2、DBGrid2; 然后:

procedure TForm1.FormCreate(Sender: TObject);
begin
  { 关联数据集 }
  DBGrid1.DataSource := DataSource1;
  DataSource1.DataSet := ClientDataSet1;

  DBGrid2.DataSource := DataSource2;
  DataSource2.DataSet := ClientDataSet2;

  { 载入范例文件 }
  ChDir(GetEnvironmentVariable('COMMONPROGRAMFILES') + '\CodeGear Shared\Data\');
  ClientDataSet1.LoadFromFile('orders.xml');
  ClientDataSet2.LoadFromFile('items.xml');

  { 设定主从表 }
  ClientDataSet2.MasterSource := DataSource1;
  ClientDataSet2.MasterFields := 'OrderNo'; { 多个字段时用分号隔开 }
end;


如果在设计时完成, 也主要是设置 MasterSource、MasterFields 两个属性, 下面是设计时的一个截图:



posted @ 2010-02-06 22:48 万一 阅读(138) | 评论 (0)编辑

运行时的设计方法:



设计时的准备工作:
ClientDataSet1、DataSource1、DBGrid1 并关联, 这用于主表;
ClientDataSet2、DataSource2、DBGrid2 并关联, 这将成为主表的一个字段(或叫嵌套表);
还可以放个 Splitter1 来协调 DBGrid 的大小.
procedure TForm1.FormCreate(Sender: TObject);
begin
  { 主表: 定义了两个字段, 其中 "销售明细" 是 DataSet 字段 }
  with TStringField.Create(Self) do begin
    FieldName := '销售员';
    Size := 11;
    DataSet := ClientDataSet1;
  end;
  with TDataSetField.Create(Self) do begin
    FieldName := '销售明细';
    DataSet := ClientDataSet1;
  end;

  { 从表: 定义了三个字段 }
  with TIntegerField.Create(Self) do begin
    FieldName := '商品ID';
    DataSet := ClientDataSet2;
  end;

  with TStringField.Create(Self) do begin
    FieldName := '商品名称';
    Size := 7;
    DataSet := ClientDataSet2;
  end;

  with TIntegerField.Create(Self) do begin
    FieldName := '销售数量';
    DataSet := ClientDataSet2;
  end;

  { 让 ClientDataSet1 的 DataSet 字段(销售明细) 关联到 ClientDataSet2 }
  ClientDataSet2.DataSetField := TDataSetField(ClientDataSet1.FieldByName('销售明细'));
  ClientDataSet1.CreateDataSet; { 数据集 ClientDataSet2 现在是 ClientDataSet1 的一个字段 }

  { 添加测试数据 }
  ClientDataSet1.AppendRecord(['张三']);
  ClientDataSet2.AppendRecord([1, '手机', 11]);
  ClientDataSet2.AppendRecord([2, '电脑', 22]);
  ClientDataSet2.AppendRecord([3, '打印机', 33]);

  ClientDataSet1.AppendRecord(['李四']);
  ClientDataSet2.AppendRecord([1, '手机', 55]);
  ClientDataSet2.AppendRecord([2, '电脑', 66]);

  ClientDataSet1.AppendRecord(['王五']);
  ClientDataSet2.AppendRecord([3, '打印机', 77]);
end;

{ 访问嵌套表的方法 }
procedure TForm1.Button1Click(Sender: TObject);
var
  DataSetField: TDataSetField;
begin
  DataSetField := ClientDataSet1.FieldByName('销售明细') as TDataSetField;
  ShowMessage(DataSetField.NestedDataSet.Fields[1].AsString);
  ShowMessage(DataSetField.Fields[1].AsString);
end;


仅就这个例子来讲, "商品"和对应的编号应该是统一的, 为避免出错和输入方便, 这里应该使用查找字段.

下面是为添加查找字段重写的代码(设计时再多添加一个 ClientDataSet3 ):

procedure TForm1.FormCreate(Sender: TObject);
begin
  { 先准备给 ClientDataSet2 的查找字段使用的数据集}
  with ClientDataSet3 do begin
    FieldDefs.Add('ID', ftInteger);
    FieldDefs.Add('Name', ftString, 7);
    CreateDataSet;
    AppendRecord([1, '手机']);
    AppendRecord([2, '电脑']);
    AppendRecord([3, '打印机']);
    AppendRecord([4, '扫描仪']);
  end; //------------------------------------------

  { 主表: 定义了两个字段, 其中 "销售明细" 是 DataSet 字段 }
  with TStringField.Create(Self) do begin
    FieldName := '销售员';
    Size := 11;
    DataSet := ClientDataSet1;
  end;
  with TDataSetField.Create(Self) do begin
    FieldName := '销售明细';
    DataSet := ClientDataSet1;
  end;

  { 从表: 定义了三个字段 }
  with TIntegerField.Create(Self) do begin
    FieldName := '商品ID';
    DataSet := ClientDataSet2;
  end;

  with TStringField.Create(Self) do begin { 这个定义为查找字段 }
    FieldName := '商品名称';
    FieldKind := fkLookup;
    DataSet := ClientDataSet2;
    KeyFields := '商品ID';
    LookupDataSet := ClientDataSet3;
    LookupKeyFields := 'ID';
    LookupResultField := 'Name';
  end;

  with TIntegerField.Create(Self) do begin
    FieldName := '销售数量';
    DataSet := ClientDataSet2;
  end;

  { 让 ClientDataSet1 的 DataSet 字段(销售明细) 关联到 ClientDataSet2 }
  ClientDataSet2.DataSetField := TDataSetField(ClientDataSet1.FieldByName('销售明细'));
  ClientDataSet1.CreateDataSet; { 数据集 ClientDataSet2 现在是 ClientDataSet1 的一个字段 }

  { 添加测试数据 }
  ClientDataSet1.AppendRecord(['张三']);
  ClientDataSet2.AppendRecord([1, null, 11]); { 查找字段会自动填写, 不需要输入 }
  ClientDataSet2.AppendRecord([2, null, 22]);
  ClientDataSet2.AppendRecord([3, null, 33]);

  ClientDataSet1.AppendRecord(['李四']);
  ClientDataSet2.AppendRecord([1, null, 55]);
  ClientDataSet2.AppendRecord([2, null, 66]);

  ClientDataSet1.AppendRecord(['王五']);
  ClientDataSet2.AppendRecord([3, null, 77]);
end;


设计时完成数据集字段:



posted @ 2010-02-06 12:51 万一 阅读(144) | 评论 (0)编辑