Пользовательский компонент: откладывать события до после FormCreate - PullRequest
0 голосов
/ 30 марта 2019

Я создал компонент, который происходит от TTreeView и автоматически заполняется специализированным контентом. Я добавил свое собственное событие OnSelectionChange. OnSelectionChange вызывается из метода Change (переопределяя метод TTreeView.Change), когда дескриптор был выделен, и ComponentState <> csReading или csLoading.

Проблема заключается в том, что при добавлении компонента в форму событие OnChange происходит ДО FormCreate. Как я могу отложить мои события до того, как все творение произойдет?

Полагаю, я мог бы отправить сообщение компоненту и отреагировать на него, но тогда я хотел бы отправлять сообщения только в состоянии создания. Есть ли лучший способ?

procedure TMyDescendentTreeView.Change(Node: TTreeNode);
begin
  inherited;

  if HandleAllocated and assigned( fOnSelChange) and (not ( csReading in ComponentState ))
    and (not ( csLoading in ComponentState )) then
    fOnSelChange( Self, TXYZ(Node).Data, TXYZ(Node) );
end;

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Просто не назначайте обработчик OnChange для вашего компонента во время разработки. Пусть форма динамически назначит обработчик в коде из события OnCreate, когда оно будет готово:

procedure TMyForm.FormCreate(Sender: TObject);
begin
  //...

  MyTreeView1.OnChange := MyTreeView1Change;

  // optional, call the event now...
  MyTreeView1Change(MyTreeView1, MyTreeView1.Selected);

  //...
end;

procedure TMyForm.MyTreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  //...
end;
0 голосов
/ 02 апреля 2019

ОК, так что спасибо Реми Лебо, который помог мне лучше понять мою проблему. Поскольку мой компонент по умолчанию заполнен содержимым, я отбросил уведомления об изменениях, которые произошли во время первоначального заполнения (что происходит, когда дескриптор становится доступным).

Так что теперь событие изменения выбора больше не происходит во время создания компонента (и, следовательно, до FormCreate).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...