Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Создание компонента любого класса в чужом окне


Автор: Grol 13.3.2008, 09:18
Вообщем-то в названии темы отражена вся суть вопроса!

Автор: Alix 13.3.2008, 09:52
Можете привести пример, чего бы Вам хотелось в чужом окне невизуального создать? А то как-то непонятно...

Автор: MetalFan 13.3.2008, 12:16
у невизуального компонента нет родительского окна по определению. разве что компонент-владелец

Автор: Grol 14.3.2008, 07:54
Например, я хочу создать компонент класса TTimer на чужой форме... Возможно ли это сделать?

Автор: Alix 14.3.2008, 08:13
Ну ок, предположим, что можно. Но теперь скажите, чего Вы этим хотите добиться? Зачем таймер помещать на чужую форму? 
Хотя, вообще таймер не имеет родительского окна, как и сказал MetalFan, так что это невозможно.
Если нужно делать по таймеру что-то в другой форме, то поместите таймер на своей.

Автор: Grol 14.3.2008, 08:32
Alix в начале вы говорите можно...а потом нельзя, так все-таки как? Ладно, допустим, мне нужно создать не таймер на чужой форме, а компонент, который будет менять облик формы. И вообще, зачем задатавать лишние вопросы, зачем мне это нужно?...если в этой теме был поставлен конкретный вопрос и на него я хотел бы услышать конкретный ответ! Спасибо всем!

Автор: Alix 14.3.2008, 08:43
Grol, вопросы задаются потому, что часто люди пытаются сделать что-то через зад, а поняв, чего же они хотят добиться, можно подсказать другие пути решения проблемы.

Автор: Grol 14.3.2008, 10:30
Alix вообщем я так понял, что данный вопрос не решаем. Это так?

Автор: Alix 14.3.2008, 10:38
Невизуальные компоненты на чужой форме разместить нельзя. Это так. Потому что они лишь удобная оболочка каких-то функций. Например, TTimer, хотя я его код и не видел, скорее всего работает с функциями WinAPI SetTimer и KillTimer. Сделан же он в виде компонента, который можно кинуть на форму, только затем чтобы сделать это, быстро выставить свойства и написать код обработчика события, а не париться, делая все это вручную с помощью вышеупомянутых функций.

Автор: Snowy 14.3.2008, 15:55
Разместить можно.
Работать не будет.

Автор: Alix 14.3.2008, 15:58
Snowy, и таймер? )

Автор: Snowy 14.3.2008, 16:08
Таймер реализован просто - создаётся окно нулевого размера, единственная задача которого - получать WM_TIMER.
Если окно будет принадлежать другому процессу - сообщение будет получать он, а не мы.
А его это сообщение ну никак не интересует. Он его просто проигнорирует.

Автор: Alix 14.3.2008, 16:41
Цитата
Если окно будет принадлежать другому процессу - сообщение будет получать он, а не мы.

А не окно ли? По-моему окно как получало, так и будет получать сообщения. Вопрос в том, как этот компонент сделать принадлежащим окну другого процесса.

Автор: bems 14.3.2008, 17:39
Цитата(Snowy @  14.3.2008,  16:08 Найти цитируемый пост)
Если окно будет принадлежать другому процессу - сообщение будет получать он, а не мы.
не работает для других процессов.
Наверное ограничили по той причини что WM_TIMER вожно использовать с колбэком, отличным от процедуры окна, а в случае с другим процессом это уже инжект

Автор: MetalFan 14.3.2008, 20:42
пусть лучше автор просветит, в чьем процессе он собрался компонент на форму создавать?

Автор: Grol 15.3.2008, 13:05
Хорошо я сейчас поясню зачем мне все это нужно на конкретном примере: В своем приложении создаю стандартное окно "О программе" (далее буду называть его FormAbout):
Код

ShellAbout(Form1.Handle,
          'Название программы',
          'Авторские права'+#13#10+'Авторские права',
           Application.Icon.Handle);

С помощью функции FindWindow узнаю дескриптор FormAbout:
Код

var
  hForm: HWND;
...
hForm:=FindWindow(nil, 'О программе "Название программы"');

У меня есть компоненты, которые преображают любую форму, BusinessSkinForm. Этот компонент можно создать на любой форме, указав владельца AOwner этого компонента:
Код

var
  BS:   TbsBusinessSkinForm;
...
BS:=TbsBusinessSkinForm.Create(AOwner);

И тут, у меня возникает сложность, как дескриптор FormAbout hForm превратить в AOwner класса TComponent. Возможно ли с помощью каких-нибудь методов обратиться к форме FormAbout, как к визуальному компоненту, зная только его дескриптор? ( hForm ---> AOwner )

Автор: Rrader 15.3.2008, 13:13
Grol, то, что ты задумал, невозможно smile 

Автор: Grol 15.3.2008, 13:26
Жаль...я считал, что в программировании нет ничего невозможного!

Автор: bems 17.3.2008, 17:47
Цитата(Grol @  15.3.2008,  13:05 Найти цитируемый пост)
И тут, у меня возникает сложность, как дескриптор FormAbout hForm превратить в AOwner класса TComponent. 
Его не существует, т.к. ShellAbout не пользуется VCL и ничего не знает о существовании класса TComponent.

Сделай свою About

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)