Форум: "KOL";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "KOL";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c