Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1282814003
RG
2010-08-26 13:13
2012.01.29
как в сообщение(ShowMessage) вставить список свозможнотью выбора


2-1318866159
Gu
2011-10-17 19:42
2012.01.29
Установка VersionInfo


2-1318575654
Laguna
2011-10-14 11:00
2012.01.29
Добавление в БД и извлечение картинки JPG


15-1318427502
Бездомный
2011-10-12 17:51
2012.01.29
Юморок


2-1318496404
igorium
2011-10-13 13:00
2012.01.29
Как скопировать часть картинки ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский