Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.026 c
14-16731
Nikolai_S
2004-01-16 10:07
2004.02.06
Создание автоматического обновления (патча)


14-16720
Kerk
2004-01-15 16:30
2004.02.06
Расширение .sit


3-16144
Bless
2004-01-16 12:48
2004.02.06
Вызов х.п. из х.п. с результатом запроса качестве параметра


1-16286
Chuha
2004-01-25 19:41
2004.02.06
В чем ошибка?


8-16528
Raduga
2003-10-01 11:00
2004.02.06
Как убрать мерцание при перерисовке?





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