2015-09-07 2 views
0

Я создаю невизуальный компонент. Кратко Код:Объект не создает

// Element of some list item 
TMyItem = class 
private 
    Id: integer; 
    Caption: string; 
public 
    constructor Create(const aId: integer; const aCaption: string); 
end; 

// List of items 
TMyItemList = class(TObjectList<TMyItem>) 
public 
    constructor Create; 
end; 

// The component 
TMyComp = class(TComponent) 
private 
    FMyList: TMyItemList; 
public 
    constructor Create; 

implementation 

constructor TMyComp.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    FMyList:= TMyItemList.Create; 
end; 

Вопрос: почему «FMyList» не существует, когда «MyComp» создан? Assigned (FMyList) = false ...

ответ

0

Это не ваш фактический код. Ваш фактический код компилируется. Но мы можем догадаться, в чем проблема. Здесь:

type 
    TMyComp = class(TComponent) 
    private 
    FMyList: TMyItemList; 
    public 
    constructor Create; 
    end; 

Конструктор TComponent объявлен так:

constructor Create(AOwner: TComponent); virtual; 

Это виртуальный конструктор, так как структура потокового Delphi опирается на метаклассы для создания объектов. Если вы хотите, чтобы фреймворк вызывал ваш конструктор, вам нужно переопределить этот виртуальный конструктор.

constructor Create(AOwner: TComponent); override; 

Я достаточно уверен в этом предположении, но нам не нужно угадывать. В следующий раз отправьте реальный код, Minimal, Complete, and Verifiable Example.

+0

Ваш ответ сработал, спасибо большое, добавив, что «переопределение» решило проблему. И нормально, в следующий раз, когда я напишу реальный код, я подумал, что этого достаточно, чтобы написать вот так. – scribe

+0

Это действительно хорошая привычка. Это поможет вам найти множество проблем, которые явно более эффективны для вас. В этом случае это было очевидно, потому что мы неоднократно видели эту ошибку и хорошо ее понимали. Но пока вы не научились этому, вам трудно обнаружить. –

+0

Что @DavidHeffernan не упоминал: если вы разместили код, то вы можете ввести ошибки в поддельный код, которого не было в оригинале. Это очень сложно для кого-то, кто пытается помочь понять, что представляет собой настоящая проблема. –

Смежные вопросы