Это продолжение проекта, над которым я работал здесь:
Циркулярная ссылка на классы, которые используют друг друга
Полученный там совет исправил проблему с рециркуляцией (опять же, спасибо за помощь). Теперь я борюсь с чем-то другим: 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;
Строка ShowMessage, которую я ожидаю запустить на cmTPDataConnector.Create, никогда не появляется, что заставляет меня думать, что она не наследует метод Create от TcmTPCUstomDataConnector. Не должно ли это быть?
Такое ощущение, что я что-то упускаю из виду, но я этого не вижу. : - \
Два вопроса:
1) Почему FObservingDataPanels не создается?
2) В какой-то момент ModelMaker вставил строки "// унаследованный Create (AOwner); // TODO: проверка дубликата" и "// унаследованный Destroy; // TODO: проверка дублирования" Должны ли они быть без комментариев?
P.S. Очевидно, я все еще учусь о создании и наследовании компонентов. Любой другой вклад и советы приветствуются.
P.P.S. Много вопросов от меня сегодня. Не стесняйтесь, дайте мне знать, если мне нужно уронить его на ступеньку ниже ... (просто провести здесь день с большим количеством вопросов).
Заранее спасибо за любую помощь! :)