2010-01-12 24 views
5

पर WM_COMMAND के साथ समस्या मेरे पास मेनमेनू के साथ फ़ॉर्म है और जब मैं मेनू से कमांड आइटम चुनता हूं तो मैं अवरोध करना चाहता हूं। यह डेल्फी में काम करता है:लाज़र/एफपीसी

type 
    TForm1 = class(TForm) 
    ... // Memo and MainMenu created 
    protected 
    procedure WMCommand(var Info: TWMCommand); message WM_COMMAND; 
    end; 


procedure TForm1.WMCommand(var Info: TWMCommand); 
begin 
    if (Info.ItemID < 10) then 
    Memo1.Lines.Add('WMCommand ' + IntToStr(Info.ItemID)); 
end; 

mainmenu में मैं कुछ आइटम जोड़ा गया है और जब मैं मेनू से उन वस्तुओं का चयन तो मेरी Memo1 से भर जाता है:

WMCommand 2 
WMCommand 3 
WMCommand 3 
WMCommand 2 
WMCommand 5 
... 

मैं पांचवें वेतन आयोग/लाजर के लिए इस आवेदन भेजा , लेकिन ऐसा लगता है कि WM_COMMAND हैंडलर नहीं कहा जाता है! जब मैंने डेल्फी में TForm1.WMCommand में ब्रेकपॉइंट सेट किया तो मुख्य रूप से दिखाई देने से पहले डेल्फी कई बार रुक गया। लाजर ने इस ब्रेकपॉइंट पर को कभी नहीं रोका। मुझे लगता है कि लाजर में WM_COMMAND के साथ कुछ टूटा हुआ है, लेकिन हो सकता है कि मुझे कुछ पता न हो। कोई उपाय?

मैं WinXP पर एफपीसी 2.2.4 के साथ लाजर 0.9.28.2 बीटा का उपयोग करता हूं।

संपादित करें:

Winspector का उपयोग करते हुए मैं जाँच की है कि mainmenu उत्पन्न WM_COMMAND:

WM_COMMAND 
    Code: 0 
    Control ID: 2 
    Control HWND: 0x00000000 
    Message Posted 
    Time: 09:37:14.0968 

मुझे लगता है कि WM_COMMAND संदेश विधि से निपटने में लाजर/पांचवें वेतन आयोग में बग है और मैं इसे सूचना: http://bugs.freepascal.org/view.php?id=15521

उत्तर

2

एलसीएल आवेदन में आपके पास निम्न परतें हैं:

  • आवेदन
  • एलसीएल
  • विजेट सेट इंटरफ़ेस (उदा। Win32/win64, क्यूटी, gtk2, कार्बन)
  • विजेट सेट

WM_COMMAND विजेट सेट इंटरफेस परत को widgetset परत से एक WinAPI संदेश है। ये संदेश उच्च परतों को पारित नहीं किए जाते हैं, जिसमें पोर्टेबिलिटी दिमाग में होती है, अन्य विजेट सेट ऐसे संदेश नहीं देते हैं।

यदि आप संदेश कैप्चर करना चाहते हैं, तो आपको गैर पोर्टेबल विजेटसेट विशिष्ट कोड (इस मामले में winapi कोड) लिखना होगा। आप setwindowlong के साथ विंडोप्रोक को ओवरराइड कर सकते हैं। उदाहरण के लिए Lazarus wiki देखें।

+0

क्या यह संभवतः एक बग/अनुपलब्ध सुविधा नहीं है जो LM_COMMAND और CN_COMMAND भी काम नहीं करता है, घटना के पोर्टेबल स्तर पर आईओ कैप्चरिंग संभव नहीं है? –