我正在尝试设计一组包含自己的数据库访问权限的数据控件。 所以我创建了一个TDataSource后代,它具有其他属性,可以将自己附加到数据库并创建数据集等......
如果我将这个附加到DBLookupComboBox作为ListSource一切都很好。但是,如果我尝试将此Datasource创建为DBLookupComboBox的子组件并将其指定为ListSource,那么我会看到catch-22。
我希望使用DBLookupComboBox流式传输DataSource的属性,并且我希望将DBLookupComboBox的ListSource设置为DataSource子组件,但我似乎无法做到这两点。当流式传输DBLookupComboBox时,DataSource的其他属性将包含两次,一次(正确)在DataSource属性本身下,一次在ListSource.Property1下,最后一次将导致“无效的属性路径”加载组件时,即使预先创建了DataSource(并注册了等)。
如果TDataSource是子组件,只要它设置了一些非默认属性(即Tag),就会发生同样的事情。
我试图设计一个Stored Function,它允许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
答案 0 :(得分:1)
确定 - 最终找到了一个有效的答案 - 覆盖DBLookupComboBox的WriteState过程并将ListSource设置为nil,然后调用inherited,然后再次设置ListSource。 不是太难看,它是我能找到的唯一可以在一周内挖掘的东西。
答案 1 :(得分:0)
您是否尝试过以下内容?
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;