z klasą (TObject) mam:Niestandardowe wiadomości w klasach bez okien - potrzebujesz domyślnego programu obsługi?
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE;
gdzie TH_MYMESSAGE = WM_USER + 1
W konstruktorze klasy:
FHwnd := AllocateHWND(HandleMyMessage);
Jedynym obiektem, który otrzymuje odniesienie do FHwnd
jest prywatny zwyczaj TThread (utworzone w tej klasie) i jedyny komunikat, który publikuje to TH_MYMESSAGE
. Rozumiem, że dyrektywa message
w deklaracji proceduralnej ogranicza obsługę tylko do TH_MYMESSAGE
.
To działało dobrze podczas testowania, ale po integracji z dużo większą aplikacją otrzymuję informację zwrotną, że HandleMyMessage
wystrzeliwuje również dla innych wiadomości (z oczywistymi niepożądanymi wynikami).
Zostało to łatwo naprawione przez dodanie if Message.Msg <> TH_MYMESSAGE then Exit;
w HandleMyMessage
. Moje pytanie brzmi: dlaczego tak się dzieje?
Domyślam się, że AllocateHWND
dokonał HandleMyMessage
odpowiednika DefWndProc
, mimo że ma dyrektywę message
. Czy istnieje właściwy sposób wdrożenia tego, czego mi brakuje?
Twoje przypuszczenie jest poprawna '' WndProc' HandleMyMessage' staje utworzonych non-wideo okno. więc otrzymuje wszystkie wiadomości; twoje rozwiązanie do filtrowania 'Message.Msg' również jest poprawne. 'modulator modu' message' używany przez Delphi do domyślnej obsługi wywołań 'TObject.Dispatch' (w klasach bez okien) – teran
@teran Zakładając, że chciałbym mieć domyślny" WndProc "dla innych wiadomości, filtr" HandleMyMessage "poprawnie z dyrektywą 'message', jeśli zrobiłem' AllocateHWND' na jakiejś innej ogólnej procedurze? –
@Ken Nie ma problemu z WM_USER tutaj. –