المسألة مع خلق عنصر: حقل ينتهي لا شيء
-
22-08-2019 - |
سؤال
وهذا هو استمرار للمشروع كنت أعمل هنا: قضية المرجعية الدائرية مع فئات التي تستخدم بعضها البعض
والنصيحة تلقت هناك ثابتة المشكلة إشارة 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;
نصائح أخرى
وأنا صدئ في دلفي، ولكن أعتقد أنك قد تحتاج إلى "تجاوز" على إعلان المنشئ الخاص بك.