これは、私がここで取り組んでいたプロジェクトの続きです。 相互に使用するクラスの循環参照の問題
そこで受けたアドバイスは、循環参照の問題を修正しました(ここでも、助けてくれてありがとう)。今、私は何か他のものと格闘しています: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今日は私からたくさんの質問があります。ノッチを下げる必要がある場合は、遠慮なくお知らせください。...(ここでたくさんの質問のボーナスがあります)。
助けてくれてありがとう!:)