Ошибка неверного пути к свойству для потомка TDataSource в качестве субкомпонента - PullRequest
3 голосов
/ 22 августа 2011

Я пытаюсь разработать набор элементов управления данными, которые содержат собственный доступ к базе данных. Поэтому я создаю потомка TDataSource, который имеет дополнительные свойства и может присоединяться к базе данных, создавать наборы данных и т. Д. *

Если я прикреплю это к DBLookupComboBox в качестве ListSource, все будет хорошо. Однако, если я попытаюсь создать этот источник данных как подкомпонент DBLookupComboBox и указать его как ListSource, я получу то, что кажется catch-22 .

Мне бы хотелось, чтобы свойства источника данных передавались с DBLookupComboBox, и я бы хотел, чтобы для ListSource объекта DBLookupComboBox было установлено подкомпонент 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

Ответы [ 2 ]

1 голос
/ 27 августа 2011

ОК - в конце концов нашел ответ, который работает - Переопределите процедуру WriteState DBLookupComboBox и установите для ListSource значение nil, затем вызовите значение attribute, затем снова установите ListSource.Не слишком уродливо, и это единственное, что я могу найти, это работает за неделю копания.

0 голосов
/ 27 августа 2011

Вы пробовали что-то вроде следующего?

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;
...