解决方案: 通过函数动态给数据集创建一个名为" VkChecked " 的静态字段,不影响物理表结构,并能实现Grid多选功能。
使用方法: DoCreateSelectedField(数据集名称)
具体实现:
procedure DoCreateSelectedField(ADataSet:TDataSet);
var
NewField: TField;
I:integer;
NewFieldName:String;
IsCreated:Boolean;
begin
IsCreated:=True;
NewFieldName:='VtChecked'; //Vt:Vitual Checked;
//如果已经存在字段,取消创建操作
for I:= 0 to ADataSet.Fields.Count - 1 do
if ADataSet.Fields.Fields[i].FieldName= NewFieldName then
IsCreated:=False;
if IsCreated then
begin
//创建动态字段
NewField:=TStringField.Create(ADataSet);
ADataSet.Close;
//释放所有的静态字段
for I:=0 to ADataSet.Fields.Count-1 do
ADataSet.Fields[I].Free;
//根据FieldDefs的字段信息动态的生成静态字段。
for I:=0 to ADataSet.FieldDefs.Count-1 do
ADataSet.FieldDefs.Items[I].CreateField(ADataSet);
NewField.Size:=5;
NewField.FieldName:=NewFieldName;
NewField.FieldKind:=fkInternalCalc;
NewField.DataSet:=ADataSet;
end;
ADataSet.Open;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
with ClientDataSet1 do
begin
Close;
Fields.Clear;
FieldDefs.Clear;
CommandText := SQLStr1;
FieldDefs.Update;
with TFieldDef(FieldDefs.Insert(0)) do
begin
Name := 'FIELD_NAME';
DataType := ftBoolean;
DisplayName := 'FIELD_NAME';
end;
for i := 0 to FieldDefs.Count - 1 do
FieldDefs[i].CreateField(ClientDataSet1);
Fields[0].FieldKind := fkInternalCalc;
Open;
end;
end;
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
with ClientDataSet1 do
begin
if Fields[0].Value = Null then Fields[0].AsBoolean := False;
end;
end;