Когда именно публикуемые свойства назначаются во время выполнения?

У меня есть пользовательский элемент управления, который должен делать некоторые вещи при загрузке во время выполнения на основе опубликованного свойства. Однако я сталкиваюсь с проблемой, когда всякий раз, когда я проверяю опубликованное свойство, оно еще не было установлено и всегда является значением по умолчанию.

Сначала я попытался проверить свойство в конструкторе элемента управления, но быстро обнаружил, что они еще не загружены. Я знаю, что когда элемент управления отображается на экране, свойства устанавливаются правильно, поэтому это не проблема, поскольку свойства вообще не загружаются.

Затем я попытался переопределить Загруженный метод но у меня все та же проблема, поэтому я не думаю, что это именно то, что я ищу.

void __fastcall TFmSearchBar::Loaded()
{
TEdit::Loaded(); //call base class loaded

if( MyProperty )
{
//do stuff
}
}

В какой момент эти опубликованные свойства фактически устанавливаются?

Какой метод можно / нужно подключить, чтобы выполнить некоторую логику в моем элементе управления на основе этих свойств, как только свойства будут установлены правильно?

0

Решение

Если я проверяю свойство в конструкторе элемента управления, это свойство всегда является значением по умолчанию, даже если в конструкторе было указано иное.

Правильно, потому что его значения времени разработки еще не были назначены.

В какой момент эти опубликованные свойства фактически устанавливаются?

Когда владелец (Form, Frame или DataModule) создается. Он загружает собственный ресурс DFM и анализирует его, создавая сохраненные дочерние компоненты и считывая значения их свойств.

Например, скажем, у вас есть следующий DFM:

object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
...
object Edit1: TEdit
Left = 136
Top = 64
Width = 121
Height = 21
TabOrder = 0
end
object Button1: TButton
Left = 263
Top = 62
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
end
end

Процесс потокового DFM грубо переводит в следующий эквивалентный код (для простоты я оставляю много внутренних деталей):

__fastcall TCustomForm::TCustomForm(TComponent *Owner)
: TScrollingWinControl(Owner)
{
this->FFormState << fsCreating;
try
{
// locate, load, and parse the "Form1" DFM resource ...

this->FComponentState << csLoading;
this->Parent = ...;
this->Name = L"Form1":
this->FComponentState << csReading;
this->Left = 0;
this->Top = 0;
this->Caption = L"Form1";
...

TEdit *e = new TEdit(this);
try
{
e->FComponentState << csLoading;
e->Parent = this;
e->Name = L"Edit1"; // <-- sets the derived Form's 'Edit1' member to this object
e->FComponentState << csReading;
e->Left = 136;
e->Top = 64;
e->Width = 121;
e->Height = 21;
e->TabOrder = 0;
e->FComponentState >> csReading;
}
catch (...)
{
delete e;
throw;
}

TButton *b = new TButton(this);
try
{
b->FComponentState << csLoading;
b->Parent = this;
b->Name = L"Button1"; // <-- sets the derived Form's 'Button1' member to this object
b->FComponentState << csReading;
b->Left = 263;
b->Top = 62;
b->Width = 75;
b->Height = 25;
b->Caption = L"Button1";
b->TabOrder = 1;
b->FComponentState >> csReading;
}
catch (...)
{
delete b;
throw;
}

this->FComponentState >> csReading;

...

e->Loaded();
b->Loaded();
this->Loaded();
}
__finally
{
this->FFormState >> fsCreating;
}
}

Итак, как вы можете видеть, значения свойств компонента еще не доступны при вызове его конструктора.

Какой метод можно / нужно подключить, чтобы выполнить некоторую логику в моем элементе управления на основе этих свойств, как только свойства будут установлены правильно?

Это зависит от того, что свойства должны сделать. Если им нужно немедленно выполнить операции, вы можете сделать это непосредственно в их установщиках свойств. Но если им нужно подождать, пока другие свойства не будут загружены первыми (если одно свойство зависит от значения другого свойства), тогда переопределите виртуальный Loaded() вместо этого метод, который автоматически вызывается после завершения потоковой передачи DFM. Установщики свойств могут проверить флаги ComponentState свойство, позволяющее узнать, выполняется ли в данный момент компонент в конструкторе форм во время разработки, используется ли DFM в данный момент для потоковой передачи и т. д., а затем действовать соответствующим образом при необходимости.

Я попытался переопределить метод Loaded, но проблема все еще остается

Что именно, что? Вы не объяснили, в чем ваша проблема. пожалуйста отредактируйте свой вопрос предоставить эти детали.

так что я не думаю, что это именно то, что я ищу.

Скорее всего, вы просто не используете его правильно.

1

Другие решения

Других решений пока нет …