Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
ВнизКак узнать HANDLE окна, на форме которого находится компонент. Найти похожие ветки
← →
Очень злой (2011-10-23 20:36) [0]Хочу написать класс, наследник TComponent, в котором придется использовать сообщения Windows. Как мне узнать Handle окна?
и еще вопрос есть. Допустим, я написал компонент, где используются сообщения Windows. Если компонент должен посылать сообщения самому себе, то получается что в нем должен быть обработчик соответствующего сообщения, ну и если идентификатор сообщения определен так:
const MY_WM_MESSAGE = WM_USER + 1;
то получается что 2 и более экземпляра такого компонента, помещенные на одну форму будут неправильно работать?
Так? Или я неправильно думаю?
← →
Wnd (2011-10-23 21:35) [1]Как узнать HANDLE окна, на форме которого находится компонент
Если бросить компонент на форму в Design Time, то Onwer"ом компонента будет непосредственно форма. У формы есть свойство Handle. То есть, в общем случае, код будет выглядеть приблизительно так:
if Owner <> nil then
H := (Owner as TCustomForm).Handle
else
H := 0;
>> Хочу написать класс, наследник TComponent, в котором придется использовать сообщения Windows. Как мне узнать Handle окна?
TComponent не имеет окна. Windows вообще ничего не знает про TComponent. TComponent - это класс Delphi.
>> Допустим, я написал компонент, где используются сообщения Windows.
Вот когда напишите, тогда и будем "допускать". Причем - по ужЕ написанному коду. А пока допускать не получится, потому что никто не знает, что вы там собираетесь написать.
>> Или я неправильно думаю?
Очень похоже на то, что у вас нет понимания взаимоотношения компонентов и форм. Сообщение, отправленное форме, придет только к форме. Ваш компонент вообще ничего не получит. Чтобы компонент получал сообщения, необходимо, чтобы сам компонент был окном. То есть, вам надо не наследник TComponent, а, например, наследник TWinControl.
Или посмотрите исходный код класса TTimer. Там создается скрытое окно, которое и работает с сообщениями.
>> то получается что 2 и более экземпляра такого компонента, помещенные на одну форму будут неправильно работать?
Повторюсь: как напишете, так оно и будет работать. В самом простом случае, чтобы не было путаницы, каждый экземпляр вашего класса должен иметь собственное окно.
Или, если вы собираетесь использовать форму как "посредник" при передаче сообщений, то можно сделать собственный диспетчеризатор сообщений, получаемых формой, который будет определять, какому конкретно экземпляру вашего класса послено сообщение на основании, например, параметра, передаваемого в WParam или LParam.
Еще вариант - использовать метод TObject.Dispatch(). Но это не "окно" и не Windows. Опять же таки, не совсем понятно, что вы имеете в виду, говоря "послать сообщение" - SendMessage() или PostMessage(). Если первое, то его можно попробовать заменить на Dispatch(), получив очень похожий результат. С некоторыми оговорками.
P.S. Каков вопрос, таков ответ...
← →
Очень злой (2011-10-23 21:54) [2]
> Еще вариант - использовать метод TObject.Dispatch(). Но
> это не "окно" и не Windows. Опять же таки, не совсем понятно,
> что вы имеете в виду, говоря "послать сообщение" - SendMessage()
> или PostMessage(). Если первое, то его можно попробовать
> заменить на Dispatch(), получив очень похожий результат.
> С некоторыми оговорками.
Ну в моем случае генерацию сообщений должна выполнять функция WSAAsyncSelect, но проблема возникла в том, что на простых примерах, работающих с формой все понятно, а вот с тем как реализовать то, что я задумал в виде компонента возникли трудности именно из-за этого:
> Очень похоже на то, что у вас нет понимания взаимоотношения
> компонентов и форм.
> Или посмотрите исходный код класса TTimer. Там создается
> скрытое окно, которое и работает с сообщениями.
Спасибо. Сейчас гляну...
← →
Virgo_Style © (2011-10-23 22:46) [3]А почему owner, а не parent?
← →
Юрий Зотов © (2011-10-23 23:02) [4]> Virgo_Style © (23.10.11 22:46) [3]
Потому что автор хотел наследоваться от TComponent, у которого нет parent"а.
> Сабж
Непонятно, зачем Вам форма. Наследуйте Ваш компонент от TWinControl (у которого уже есть свое собственное окно), либо делайте аналог TTimer.
← →
Германн © (2011-10-24 00:21) [5]
> Потому что автор хотел наследоваться от TComponent, у которого
> нет parent"а.
Очередной пример бессмертной саги о X,Y,Z.
← →
Dimka Maslov © (2011-10-24 09:54) [6]Есть такая чудесная-расчудесная функция AllocateHWND, которая умеет любому объекту, унаследованному от TObject, придать оконную функцию. Пример использования оной - компонент TTimer.
← →
Очень Злой (2011-10-24 14:10) [7]
> Непонятно, зачем Вам форма.
Да просто у меня были изначально неверные представления. Почему-то считал, что компоненты помещенные на форму используют отонную функцию самой формы...
> либо делайте аналог TTimer.
> Dimka Maslov © (24.10.11 09:54) [6]
>
> Есть такая чудесная-расчудесная функция AllocateHWND, которая
> умеет любому объекту, унаследованному от TObject, придать
> оконную функцию. Пример использования оной - компонент TTimer.
>
Уже понял...
Спасибо...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c