Проблема с созданием компонента: поле заканчивается ноль - PullRequest
1 голос
/ 02 апреля 2009

Это продолжение проекта, над которым я работал здесь: Циркулярная ссылка на классы, которые используют друг друга

Полученный там совет исправил проблему с рециркуляцией (опять же, спасибо за помощь). Теперь я борюсь с чем-то другим: TcmDataPanel.FObservingDataPanels всегда заканчивается = nil, очевидно, потому что он никогда не создается. (Изначально я получал нарушение прав доступа, но при дальнейшем тестировании оказалось, что FObserver всегда был нулевым).

Вот соответствующий код (это блок TFrame, где TcmTPDataPanel является потомком TFrame):

unit cmTPDataPanelFrame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cmTPBasePanelFrame, cmTPPanels, nxdb, nxllComponent;

type
  TcmTPDataConnector = class;

  TcmTPDataPanel = class(TcmTPBasePanel)
    Database: TnxDatabase;
    Session: TnxSession;
  private
    FDataConnector: TcmTPDataConnector;
    MyNxDataBase: TnxDatabase;
    MyNxSession: TnxSession;
    MyRefNxDataBase: TnxDatabase;
  protected
    procedure Disconnect; virtual; abstract;
    procedure Refresh; virtual;
    procedure Requery; virtual; abstract;
  public
    procedure Connect;
  published
    property DataConnector: TcmTPDataConnector read FDataConnector write
        FDataConnector;
  end;

  TcmTPCustomDataConnector = class(TComponent)
  private
    FDatabase: TnxDatabase;
    FObservingDataPanels: TList;
    FTableForCategories: TnxTable;
    FTableForItemCategoryLinks: TnxTable;
    FTableForItems: TnxTable;
    procedure SetTableForItemCategoryLinks(const Value: TnxTable);
  protected
    procedure IterateObservers;
  public
    constructor Create(AOwner: TComponent);
    destructor Destroy; override;
    procedure Register(Instance: TcmTPDataPanel);
    procedure ReportObservers;
    procedure Unregister(Instance: TcmTPDataPanel);
  published
    property Database: TnxDatabase read FDatabase write FDatabase;
    property TableForCategories: TnxTable read FTableForCategories write
        FTableForCategories;
    property TableForItemCategoryLinks: TnxTable read
        FTableForItemCategoryLinks write SetTableForItemCategoryLinks;
    property TableForItems: TnxTable read FTableForItems write FTableForItems;
  end;

  TcmTPDataConnector = class(TcmTPCustomDataConnector)
  end;


var
  cmTPDataPanel: TcmTPDataPanel;

implementation

=== и ===

{
*************************** TcmTPCustomDataConnector ***************************
}
constructor TcmTPCustomDataConnector.Create(AOwner: TComponent);
begin
  ShowMessage('TcmTPCustomDataConnector.Create entered.');
//  inherited Create(AOwner); // TODO : check duplicate
  FObservingDataPanels := TList.Create();
end;

destructor TcmTPCustomDataConnector.Destroy;
begin
  FreeAndNil(FObservingDataPanels);
//inherited Destroy; // TODO : check duplicate
end;

Строка ShowMessage, которую я ожидаю запустить на cmTPDataConnector.Create, никогда не появляется, что заставляет меня думать, что она не наследует метод Create от TcmTPCUstomDataConnector. Не должно ли это быть?

Такое ощущение, что я что-то упускаю из виду, но я этого не вижу. : - \

Два вопроса:

1) Почему FObservingDataPanels не создается?
2) В какой-то момент ModelMaker вставил строки "// унаследованный Create (AOwner); // TODO: проверка дубликата" и "// унаследованный Destroy; // TODO: проверка дублирования" Должны ли они быть без комментариев?

P.S. Очевидно, я все еще учусь о создании и наследовании компонентов. Любой другой вклад и советы приветствуются.

P.P.S. Много вопросов от меня сегодня. Не стесняйтесь, дайте мне знать, если мне нужно уронить его на ступеньку ниже ... (просто провести здесь день с большим количеством вопросов).

Заранее спасибо за любую помощь! :)

Ответы [ 2 ]

10 голосов
/ 02 апреля 2009

Вам нужно переопределить ваш конструктор, а затем вызвать унаследованный как / first / вещь в этом конструкторе.

  public
    constructor Create(AOwner: TComponent); override;



constructor TcmTPCustomDataConnector.Create(AOwner: TComponent);
begin
  inherited Create(AOwner); // TODO : check duplicate
  ShowMessage('TcmTPCustomDataConnector.Create entered.');
  FObservingDataPanels := TList.Create();
end;
3 голосов
/ 02 апреля 2009

У меня проблемы с Delphi, но я думаю, что вам может понадобиться "переопределить" в объявлении конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...