Недавно я устранял сложную ошибку. Это было вызвано доступом к несуществующему Form.Handle
(мусорному указателю). Ошибка обнаружилась довольно неожиданным для меня образом - доступ к формам Handle
вызывал изменение размеров и перерисовку.
Я ожидаю, что доступ к Form.Handle
с помощью указателя мусора просто вернет какой-то мусор THandle. Ожидается, что Handle
создается один раз при создании формы и остается неизменным до тех пор, пока форма не будет уничтожена.
Вопрос
Почему так, что TForm.Handle
не является полем, которое инициализируется при создании формы и доступно через
property Handle: Integer read FHandle;
, но является геттером
property Handle: Integer read GetHandle;
который создает дескриптор и даже окно (CreateWnd
) при первом доступе?
RecreateWnd
и подсчитайте, сколько раз оно вызывается в модуле Forms). сложная ошибка была вызвана тем, что вы неправильно поняли Form.Handle, а не проблемой того, как TForm использует свой дескриптор. :-) - person Ken White   schedule 03.06.2016SetWindowLong
в реальном времениHWND
, но действуют только приCreateWindow
вызове. Итак, VCL владеет дескриптором черезHandleAllocated
,HandleNeeded
,CreateHandle
и т. д. - person Free Consulting   schedule 03.06.2016