2012-06-06 19 views
19

एक वर्ग (TObject) मेरे पास है के साथ:गैर-विंडो वाले वर्गों में कस्टम संदेश - एक डिफ़ॉल्ट हैंडलर की आवश्यकता है?

private 
    FHwnd : HWND; 
    procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE; 

जहां TH_MYMESSAGE = WM_USER + 1

वर्ग निर्माता में:

FHwnd := AllocateHWND(HandleMyMessage); 

केवल वस्तु जो प्राप्त करता है FHwnd के लिए एक संदर्भ के लिए एक निजी रिवाज है TThread (इस वर्ग के भीतर बनाया गया) और यह एकमात्र संदेश है जो TH_MYMESSAGE है। मेरी समझ यह है कि message प्रक्रिया घोषणा में निर्देश केवल TH_MYMESSAGE पर हैंडलिंग को प्रतिबंधित करता है।

यह परीक्षण में ठीक काम कर रहा था, लेकिन एक बड़े आवेदन में एकीकरण पर मुझे प्रतिक्रिया मिल रही है कि HandleMyMessage अन्य संदेशों के साथ भी फ़ायरिंग कर रहा है (स्पष्ट अवांछित परिणामों के साथ)।

HandleMyMessage में इसे आसानी से ठीक किया गया था। मेरा सवाल है: यह क्यों हो रहा है?

मेरे सबसे अच्छा अनुमान है कि AllocateHWNDHandleMyMessage यह message निर्देश होने के बावजूद एक DefWndProc के बराबर कर दिया गया है। क्या मुझे यह लागू करने का कोई सही तरीका है जिसे मैं याद कर रहा हूं?

+4

अपने अनुमान सही है '' HandleMyMessage' हो जाता है गैर दृश्य बनाया WndProc' खिड़की। इसलिए यह सभी संदेशों को प्राप्त करता है; 'Message.Msg' फ़िल्टर करने का आपका समाधान भी सही है। 'संदेश' विधि संशोधक जिसे हम डेल्फी द्वारा डिफॉल्ट हैंडलिंग 'TObject.Dispatch' कॉल (गैर खिड़की वाले वर्गों में) – teran

+0

@teran मानते हैं कि, मैं अन्य संदेशों के लिए एक डिफ़ॉल्ट' WndProc 'चाहता था,' HandleMyMessage' फ़िल्टर ठीक से ' 'संदेश' निर्देश के साथ अगर मैंने कुछ अन्य सामान्य प्रक्रियाओं पर 'AllocateHWND' किया था? –

+0

@Ken यहां WM_USER के साथ कोई समस्या नहीं है। –

उत्तर

13

ठीक है, हाँ। AllocateHWnd बनाई गई विंडो की विंडो प्रक्रिया के रूप में कार्य करने के लिए TWndMethod स्वीकार करता है। मुझे लगता है कि भ्रम, इस कारण है कि संकलक messsage निर्देश स्वीकार करता है। यह न रखें:

private 
    FHwnd : HWND; 
    procedure HandleMyMessage(var Message : TMessage); 

.. 

procedure TMyClass.HandleMyMessage(var Message: TMessage); 
begin 
    case Message.Msg of 
    TH_MYMESSAGE: // 
    end; 
    Message.Result := DefWindowProc(FHWnd, Message.Msg, Message.WParam, Message.LParam); 
end; 


संपादित करें: (रिस्पांस टिप्पणी करने के लिए)। संदेश वर्ग है कि उपयोगिता खिड़की बनाई गई पर संभाला है के लिए, आप कर सकते हैं मार्ग खिड़की AllocateHWnd को अपनी कक्षा में पैदा करता है से अपने संदेश:

private 
    FHwnd : HWND; 
    procedure HandleMyMessage(var Message : TMessage); 
    procedure THMyMessage(var Message: TMessage); message TH_MYMESSAGE; 

.. 

procedure TMyClass.HandleMyMessage(var Message: TMessage); 
begin 
    case Message.Msg of 
    TH_MYMESSAGE: Dispatch(Message); 
    end; 
    Message.Result := DefWindowProc(FHWnd, Message.Msg, Message.WParam, Message.LParam); 
end; 

procedure TMyClass.THMyMessage(var Message: TMessage); 
begin 
    // 
end; 
+1

क्या AllocateHwnd एक विंडो बनाता है जो प्रसारण प्राप्त करता है? इस तरह के लिए मैं केवल एक संदेश, HWND_MESSAGE के लिए एक संदेश की तलाश कर रहा हूँ। –

+1

यह समझ में आता है। प्रश्न का दूसरा भाग: एक ही कक्षा में, एक और प्रक्रिया को परिभाषित किया जा सकता है जिसने मुख्य संदेश से दूर विशिष्ट संदेशों को चलाने के लिए 'संदेश' निर्देश का उपयोग किया था? –

+1

@ डेविड - निश्चित रूप से, लेकिन AllocateHWnd का उपयोग करना इतना आसान है। मेरी प्रणाली किसी भी समय 'TPUtilWindow' से भरी है। –