По сути, это вопрос производительности. Потенциально возможны и другие «плохие» побочные эффекты, которые могут возникнуть и в процессе потоковой передачи. Вещи находятся в "середине конструкции", и все, что обычно ожидается, там, вероятно, нет.
Когда вы ссылаетесь на свойство «Дескриптор», это инициирует процесс создания дескриптора. Это потому, что чтение Handle на самом деле вызывает GetHandle. Сделайте это слишком рано в процессе потоковой передачи, и вы можете в лучшем случае снизить производительность потоковой передачи, а в худшем - частично сконфигурированный «дескриптор».
Если вам нужно правильно обратиться к дескриптору из установщика свойств, вам следует проверить, был ли создан дескриптор, путем проверки HandleAllocated, и только тогда вы ссылаетесь на него. Если вам нужно было внести некоторые изменения флага в дескриптор, например, вызвать SetWindowLong () или что-то еще, вы должны «кэшировать» это состояние в экземпляре компонента, а затем переопределить CreateWnd и применить эти настройки в этой точке. Другой вариант - отложить весь доступ к дескриптору во время потоковой передачи (если тогда csLoading в ComponentState) до вызова виртуального метода Loaded.
Наконец, вам нужно знать о случаях, когда ваш дескриптор может потребоваться воссоздать. Это может произойти, если окружающая форма или дескриптор родительского компонента проходит процесс воссоздания. Вплоть до более поздних выпусков Windows единственным способом изменения некоторых флагов окна было уничтожение дескриптора и воссоздание с новыми флагами в вызове CreateWindowEx (). Есть много компонентов, которые все еще делают это. Вы знаете, находитесь ли вы в ситуации воссоздания, проверяя (csRecreating в ControlState).
Так что, чтобы напрямую ответить на ваш вопрос, лучше всего переопределить CreateWnd и выполнить свою работу там. CreateWnd будет вызываться только тогда, когда будет создан дескриптор. Правильно спроектированный компонент должен получить только один вызов CreateWnd прямо перед его отображением.