1

これは、私がここで取り組んでいたプロジェクトの続きです。 相互に使用するクラスの循環参照の問題

そこで受けたアドバイスは、循環参照の問題を修正しました(ここでも、助けてくれてありがとう)。今、私は何か他のものと格闘しています: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;

cmTPDataConnector.Createで実行する予定のShowMessage行が表示されないため、TcmTPCUstomDataConnectorからCreateメソッドを継承していないと思われます。そうではないですか?

私が見逃している明らかな何かがあるように「感じ」ますが、私はそれを見ていません。:-\

2つの質問:

1)FObservingDataPanelsが作成されないのはなぜですか?
2)「//継承されたCreate(AOwner); // TODO:重複をチェックする」および「//継承された破棄; // TODO:重複をチェックする」行は、ある時点でModelMakerによって配置されました。コメントを外す必要がありますか?

PS明らかに、私はまだコンポーネントの作成と継承について学んでいます。その他のご意見やアドバイスは大歓迎です。

PPS今日は私からたくさんの質問があります。ノッチを下げる必要がある場合は、遠慮なくお知らせください。...(ここでたくさんの質問のボーナスがあります)。

助けてくれてありがとう!:)

4

2 に答える 2

10

コンストラクターをオーバーライドしてから、そのコンストラクターの /first/ として inherited を呼び出す必要があります。

  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;
于 2009-04-01T23:32:32.967 に答える
3

私は Delphi に慣れていませんが、コンストラクターの宣言に「オーバーライド」が必要になる可能性があると思います。

于 2009-04-01T23:23:10.977 に答える