Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
3-37538
Pako
2003-12-16 11:00
2004.01.13
QReport


1-37743
alexnmsk
2003-12-30 09:19
2004.01.13
Изменение размера формы


4-37981
SkyN
2003-11-08 10:55
2004.01.13
---|Ветка была без названия|---


14-37916
Undert
2003-12-20 23:08
2004.01.13
!!! Предложение !!!


1-37759
belyh
2003-12-29 22:03
2004.01.13
QReport





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский