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

Вниз

Applet.AttachProc(xxx)   Найти похожие ветки 

 
BaRToV   (2003-05-19 01:33) [0]

Вот у нас есть:

function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result := False;

if Msg.message = WM_XXX then
Result := True;

end;

где-то в дргом модуле:...

function WndProc(Ctl: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
begin
Result := False;

if Msg.message = WM_XXX then
begin
( WndProc)
Вот у нас есть:

function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result := False;

if Msg.message = WM_XXX then
Result := True;

end;

где-то в дргом модуле:...

function WndProc(Ctl: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
begin
Result := False;

if Msg.message = WM_XXX then
begin
...
end;
end;

...

Applet.AttachProc(WndProc);

Так вот, как сделать, чтоб при
if Msg.message = WM_XXX then
Result := True;


сообщение доходило до WndProc?!...


 
BaRToV   (2003-05-19 12:10) [1]

Если можно примерчик...


 
mdw ©   (2003-05-19 13:56) [2]

Я так думаю, что не как. Смотри

function TControl.WndProc( var Msg: TMsg ): Integer;
.....
Первым вызывается Applet.OnMessage
if not (AppletRunning and (Applet <> @Self) and Assigned( Applet ) and
Assigned( Applet.OnMessage ) and Applet.OnMessage( Msg, Result )) then
Далее, если не обработано Applet"ом, OnMessage контрола
if not (Assigned( OnMessage ) and OnMessage( Msg, Result )) then
Далее, если не обработано контролом, "приатаченные" WinProc"ы
if not fOnDynHandlers( @Self, Msg, Result ) then
...

Так что, при Applet.AttachProc(WndProc), WndProc будет вызываться, полюбому после, OnMessage.

Вариант: назначать Applet.OnMessage (запомнить старый), а после обработки, вызывать уже реальный Applet.OnMessage (который запомнил), если он есть.

А вообще, я думаю все это не к чему. Если человек, хочет обрабатать собщение WM_XXX - пусть обрабатывает.
Я так понял разговор про BAPDriveBox и WM_DEVICECHANGE?
Не парься, если и грохнет кто-то сообщение - его проблеммы.
При написании программ тоже головой думать надо... :))))))



 
BaRToV   (2003-05-19 15:54) [3]

> > Не парься, если и грохнет кто-то сообщение - его проблеммы.
Да, так вся M$ сделанна, но хочется как лучше!!!

> Я так понял разговор про BAPDriveBox и WM_DEVICECHANGE?
От части да и + еще, но потом увидишь... ;-)

Проблема такая, есть TObj, мы цепляем к Applet.AttachProc(WndProc), но если в обработчике Аплета сделает Result := True, то сообщение не дойдет (веренне больше не куда не пойдет).

Надо как-то через
function WndFunc( W: HWnd; Msg: Cardinal; wParam, lParam: Integer ): Integer; stdcall;

Но я не знаю, мне бы примерчик толковый...


 
mdw ©   (2003-05-19 17:43) [4]

>> Аплета сделает Result := True, то сообщение не дойдет (веренне больше не куда не пойдет).
Вот и я о том же. Applet.OnMessage всегда первым вызывается, и если Result := True, то понятно...:((.

Я вижу один вариант. Выше писал. При создании своего объекта назначаешь Applet.OnMessage. В результате все собщения пойдут через этот объект. Ну а дальше, или вызываешь первоначальный Applet.OnMessage (оно вроде в начале инициализируется и к моменту создания объекта будет назначено, хотя что будет в следующих версиях KOL?), или сам обрабатываешь.

Ну или смотри SetWindowsHookEx. Хотя это, по моему еще хуже.



 
mike.dld ©   (2003-05-21 02:20) [5]

А может можно написать так:

if Msg.message = WM_XXX then begin
( Msg) [5]
А может можно написать так:

if Msg.message = WM_XXX then begin
Clt.WndProc(Msg);
Result := True;
end;

, то есть напрямую...


 
BaRToV   (2003-05-21 03:20) [6]

Значит так, после пару тестов вот что мы получаем:
Забиваем на AttachProc и делаем "дедовским" методом

function WndProcXXX(Wnd: HWnd; Msg: Cardinal; wParam, lParam: Integer): Integer; stdcall;
begin
...
Result := CallWindowProc(Pointer(OldWnd), Wnd, Msg, wParam, lParam);
...
end;

begin
OldWnd := GetWindowLong(Sender.Handle, GWL_WNDPROC);
SetWindowLong(Sender.Handle, GWL_WNDPROC, LongInt(@WndProcXXX));
end;

... вот что получается:
GWL_WNDPROC - Sets a new address for the window procedure.

Значит кто-то другой (в другом комопненте) делает как я и получается СТЭК снова?!!!!...
И может перекрыть мне "кислород"...
Так или не так?...


 
BaRToV   (2003-05-21 03:41) [7]

2 mike.dld ©
> if Msg.message = WM_XXX then begin

В том-то и проблема, что WM_XXX и не дайдет до нас... и проверять нечего...


 
Gandalf ©   (2003-05-21 09:20) [8]


> Значит кто-то другой (в другом комопненте) делает как я
> и получается СТЭК снова?!!!!...
> И может перекрыть мне "кислород"...
> Так или не так?...


Так, стек он и в африке стек, просто иначе реализован.Надо договорится чтобы все кто так делал вызвывали прошлые обработкичи (получится сквозная система), но сделать это принудительно нельзя. Т.е. если кто захочет, забудет, не сможет - то твой новый WndProc забъет и глазом не моргнет.


 
BaRToV   (2003-05-21 12:13) [9]

А если использовать AllocateHWnd?...
Что это нам даст...

Короче, кто какой видит выход?...


 
mdw ©   (2003-05-21 12:42) [10]

Блин, народ, с чего начали к тому и пришли:))) Windows основана на сообщениях их обработке. Только обрабатывать их грамотно надо. Одно дело, если сообщение WM_XXX посылалось для твоего контрола, то его нужно убить, а если не уверен - нефиг трогать.

2 BaRToV
Саш, ты, по моему, не туда ... Защита от "дурака", это конечно хорошо, но в разумных пределах. А если каждый компонент будет ее иметь? И все будут друг у друга перехватывать управление?
Опять же, при разработке программ, их обычно тестируют:) И если кто-то другой перекрывает тебе "кислород"..., то или отказываться от кого-то другого..., или править ошибку, тем более, что все приKOLисты:) сюда периодически заглядывают.

И еще. Хорошо, проблему с сообщениями ты решишь. Но где гарантия, что я в своем компоненте, не выкину какую-то гадость (с памятью например), которая приведет к краху всего приложения, а то и системы. Что будешь свой менеджер памяти писать? А может сразу уж ОС? Не обижайтесь если что. А то я сегодня злобный что-то:)))


 
BaRToV   (2003-05-21 13:02) [11]

2 mdw ©
> Не обижайтесь если что. А то я сегодня злобный что-то:)))
Дим, я никогда не обижаюсь ;-)
Мне интересно любое мнение, на то он и форум. В каждом ответе есть "ДОЛЯ правды", почитав их и подумав - мы делаем выводы, ведь у каждого есть свои наработки, проблемы и их решение. И каждый делится ими - а это самое главное!!!

> А то я сегодня злобный что-то:)))
Для приКОЛистов есть быстрый способ развесилится:
1. Напиши прогу на VCL и посмотри рамер EXE"шника.
2. Если это не помогло, компилини с bpl"ками и дай эту прогу другу ;-)

> Хорошо, проблему с сообщениями ты решишь.
Давайте тогда обсудим тему как и что где перекрывать, чтоб не было проблем...


 
mdw ©   (2003-05-21 13:47) [12]

>Давайте тогда обсудим тему как и что где перекрывать, чтоб не было проблем...
Просто нужно руководствоваться здравым смыслом. Если сообщение приходит непосредственно контролу, то он его и обрабатывает. А если добавляешь обработчик, к чему-то, то нужно пропускать сообщение дальше.


 
Gandalf ©   (2003-05-21 14:47) [13]


> Давайте тогда обсудим тему как и что где перекрывать, чтоб
> не было проблем...


Давай. В чем задача? Т.е. что нужно. Насчет того что ты хотел раньше, ты хочешь прицепить обработчик который -"обрабатывается всегда плюя на все и всех", а если еще кто хочет? Конфликт. Поскольку всегда надо вернуть Result и Rslt, должен быть кто-то приоритетнее, который их и ставит, потому как если у тебя два равных обрабочкика возвращают разные значения - что будем делать? В данном случаи приоритет задатся по принципу - "кто последний". Просто надо писать в коментариях - WM_XXX ни-ни! Есть еще идеи?


 
BaRToV   (2003-05-21 15:50) [14]

> Поскольку всегда надо вернуть Result и Rslt, должен быть кто-то приоритетнее,
Хм... Не зрая, наверноее, Кладов сделал главным Applet, чтб иметь полный доступ ко всему "доченрему"...

> Просто надо писать в коментариях - WM_XXX ни-ни!
Вот, вот. Так что, кто пишит комопнеты:
1. Не перекрывать сообщения, чтоб и другие могли их "помучать".
2. Описывать константы (пример):
( "xxx") [14] > Поскольку всегда надо вернуть Result и Rslt, должен быть кто-то приоритетнее,
Хм... Не зрая, наверноее, Кладов сделал главным Applet, чтб иметь полный доступ ко всему "доченрему"...

> Просто надо писать в коментариях - WM_XXX ни-ни!
Вот, вот. Так что, кто пишит комопнеты:
1. Не перекрывать сообщения, чтоб и другие могли их "помучать".
2. Описывать константы (пример):
WM_BAP_xxx = WM_USER + 1024;

Если не описать, то кто-то может сделать
WM_MY_GOD = WM_USER + 1024;
и получается, что WM_BAP_xxx = WM_MY_GOD;
А вот если, так кто-то сделает, то ... лучше не делать.

А если воспользоваться:
WM_xxx := RegisterWindowMessage("xxx");
То и проблемы с константами пропадут?!...



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

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

Наверх




Память: 0.52 MB
Время: 0.021 c
6-16567
NikeOLD
2003-11-29 14:02
2004.02.06
Как программно разорвать удаленный диал-ап?


3-16155
Александр
2004-01-16 13:32
2004.02.06
Посоветуйте компонент!


4-16836
Sergious
2003-12-01 12:05
2004.02.06
Как перевести монитор в ждущий режим под ХР?


3-16139
Dmitriy Yakovenko
2004-01-15 12:44
2004.02.06
Поле типа INT64 в Delphi7


1-16444
nv
2004-01-27 09:40
2004.02.06
А можно ли из DLLки (типа плагина) получить переменне основной пр