作为SubComponent的TDataSource后代的属性路径错误无效

时间:2011-08-22 02:48:56

标签: delphi delphi-2010

我正在尝试设计一组包含自己的数据库访问权限的数据控件。 所以我创建了一个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

2 个答案:

答案 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;