-
zorik © (25.01.07 09:38) [0]
TLabelClass = class of TLabel;
TLabelRed = class(TLabel)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TLabelRed.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Font.Color := clRed;
end;
destructor TLabelRed.Destroy;
begin
inherited Destroy;
end;
Вариант вызова 1...
var
r: TlabelRed;
begin
r := TlabelRed.Create(Form1);
...
Здесь все нормально, попадаем в конструктор TLabelRed.Create (метка красная)
Вариант вызова 2
Процедура вызова:
procedure DrawLabel(lb: TLabel; lbclass: TLabelClass);
begin
lb := TLabelClass.Create(Form1);
end;
Сам вызов:
var
lb: TLabelRed;
begin
DrawLabel(lb, TlabelRed);
...
А здесь не попадаем в конструктор TLabelRed.Create (метка красная) -
zorik © (25.01.07 09:44) [1]Опечатка: Во втором случае метка черная
-
vlad-mal © (25.01.07 09:50) [2]Нужно :lb := lbclass.Create(Form1);
а не:lb := TLabelClass.Create(Form1); -
zorik © (25.01.07 10:09) [3]Я уже сам увидел, но это не удачный пример. Реально было сложнеее, но справился. Пишу свой компонент и несколько наследников от него. Потом нужно вызывать конструкторы их создания. Компилятор выдавал ошибку что не может перегрузить статический метод. Объявил в базовом классе конструктор Create как виртуальный и все получилосьTTeoTable = class
...
public
constructor Create; virtual;
...
end;
TNASTable = class
...
public
constructor Create; override; (раньше здесь не было override поэтому не создавался наследник)
...
end;
Всем спасибо. Тема закрыта