起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 248|回复: 7

【搞定】[请求]自定义数据集运行时动态改变字段的问题?**

[复制链接]
发表于 2008-3-6 19:57:01 | 显示全部楼层 |阅读模式
现有一个自定义数据集,在运行中动态改变字段。代码如下

   //清空数据集的字段
   for I := TBizDataSet(UserDataset).UserFieldCount-1 downto 0 do
      begin
          TBizDataSet(UserDataset).UserFields[I].Free;
      end;

     //添加一个字段
   lBizField := TUserDataField.Create(UserDataset); // 数据
        lBizField.DataSet := UserDataset;   // 指定字段所在的数据集
        lBizField.ID := dataset1.FieldByName('MPID').AsString;    // 设置字段ID
        lBizField.DisplayName := dataset1.FieldByName('MPName').AsString;   // 设置显示名称
        lBizField.DataType := GetDataTypeByName(FieldByName('PDataType').AsString); // 设置字段类型
        if SysUtils.SameText(FieldByName('PDataType').AsString,'dtString') then
        begin
          if FieldByName('PSize').AsInteger > 0 then
            lBizField.Size := FieldByName('PSize').AsInteger;
        end
        else
          lBizField.Size := FieldByName('PSize').AsInteger;   // 设置字段大小
        lBizField.EditStyleID := FieldByName('PEDITSTYLE').AsString;//设置字段表现类型
        // 如果是浮点、数字型的,设置小数点
        StrDataType := FieldByName('PDataType').AsString;
        if SysUtils.SameText(StrDataType,'dtFloat') or SysUtils.SameText(StrDataType,'dtNumber') then
          lBizField.Scale := FieldByName('PSCALE').AsInteger;

        lBizField.IsPrimaryKey := FieldByName('IsPrimaryKey').AsBoolean;           // 是否是关键字段
        lBizField.IsRequired := FieldByName('IsRequired').AsBoolean;               // 是否必须
        lBizField.Alignment := GetAlignByName(FieldByName('PALIGNMENT').AsString); // 设置对齐方式
        //自动填充
        if not SysUtils.SameText(FieldByName('PAUTOFILL').AsString,'') then //自动填充
        begin
          lBizField.AutoFillDef.Enabled := True;
          lBizField.AutoFillDef.Expression.Text := FieldByName('PAUTOFILL').AsString;
        end;
        //有效字符
        lBizField.ValidChars := FieldByName('ValidChars').AsString;//有效输入字符
        //显示格式
        if not SysUtils.SameText(FieldByName('PDPFORMAT').AsString,'') then //显示格式
          lBizField.DisplayFormat := FieldByName('PDPFORMAT').AsString;
        //查找属性
        if not SysUtils.SameText(FieldByName('PTEMPLET').AsString,'') then
        begin
          lBizFieldTemplet := TBizFieldTemplet.Create(nil);
          try
            lBizFieldTemplet.Templet.FileName := FieldByName('PTEMPLET').AsString;
            if lBizFieldTemplet.LookupDef <> nil then
            begin
              lBizField.LookupDef.Assign(lBizFieldTemplet.LookupDef);
            end;
          finally
            lBizFieldTemplet.Free;
          end;
        end;


这样写可以吗?为什么我在第一次添加的时候没问题,但是第二次先删除在添加一个新的字段的时候,当TBizDataSet(DataSetusdOther).open的时候仍然报第一次添加的一个字段不存在?

而且我调试的时候TBizDataSet(DataSetusdOther).fieldcount的值和UserDataset.userfieldcount的值为什么不一样呢
回复

使用道具 举报

 楼主| 发表于 2008-3-7 14:56:55 | 显示全部楼层
没人理我啊,我顶
回复 支持 反对

使用道具 举报

发表于 2008-3-7 15:34:07 | 显示全部楼层
你把数据集也释放一下,代码参考

DataSetZDYSJJ1.Free;
DataSetZDYSJJ1 := nil;
回复 支持 反对

使用道具 举报

发表于 2008-3-7 17:18:30 | 显示全部楼层
问题已经解决,结帖,谢谢!!!
回复 支持 反对

使用道具 举报

发表于 2008-3-7 17:19:33 | 显示全部楼层
不客气,结
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-7 17:25:06 | 显示全部楼层
我把userdataset free后怎么再创建呢?
DataSetdsAccount :=tUserDataSet.Create(nil)不行啊,必须要参数

调试的时候TBizDataSet(DataSetusdOther).fieldcount的值和UserDataset.userfieldcount的值为什么不一样呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-7 17:25:06 | 显示全部楼层
我把userdataset free后怎么再创建呢?
DataSetdsAccount :=tUserDataSet.Create(nil)不行啊,必须要参数,啥参数啊

调试的时候TBizDataSet(DataSetusdOther).fieldcount的值和UserDataset.userfieldcount的值为什么不一样呢
回复 支持 反对

使用道具 举报

发表于 2008-3-7 17:34:09 | 显示全部楼层
环境传self ;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 19:49 , Processed in 0.036056 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表