Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.034 c
14-49729
Daemys
2003-12-24 17:52
2004.01.16
Кандидаты в президенты


3-49419
koks
2003-12-22 10:02
2004.01.16
Type mismatch in expression........ :((


1-49496
S@shka
2004-01-03 15:39
2004.01.16
Можно ли свободно использовать TStringList в разных потоках?


14-49761
Knight
2003-12-23 22:46
2004.01.16
Ваше мнение....


6-49661
BelAS
2003-11-14 07:08
2004.01.16
Обновление по сети