Конференция "Компоненты" » Окончание инициализации компонента [D7, WinXP]
 
  • 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 помогало.
  • GrayFace © (25.02.07 21:20) [7]
    Видимо, вложенные компоненты кривые. Если предотвращать это из создающего компонента, можно делать настройку после CreateWnd.
 
Конференция "Компоненты" » Окончание инициализации компонента [D7, WinXP]
Есть новые Нет новых   [134427   +38][b:0][p:0.001]