Уважаемые коллеги, помогите разобраться.
Насколько я понял, данный конструктор должен создать контрол и назначить его родителем переданное окно.
Т. е. в приведенном ниже коде на форме должна появиться кнопка
procedure TForm1.FormCreate(Sender: TObject);
begin
with TButton.CreateParented(Self.Handle) do
begin//Parent:=Self;end;
end;
В действительности же кнопка появляется, только если раскоментировать строку.
В чем же тогда смысл CreateParented?
procedure TForm1.FormCreate(Sender: TObject);
begin
with TButton.Create(Self) do
begin
ParentWindow := Self.Handle;
end;
end;
Вообще, CreateParented задуман для работы с не-VCL окнами. Этот конструктор запоминает переданное значение ParentWindow и вызывает Create(nil). Сам контрол при этом на экране не появляется — это происходит позже, в момент создания дескриптора окна, т.е. при прямом или косвенном обращении к свойству Handle.
Странно, сейчас попробовал это в трех вариантах — из конструктора, из FormCreate() и из FormShow(). Дельфи версии 5. Во всех случаях на форме появляется кнопка.
SIG>>Вообще, CreateParented задуман для работы с не-VCL окнами.
G>Да, я это читал, но ведь VCL-формы -- это по большому счету такие же окна (или я ошибаюсь?))
Такие же, но VCL добавляет к ним свою функциональность. При присвоении свойства Parent эта функциональность доступна (с точки зрения системы, Parent.Handle при этом точно так же становится родительским окном контрола, как и при присвоении ParentWindow), а при присвоении ParentWindow — недоступна, взаимодействие ограничено средствами WinAPI. И тут возможны всякие грабли в обработке, например, сообщений от клавиатуры и мыши, поскольку TWinControl передает часть из них Parent (но не ParentWindow!).