我正在设计一组数据控件,这些控件包含自己的数据库访问权限。因此,我创建了一个具有附加属性的TDataSource后代,它可以将自己附加到数据库并创建数据集等.
如果我把它作为DBLookupComboBox附加到ListSource上,一切都很好。但是,如果我尝试将这个Datasource创建为DBLookupComboBox的一个子组件,并将其指定为ListSource,我就可以得到一个渔获-22。
我希望DataSource的属性与DBLookupComboBox一起流,我希望将DBLookupComboBox的ListSource设置为DataSource子组件,但我似乎不能两者兼而有之。当DBLookupComboBox被流时,DataSource的附加属性将被包含两次,一次(正确)在DataSource属性下,一次在ListSource.Property1下,最后一次将在加载组件时导致“无效的属性路径”,即使DataSource是预先创建的(和注册等)。
如果一个TDataSource是子组件,只要它有一些非默认属性(即标记),就会发生同样的情况。
我试图设计一个存储函数,允许DataSource属性流,但不允许ListSource属性流,但没有成功。
如能就如何开展这项工作提供任何帮助或指导,我将不胜感激。
DFM (片段)看起来像
object PmDCB1: TPmDCB
Left = 384
Top = 160
Width = 145
Height = 24
ListSource.Tag = 222
TabOrder = 0
ViewName = 'VAR'
WindowName = 'WNE'
View.Tag = 222
end发布于 2011-08-27 10:22:54
你试过像下面这样的东西吗?
type
TMyDBLookupComboBox = class(TDBLookupComboBox)
private
FListSource: TMyDataSource;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation);
override;
public
constructor Create(AOwner: TComponent); override;
published
property ListSource: TMyDataSource read FListSource;
end;
constructor TMyDBLookupComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FListSource := TMyDataSource.Create(Self);
FListSource.SetSubComponent(True);
FListSource.Name := 'ListSource';
FListSource.FreeNotification(Self);
inherited ListSource := FListSource;
end;
procedure TMyDBLookupComboBox.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FListSource) then
begin
FListSource := nil;
inherited ListSource := nil;
end;
end;发布于 2011-08-27 04:33:03
好的--最终找到了一个有效的答案--覆盖DBLookupComboBox的WriteState过程,并将ListSource设置为零,然后调用inherited,然后再将ListSource设置回原来的位置。不太丑,这是我唯一能在一周的挖掘中找到的东西。
https://stackoverflow.com/questions/7142717
复制相似问题