-
Olegz77 (18.02.07 01:22) [0]Такой вопрос: пишу компонент (на основе TPanel) в него вставляются (в конструкторе) другие компоненты. Надо после того как компонент положат на форму настроить вид вложенных компонентов. Вызываю настройку компонентов из конструктора выдает ошибку: Control has no parent... Как поймать момент, когда компонент кинули на форму и его parent уже настроен???
-
RASkov (18.02.07 02:02) [1]TMyPanel = class(TPanel)
protected
procedure Loaded; override;
....
procedure TMyPanel.Loaded;
begin
inherited;
{}
end; -
DimaBr (19.02.07 12:26) [2]Александр (привет). Метод Loaded, при заброске компонента на форму не выполняется (можешь сам проверить), лучше переопределить так
TMyChildPanel = class(TCustomPanel)
protected
procedure SetParent(AParent: TWinControl);override;
end;
procedure TMyChildPanel.SetParent(AParent: TWinControl);
begin
if (AParent is TMyPanel) or (AParent = nil)
then inherited
else raise Exception.Create('Error Parent Control !');
end; -
RASkov (19.02.07 15:53) [3]> [2] DimaBr (19.02.07 12:26)
Привет.
> можешь сам проверить
Тебе верю.
И в самом деле SetParent - это то, что надо. Но я еще про Notifycation думал... -
Игорь Шевченко © (21.02.07 15:25) [4]Можно попробовать так в конструкторе:
DisableAlign
try
настройка свойств
finally
EnableAlign;
end;
Пример взят из Controls.pas
TWinControl.ReadState -
DimaBr (21.02.07 15:32) [5]Немного не то, речь идёт о том что он создаёт в конструкторе на своём контроле ещё один (скорее всего TGraphicsControl) контрол и присваивает ему Control2.Parent := self, в то время когда у основного контрола ещё нет парента. А не TWinControl-ы просто жить без парента не могут.
-
Игорь Шевченко © (21.02.07 15:45) [6]DimaBr (21.02.07 15:32) [5]
Я без кода вообще не хочу делать предположений. Но неоднократно сталкивался с необходимостью изменений значений свойств компонента в его конструкторе (еще до назначения parent'a) и если эти изменение этих свойств вело к визуальным эффектам, то для ряда таких изменений DisableAlign помогало. -
Видимо, вложенные компоненты кривые. Если предотвращать это из создающего компонента, можно делать настройку после CreateWnd.