CreateParented
От: Goffman Россия  
Дата: 15.09.05 03:50
Оценка:
Уважаемые коллеги, помогите разобраться.
Насколько я понял, данный конструктор должен создать контрол и назначить его родителем переданное окно.
Т. е. в приведенном ниже коде на форме должна появиться кнопка

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TButton.CreateParented(Self.Handle) do
  begin
    //Parent:=Self;
  end;
end;


В действительности же кнопка появляется, только если раскоментировать строку.
В чем же тогда смысл CreateParented?
Re: CreateParented
От: Sergei I. Gorelkin Россия  
Дата: 15.09.05 04:12
Оценка: +1
Здравствуйте, Goffman, Вы писали:

<skipped>
А вот так — появляется?

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TButton.Create(Self) do
  begin
    ParentWindow := Self.Handle;
  end;
end;


Вообще, CreateParented задуман для работы с не-VCL окнами. Этот конструктор запоминает переданное значение ParentWindow и вызывает Create(nil). Сам контрол при этом на экране не появляется — это происходит позже, в момент создания дескриптора окна, т.е. при прямом или косвенном обращении к свойству Handle.
Re[2]: CreateParented
От: Goffman Россия  
Дата: 15.09.05 04:32
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:


SIG>А вот так — появляется?


SIG>
SIG>    ParentWindow := Self.Handle;
SIG>


Нет, так тоже не появляется

SIG>Вообще, CreateParented задуман для работы с не-VCL окнами.


Да, я это читал, но ведь VCL-формы -- это по большому счету такие же окна (или я ошибаюсь?))
Re[3]: CreateParented
От: kavlad Россия http://www.wavesoft.ru
Дата: 15.09.05 07:38
Оценка:
Здравствуйте, Goffman, Вы писали:

SIG>>
SIG>>    ParentWindow := Self.Handle;
SIG>>


G>Нет, так тоже не появляется


    ParentWindow := Self.Handle;
    UpdateWindow(Self.Handle); // Надо обратиться к handle'у  дочернего контрола


G>Да, я это читал, но ведь VCL-формы -- это по большому счету такие же окна (или я ошибаюсь?))


Формы, конечно, окна, а вот скажем TSpeedButton — совсем не окно.
Распознавание изображений на Delphi http://dfreader.sourceforge.net
Re[4]: CreateParented
От: Брухно Геннадий Россия  
Дата: 15.09.05 07:49
Оценка:
Здравствуйте, kavlad, Вы писали:


K>Формы, конечно, окна, а вот скажем TSpeedButton — совсем не окно.


Ну и что, это имеет отношение к вопросу?
Re[3]: CreateParented
От: Sergei I. Gorelkin Россия  
Дата: 15.09.05 10:32
Оценка:
Здравствуйте, Goffman, Вы писали:

<skipped>

G>Нет, так тоже не появляется


Странно, сейчас попробовал это в трех вариантах — из конструктора, из FormCreate() и из FormShow(). Дельфи версии 5. Во всех случаях на форме появляется кнопка.

SIG>>Вообще, CreateParented задуман для работы с не-VCL окнами.


G>Да, я это читал, но ведь VCL-формы -- это по большому счету такие же окна (или я ошибаюсь?))


Такие же, но VCL добавляет к ним свою функциональность. При присвоении свойства Parent эта функциональность доступна (с точки зрения системы, Parent.Handle при этом точно так же становится родительским окном контрола, как и при присвоении ParentWindow), а при присвоении ParentWindow — недоступна, взаимодействие ограничено средствами WinAPI. И тут возможны всякие грабли в обработке, например, сообщений от клавиатуры и мыши, поскольку TWinControl передает часть из них Parent (но не ParentWindow!).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.