Delphi中如何从TUniQuery获取TCustomUniDataSet以使用非发布属性
你对官方文档里「未发布属性」的表述存在误解,这里的「未发布」仅指方法/属性没有被放到 published 区段,不会显示在设计期的对象检查器面板中,完全不影响你在代码中直接调用这些公开(public)的继承方法。
正确的使用方式
- 直接调用
FieldByName即可,不需要任何额外封装,这是合法且官方允许的写法:
该方法是qry.FieldByName('fieldname').AsString := '你的值';TCustomUniDataSet的公开方法,TUniQuery作为子类完整继承了该能力,不存在兼容性问题。 - 如果你的编译器出现找不到方法的报错(极少数旧版本UniDAC可能存在这个问题),可以做安全的类型转换,这种写法完全符合DevArt的开发规范,不属于hack:
TCustomUniDataSet(qry).FieldByName('fieldname').AsString := '你的值'; - 如果你需要频繁操作同一个字段,建议提前缓存字段对象减少查找开销:
var FAccountField: TField; // 数据集打开后仅执行一次赋值 FAccountField := qry.FieldByName('account'); // 后续直接操作缓存的字段对象即可 edtAccount.Text := FAccountField.AsString;
关于官方文档的说明
官方给出的提示:
应用程序不应直接使用TCustomUniDataSet对象,而应使用TCustomUniDataSet的子类,例如TUniQuery、TUniTable,这些子类继承了TCustomUniDataSet的数据集相关属性和方法。
这里的「不应直接使用」是指不要手动实例化 TCustomUniDataSet 类,而不是禁止你调用子类从该父类继承来的公开方法,两者完全不冲突。
你之前使用的 qry.parent.fieldbyname 才属于非规范的hack写法:Parent 属性指向的是组件所在的容器控件(窗体/面板等),这种写法能跑通完全是巧合,存在非常高的版本兼容和运行时崩溃风险,建议立刻替换为上面的规范写法。
内容的提问来源于stack exchange,提问作者MyICQ
相关产品推荐
相关产品推荐

