2012-04-02 7 views
6

को छोड़कर सबकुछ काम करता है मैं अपने सॉफ़्टवेयर के साथ helpfile सेटअप प्राप्त करने पर काम कर रहा हूं। मैंने कई विशिष्ट रूपों/फ्रेम/नियंत्रणों के लिए हेल्पकॉन्टेक्स्ट संख्याएं जोड़ दी हैं और वे सभी ठीक काम करते हैं। समस्या यह है कि मुख्य रूप कोई मदद नहीं ला रहा है। इस सब के लिए मैं केवल सहायता को ट्रिगर करने के लिए F1 का उपयोग कर रहा हूं।डेल्फी XE2 एप्लिकेशन में हेल्पफ़ाइल को लिंक करना - मुख्य रूप से

मैं डेल्फी या हेल्पफाइल पर एक विशेषज्ञ नहीं हूं, लेकिन मैंने जो किया है उसे पोस्ट करूंगा और जहां मैंने देखा है।

संपादित करें: कुछ मदद के लिए धन्यवाद, अब मुझे लगता है कि यह मुद्दा मुख्य रूप से एमडीआई माता-पिता होने के कारण है। यह अभी भी समस्या का समाधान नहीं करता है .. यह लगभग मेरे लिए एक बग जैसा लगता है लेकिन मुझे लगता है कि यह किसी कारण से जानबूझकर हो सकता है। एंडएडिट

मैं इस इकाई को शामिल कर रहा हूं: दर्शक के लिए HtmlHelpViewer। मुख्य रूपों में कन्स्ट्रक्टर बनाएं मैंने एप्लिकेशन जोड़ा है। हेल्पफाइल: = 'asdf.chm'। अन्य सभी रूपों के लिए मैंने अभी संदर्भ संख्याएं जोड़ दी हैं और यह तुरंत काम कर चुकी है। मैंने मुख्य रूप पर कोशिश की और कुछ भी नहीं हुआ। तो मैंने एक एप्लीकेशन जोड़ने की कोशिश की। ऑनहेल्प घटना लेकिन इसे मुख्य रूप में नहीं कहा जाता है (और यह उन सभी अन्य रूपों के लिए करता है जहां सहायता काम कर रही है)।

अंतिम उपाय जो मैं सोच सकता था कि कोड में गहराई से पता लगाना था और क्या हो रहा था। मुझे Vcl.Forms में TCustomForm.WMHelp मिल गया था जहां विभाजन हो रहा था। कहा समारोह इस लूप है:

if iContextType = HELPINFO_WINDOW then 
begin 
    Control := FindControl(hItemHandle); 
    while (Control <> nil) and (not ControlHasHelp(Control)) do 
    Control := Control.Parent; 
    if Control = nil then Exit; 
    GetHelpInfo(Control, HType, ContextID, Keyword); 
    Pt := Control.ClientToScreen(Point(0, 0)); 
end 

जब मुख्य रूप बुला रहा था सहायता नियंत्रण नहीं के बराबर होगा और फिर इसे बाहर आ जाएंगे। कुछ और ठीक हो जाएगा।

मुझे स्पष्ट रूप से नहीं पता कि यह क्यों हो रहा है। जवाब कुछ बहुत बुनियादी हो सकता है। किसी भी सुझाव की सराहना की जाएगी!

+0

क्या आपने मुख्य फॉर्म के लिए 'हेल्पकॉन्टेक्स्ट' सेट किया था? –

+0

@ डेविड हेफरन: हाँ मैंने किया। मुझे इसका उल्लेख करना चाहिए था, लेकिन यह सिर्फ मुख्य रूप है, न कि इसके बच्चे। मैंने फॉर्म पर एक बटन डाला (बिना संदर्भ सहायता के) और जब यह फोकस करता है और मैं मुख्य रूप लोड के लिए F1 को helpcontext दबाता हूं। यदि कोई फोकस नहीं है तो कोई मदद लोड नहीं होती है। – Sentient

+0

मैं डीबगर के तहत WMHelp हैंडलर पर एक नज़र डालें और देखें कि FindControl से क्या लौटाया गया है। –

उत्तर

6

आपकी टिप्पणियों के मुताबिक, WM_HELP संदेश आपके एमडीआई क्लाइंट विंडो पर लक्षित किया जा रहा है। और चूंकि यह वीसीएल नियंत्रण नहीं है, यह WM_HELP संदेश का जवाब नहीं देता है। आप संदेश में अवरोध डालने और इसे संभाल करने के लिए मुख्य रूप पूछकर समस्या से निपटने कर सकते हैं:

type 
    TMainForm = class(TForm) 
    protected 
    procedure WMHelp(var Message: TWMHelp); message WM_HELP; 
    end; 
.... 
procedure TMainForm.WMHelp(var Message: TWMHelp); 
begin 
    if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (Message.HelpInfo.hItemHandle=ClientHandle) then 
    Message.HelpInfo.hItemHandle := Handle; 
    inherited; 
end; 

आप और भी अधिक रक्षात्मक होना चाहते हैं आप इसे इस प्रकार लिख सकते हैं:

if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (FindControl(Message.HelpInfo.hItemHandle)=nil) then 
    Message.HelpInfo.hItemHandle := Handle; 

मैं मैंने अभी अपना खुद का एमडीआई आवेदन देखा है और मैं देख सकता हूं कि इस सटीक मुद्दे से निपटने के लिए मेरे पास समान कोड है। अगर इसे 10 साल पहले लिखा नहीं गया था तो शायद मुझे याद होगा!

+0

बहुत बढ़िया, आपकी सभी मदद के लिए बहुत बहुत धन्यवाद! मुझे आपके कोड में एक छोटा सा परिवर्तन करना पड़ा, मैंने जोड़ा: 'संदेश के साथ। हेल्पइन्फो {$ IFNDEF CLR}^{$ ENDIF} do' क्योंकि कंपाइलर को iContextType पसंद नहीं आया, मुझे यह पता चला कि वीसीएल से फोरम्स में डब्लूएमहेल्प था। (और फिर संदेश के बाहर ले लिया। हेल्पइन्फो के दूसरे भाग से।) – Sentient

+0

अच्छा। मदद करने में खुशी हुई। –

संबंधित मुद्दे