[Delphi] Как узнать, что мой контрол назначили Parent'om?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by xophet, 31 Jul 2013.

  1. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Собственно вопрос в теме:
    Как узнать, что мой контрол назначили Parent'om?

    если нужно:
    есть 2 панели (одна - наследник TPanel (1), вторая просто TPanel (2) лежит на 1й). Нужно сделать так, чтобы при назначении Parent'ом (1) им становился (2)
     
  2. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Может кому интересно будет, расскажу как решил проблему, хотя ИМХО решение кривовато, но обо всем по порядку.
    И так нужно переопределить 3 метода TPanel
    это:
    Code:
        protected
          procedure ValidateInsert(AComponent: TComponent); override;
          procedure AfterConstruction;override;
    
    Переопределение AfterConstruction позволит нам включить валидацию только тех компонент, которые будут добавлены после завершения конструктора. Иначе валидация была бы включена до того, как конструктор закончит свою работу и пыталась бы назначить Parent'ом компонент, которого еще не существует
    Code:
    procedure TMyPanel.AfterConstruction;
    begin
      inherited;
      Created:=True;
    end;
    с валидацией сложнее т.к. ValidateInsert(AComponent: TComponent); вызывается в 2 случаях:
    кто-то указывает наш компонент как Owner или как Parent и т.к. Owner присваивается еще в конструкторе, то попытка назначить Parent приводит к access violation.
    Поэтому вот:
    Code:
    procedure TMyPanel.ValidateInsert(AComponent: TComponent);
    begin
      inherited;
      if Created then
        if TWinControl(AComponent).Owner<>nil then
          TWinControl(AComponent).Parent:=ComponentsContainer;
    end;
    Вот тут и слабое место т.к. если кто-то создаст свой компонент при помощи конструктора с параметром nil, а потом назначит мой компонент Parent'ом, то получит совсем неблаговидную картину, когда его компонент будет лежать на панели (1). Если кто знает, как обойти это, или вообще другое решение сей задачи, поделитесь мыслями пожалуйста
     
    #2 xophet, 1 Aug 2013
    Last edited: 1 Aug 2013