2009-04-01 2 views
1

このnilを終わるには、私がここで働いていたプロジェクトの継続である: アドバイスが受けciruclar参照の問題を修正しCircular reference issue with Classes which use each other問題:フィールドは

(再び、助けに感謝)。今、私は何か他のものと格闘しています:TcmDataPanel.FObservingDataPanelsは常に終わりがなくなります。 (最初は私はアクセス違反を受けていましたが、それ以上のテストでFObserverは常にゼロだったことが判明しました)。

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; 

I ShowMessageライン:ここ

は、関連するコード(それはTcmTPDataPanelがTFrameのをdescednentされた状態で、TFrameの単位である)でありますcmTPDataConnectorで実行することを期待しています。作成は表示されません。これは、TcmTPCUstomDataConnectorからCreateメソッドを継承していないと思います。そうではありませんか?

明らかに何かが分かっているような気がするが、私は見ていない。 : - \

つの質問:

1)はなぜFObservingDataPanelsが作成取得されていませんか?
2)「継承されたCreate(AOwner); // TODO:check duplicate」および「// Inherited Destroy; // TODO:check duplicate」行が、ある時点でModelMakerによって挿入されました。コメントを外す必要がありますか?

P.S.明らかに、私はまだコンポーネントの作成と継承について学んでいます。他の入力とアドバイスは大歓迎です。

P.P.S.今日私から多くの質問があります。私がノッチダウンしなければならないかどうか私に知らせてください...(ちょうどボーナスがたくさんの質問の日をここに持っている)。

ご協力いただきありがとうございます! :)

答えて

10

コンストラクタをオーバーライドしてから、そのコンストラクタの/ first/thingとして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; 
+0

それはそれをしました! :)ありがとうニック! (FWIWもご覧になってください。) – Jamo

3

私はDelphiでrustyですが、コンストラクタ宣言に "オーバーライド"が必要な場合があります。

+0

正確に。より一般的には、同じ名前で仮想メソッドを隠す非仮想メソッドに関する警告など、コンパイラの警告を無視しないようにすることです。 –

+0

コンパイル警告の優れた点。どんな(愚かな)理由でも、私はコンパイルの失敗を除いてメッセージウィンドウを閉じていました。将来の参照のために記載されています。 :) – Jamo

関連する問題