Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.13;
Скачать: CL | DM;

Вниз

Как отловить момент создания форм   Найти похожие ветки 

 
Silver_ ©   (2003-12-19 12:03) [0]

Как отловить момент создания ВСЕХ/ЛЮБОЙ форм/ы в моем приложении.
Какой message ловить надо.


 
Семен Сорокин ©   (2003-12-19 12:06) [1]

Наследуй все формы твоего приложения от одного родителя, и ничего ловить не надо будет.


 
Skier ©   (2003-12-19 12:06) [2]

сделай все свои формы наследником базовой формы, которая и будет
уведомлять "кого-то" о "чём-то"


 
Digitman ©   (2003-12-19 12:20) [3]

все наследники TWinControl при создании окна устанавливают одним из его свойств свойство с именем

ControlOfs.XXXXXXXX.ZZZZZZZZ = Self

где
XXXXXXXX = HInstance
ZZZZZZZZ = CurrentThreadID

т.о., перехватив, нампимер, сообщение WM_CREATE и получив в его обработчике значение св-ва с указанным именем, можно попытаться выполнить его кастинг к TForm, и в случае успеха это будет фактом создания формы, адрес экземпляра которой в тек.адр.пр-ве равен значению полученного св-ва


 
Silver_ ©   (2003-12-19 13:07) [4]


> Digitman © (19.12.03 12:20) [3]

Почти то что хотел, только ловится только момент созданя текушего окна
т.е. тама где стоит месага,

procedure AnyFormCreate(var Msg: TWMCREATE); message WM_CREATE;

а мне надо чтоб в главной форме ловить момент
созданя форм и знать её имя - Всё. Неужеле многого хочю :)


 
Юрий Зотов ©   (2003-12-19 13:20) [5]

> Silver_ © (19.12.03 13:07) [4]
> а мне надо чтоб в главной форме момент созданя форм

Если речь идет об MDI, то посмотрите WM_PARENTNOTIFY.

А вообще-то, никто не мешает из конструктора формы вызвать любой метод Application.MainForm (или послать ей любое сообщение WM_USER + xxx), передав в параметре Self.


 
Silver_ ©   (2003-12-19 13:56) [6]

Поясню подробней

При создании любой формы MDI, не MDI, Modal - любой, должен выполнатся некий код
я могу прописать его в OnCreate ВСЕХ форм но зачем, лучше ловить момет
создания этих форм и выполнять данный код.
Тем более что в проекте могут быть и чужие формы, более того я могу и не иметь
их сырцы, а мой код по любому должен выполнятся и при их создании -
после "OnCreate" до "OnShow" этих форм


 
Юрий Зотов ©   (2003-12-19 14:02) [7]

Можно поставить локальный хук WH_CALLWNDPROC(RET) на WM_CREATE.


 
Семен Сорокин ©   (2003-12-19 14:06) [8]

2Silver_
[7]
или
в Application.OnMessage


 
Digitman ©   (2003-12-19 14:10) [9]

у объекта Application есть событие OnMessage()

через него "проходят" ВСЕ оконные сообщения, адресованные гл.окну приложения и любым другим окнам, созданным в ходе работы приложения

вот в его обрабротчике и отлавливай WM_CREATE
на этот момент InitWndProc() уже хотя бы раз выполнилась и упомянутое выше св-во уже ссылается на экз-р формы (если данное сообщение относится к форме)


 
Digitman ©   (2003-12-19 14:19) [10]

что-то вроде этого :

var
PropName: array[0..31] of Char;
Control: TWinControl

THandle(Control) := GetProp(hWnd, StrFmt(PropName, "ControlOfs%.8X%.8X", [HInstance, GetCurrentThreadID]));
if Assigned(Control) and (Control is TForm) then
создана новая форма


 
Silver_ ©   (2003-12-19 16:10) [11]

Вот так вот сделал и нифига.
В смысле if Msg.message = WM_CREATE then все месаги нормально ловятся
ну а когда "базар" фильтрую нифига. видимо не посылается WM_CREATE или у меня руки...

procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnMessage := AnyFormCreate;
end;

procedure TMainForm.AnyFormCreate(var Msg: TMsg; var Handled: Boolean);
var
PropName: array[0..31] of Char;
Control: TWinControl;
begin
if Msg.message = WM_CREATE then
begin
THandle(Control) := GetProp(Msg.hWnd, StrFmt(PropName, "ControlOfs%.8X%.8X", [HInstance, GetCurrentThreadID]));
if Assigned(Control) and (Control is TForm) then
StatusBar.Panels[0].Text := Control.Name;
end;
end;


 
Digitman ©   (2003-12-19 16:18) [12]


> все месаги нормально ловятся


и в то же время


> видимо не посылается WM_CREATE


это как понять ?

и что есть "базар" ?


 
Silver_ ©   (2003-12-19 16:43) [13]


> > все месаги нормально ловятся

Вобще туда входит но...

> это как понять ?

дальше етого не проходит

> if Msg.message = WM_CREATE then

значит такую месагу не послали


> и что есть "базар" ?

= месаги :)


 
Silver_ ©   (2003-12-22 19:32) [14]

Так и не решил задачу :( или она нерешема :(


 
Silver_ ©   (2003-12-23 15:15) [15]

Аппетит, как известно, приходит во время еды.

Теперь кроме того что выше хочу :) и

Как отловить момент ОСВОБОЖДЕНЯ форм [D6, D7, WinXP]

хотя ожидаю что не получу ответа как на первый вопрос, но всё-же попытаюсь


 
Digitman ©   (2003-12-23 15:59) [16]


> Silver_


читай сюда (фрагмент хэлпа):

Before returning, CreateWindow sends a WM_CREATE message to the window procedure.

сразу наводит на вопрос : ЧЬЯ оконная процедура вызывается в этом случае ?
ответ прост до безобразия : та самая, которая ассоциирована с создаваемым в контексте CreateWindow окном ! Т.е. процедура окна формы, а не процедура гл.окна приложения ... отсюда вывод : Application.OnMessage никогда не поймает WM_CREATE

и следом же - простейший выход из ситуации : установка локального хука на WH_CALLWNDPROCRET


 
Silver_ ©   (2003-12-23 17:36) [17]


> установка локального хука на


Никогда не делал, покажи пример плизззз :))


 
Silver_ ©   (2003-12-25 19:48) [18]


> Digitman © (23.12.03 15:59) [16]


Судя по всему ты это уже делал покажи как, или ссылку где почтать


 
Silver_ ©   (2003-12-26 12:40) [19]


> Digitman © (23.12.03 15:59) [16]


Ты где? Отзовись!!!


 
Digitman ©   (2003-12-26 12:53) [20]


> Silver_


здесь, на сайте, есть статья по хукам ... прочитай внимательно и изучи примеры в ней ... разница с твоей задачей совсем не велика - там демонстрируется механизм установки глоб.хука. тебе же требуется лок.хук (чуть отличаются параметры вызова SetWindowsHookEx)



Страницы: 1 вся ветка

Текущий архив: 2004.01.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
1-37786
aser
2003-12-28 11:31
2004.01.13
Большие числа


8-37803
Rif_yev
2003-09-10 11:06
2004.01.13
Real


14-37847
Gorlum
2003-12-23 12:40
2004.01.13
Мастера, вопрос про OutlookExpress


8-37813
Kubic
2003-09-09 19:31
2004.01.13
Изменение размера картинки и шрифта


1-37791
Alibaba
2003-12-27 02:55
2004.01.13
TDateTimePicker