Форум: "Основная";
Текущий архив: 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.009 c