Текущий архив: 2004.01.16;
Скачать: CL | DM;
Вниз
Создание объекта в конструкторе. Найти похожие ветки
← →
wnew © (2003-12-28 13:35) [0]Здравствуйте, мастера. Пожалуйста, просветите: можно ли, не чревато ли, если я создаю наследника, к примеру, от TPanel и в его конструкторе создаю объекты TLabel? Я так сделал, всё вроде бы работает без проблем, но есть сомнение в правильности такого подхода.
Пример:
TTitelPanel = class(TPanel)
private
Zeile1: TLabel;
Zeile2: TLabel;
public
constructor Create(AOwner: TComponent; Text1,Text2: String);
end;
constructor TTitelPanel.Create(AOwner: TComponent; Text1,Text2: String);
begin
inherited Create(AOwner);
Caption := "";
Zeile1 := TLabel.Create(self);
Zeile2 := TLabel.Create(self);
Zeile1.Caption := Text1;
Zeile2.Caption := Text2;
Zeile1.Font.Style := [fsBold];
Zeile2.Font.Style := [fsBold];
Zeile1.Font.Color := clTeal;
Zeile2.Font.Color := clTeal;
Zeile1.Align := alTop;
Zeile2.Align := alTop;
Zeile1.Alignment := taCenter;
Zeile2.Alignment := taCenter;
Zeile1.Parent := self as TWinControl;
Zeile2.Parent := self as TWinControl;
end;
← →
dmk © (2003-12-28 13:44) [1]Если так надо, почему бы и нет?
← →
Anatoly Podgoretsky © (2003-12-28 13:44) [2]Нормально, можешь посмотреть исходники VCL
← →
wnew © (2003-12-28 13:52) [3]Спасибо вам!
← →
wnew © (2004-01-04 00:42) [4]Не создаю отдельной ветки, так как, следующий мой вопрос опирается на предыдущий.
По аналогии с предыдущим примером, я хотел в конструкторе TPanel создавать объект от TPaintBox. При обращении к property Canvas от PaintBox"а, всё выглядит нормально, но при попытке рисовать на канве PaintBox"а - получаю исключение: "Елемент не имеет вышестоящего окна".
Дельфисты, пожалуйста, подскажите решение этой проблемы.
← →
Юрий Зотов © (2004-01-04 01:21) [5]Похоже, у PainBox"а не назначено свойство Parent.
← →
wnew © (2004-01-04 01:25) [6]
> Юрий Зотов © (04.01.04 01:21) [5]
Передаю ему в качестве Parent - self, аналогично выше приведёному примеру.
← →
Юрий Зотов © (2004-01-04 01:34) [7]> wnew © (04.01.04 01:25) [6]
Значит, не назначен Parent у самой панели.
Панель, PaintBox и пр. - все это дочерние окна. У любого дочернего окна все Parent"ы (снизу вверх, вплоть до самой формы) должны быть определены до первого рисования.
← →
wnew © (2004-01-04 01:36) [8]
type
TGrPanel = class(TPanel)
private
GrBox: TPaintBox;
public
procedure GrRepaint(GrHeight: Integer);
constructor Create(AOwner: TComponent); override;
end;
var GrPanel:TGrPanel;
implementation
{ TGrPanel }
constructor TGrPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Align := alBottom;
DoubleBuffered := True;
GrBox := TPaintBox.Create(self as TControl);
try
GrBox.Parent := self as TWinControl;
GrBox.Canvas.Brush.Color := clBlue;
GrBox.Canvas.FillRect(BoundsRect);
except
GrBox.Free;
GrBox := nil;
end;
end;
← →
wnew © (2004-01-04 01:39) [9]Панель создаю динамически и присваиваю GrPanel.Parent := Form1;
При чём панель создаётся нормально и при пошаговом выполнении, именно, на этой строке: GrBox.Canvas.FillRect(BoundsRect);
происходит исключение.
← →
wnew © (2004-01-04 01:47) [10]Да, в хелпе так и сказанно, что исключение EInvalidOperation происходит, если компонент не имеет вышестоящего окна. При пошаговом выполнении я наблюдал за присвоением значения Parent - всё нормально, да и при любом обращении к Property всё проходит нормально. Если бы PaintBox не имел владельца, то при обращении к его свойствам тоже происходило бы исключение.
← →
Юрий Зотов © (2004-01-04 01:48) [11]Вот эта строка:
GrBox.Canvas.FillRect(BoundsRect);
должна, IMHO, дать ту самую ошибку.
Дело в том, что в конструкторе создается ОБЪЕКТ класса TGrPanel, но он пока еще не имеет ОКНА . Окно будет создано позже, когда будет вызван метод CreateWnd. Поэтому и получается, что в момент первого рисования GrBox пока еще "has no parent window".
Значит, надо у панели заместить CreateWnd, а в нем, после вызова inherited уже имеем окно и можем рисовать что хотим и где хотим.
← →
wnew © (2004-01-04 01:53) [12]
> Юрий Зотов © (04.01.04 01:34) [7]
> У любого дочернего окна все Parent"ы (снизу вверх, вплоть
> до самой формы) должны быть определены до первого рисования.
А-а-а! Вот тут собака и зарыта. Конечно, если в конструкторе панели создаётся PaintBox, владелец панели ещё не определён.
Тогда, как это обойти?
← →
wnew © (2004-01-04 01:54) [13]Спасибо!:) Последний мой пост уже ни к чему:))
← →
wnew © (2004-01-04 02:04) [14]А - это, выше мной сказанное: Если бы PaintBox не имел владельца, то при обращении к его свойствам тоже происходило бы исключение.
- абсолютная чушь. Крыша поехала:)
Страницы: 1 вся ветка
Текущий архив: 2004.01.16;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.03 c