سؤال

وهذا هو استمرار للمشروع كنت أعمل هنا: قضية المرجعية الدائرية مع فئات التي تستخدم بعضها البعض

والنصيحة تلقت هناك ثابتة المشكلة إشارة ciruclar (مرة أخرى، شكرا للمساعدة). الآن أنا المصارعة ث / شيء آخر: TcmDataPanel.FObservingDataPanels دائما ينتهي = لا شيء، على ما يبدو لأنه لم يحصل على خلق. (في البداية كنت الحصول على انتهاك وصول، ولكن إجراء المزيد من التجارب تبين أن FObserver كان دائما النيل).

وهنا هو رمز ذات الصلة (وهي وحدة TFrame، مع TcmTPDataPanel كونها descednent 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 لم يظهر، مما يجعلني أعتقد أنه لا وراثة الأسلوب إنشاء من TcmTPCUstomDataConnector. لا ينبغي أن يكون؟

وو"يشعر" كأنه لا يوجد شيء واضح أنا في عداد المفقودين، ولكن أنا لا نرى ذلك. : - \

وسؤالين:

1) لماذا لا تحصل على FObservingDataPanels خلقت؟
2) "// الموروثة خلق (AOwner)؛ // TODO: تحقق مكررة" و "// الموروثة تدمير؛ // TODO: تحقق مكررة" وضعت الخطوط من قبل في ModelMaker في مرحلة ما. ينبغي أن تكون uncommented؟

وP.S. من الواضح، ما زلت تعلم عن خلق عنصر والميراث. أي مدخلات والمشورة الآخر هو موضع ترحيب.

وP.P.S. الكثير من الأسئلة من لي اليوم. لا تتردد في اسمحوا لي أن أعرف إذا كنت بحاجة إلى إسقاطه بانخفاض درجة .... (مجرد وجود مكافأة الكثير من بين الأسئلة اليوم هنا).

وشكرا مقدما على أي وجميع مساعدة! :)

هل كانت مفيدة؟

المحلول

وتحتاج إلى تجاوز المنشئ الخاص بك، ومن ثم استدعاء الموروثة مثل / أولا / شيء في هذا البناء.

  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;

نصائح أخرى

وأنا صدئ في دلفي، ولكن أعتقد أنك قد تحتاج إلى "تجاوز" على إعلان المنشئ الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top