2013-02-21 63 views
7

डेल्फी XE2, Win64 का उपयोग कर खोला गया।हेल्पफ़ाइल मॉडल विंडो से उत्तरदायी

तो मेरे पास कई रूपों के साथ एक बड़ा एप्लीकेशन है और यदि मैं मुख्य रूप से सहायता फ़ाइल खोलता हूं और एक मोडल विंडो खोलता हूं और फिर मोडल विंडो पर संदर्भ-संवेदनशील सहायता को बंद करने के लिए F1 दबाता हूं तो सहायता फ़ाइल विंडो के साथ दिखाता है सही जानकारी लेकिन जब तक मैं मोडल विंडो बंद नहीं करता तब तक सहायता फ़ाइल बंद नहीं की जा सकती है। यदि मैं मोडल विंडो बंद होने तक एप्लिकेशन पर वापस जाता हूं तो मैं फिर से फ़ोकस करने के लिए सहायता फ़ाइल भी प्राप्त नहीं कर सकता।

इस सटीक ही मदद हमारे आवेदन (डेल्फी 6 के साथ बनाया गया) के पुराने संस्करण से फ़ाइल कॉलिंग (डेल्फी XE2 के साथ बनाया) मदद फ़ाइल प्रदर्शित करता है नए संस्करण के रूप में ही फ़ोल्डर के भीतर बैठे जब F1 कुंजी मारा जाता है मोडल विंडो से और उत्तरदायी है और मुझे उम्मीद की तरह बंद किया जा सकता है।

सहायता फ़ाइल .chm प्रकार फ़ाइल है।

संक्षेप में। द्वारा आवेदन और मोडल विंडो से आवेदन लॉन्च मदद में खुला मोडल विंडो के लिए F1 कूद

लॉन्च आवेदन ओपन मदद फ़ाइल एफ 1 मदद फ़ाइल खिड़की से टकराने के द्वारा बंद कर दिया नहीं किया जा सकता जब तक मैं अपने आवेदन करने के लिए वापस कूद और मोडल विंडो को बंद ।

क्या किसी के पास कोई विचार है कि यह क्यों होगा?

मैंने इंटरनेट की खोज की है और मुझे कोई भी समस्या नहीं मिली है।

हम स्टंप हो गए हैं।

चीयर्स टीजे

---- संपादित ----

यहाँ वह भी यह व्यवहार दिखाता एक नमूना दो प्रपत्र अनुप्रयोग के लिए कुछ कोड है।

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses Unit2; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Form2 := TForm2.Create(Application); 
    try 
    Form2.ShowModal; 
    finally 
    Form2.Free; 
    end; 
end; 

end. 

मैं अपने मदद फ़ाइल के भीतर दो वैध संदर्भों को दो रूपों पर helpcontext गुण सेट:

program Project1; 

uses 
    Vcl.Forms, 
    HTMLHelpViewer, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Unit2 in 'Unit2.pas' {Form2}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.HelpFile := 'C:\helpfile.chm'; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

यहाँ Form1 कोड है।

एप्लिकेशन चलाएं - मदद फ़ाइल को खोलने के लिए हिट बटन F1 तो Form2 बनाया है और एफ 1 से पता चला मदद फ़ाइल जब तक मैं Form2 बंद नहीं पास मदद फ़ाइल कर सकते हैं कॉल करने के लिए कर रहा है।

उम्मीद है कि इससे मदद मिलती है। - टीजे

+0

क्या यह winhlp64 या 32 बिट संस्करण को फायर कर रहा है? –

+0

@ टोनी न तो। यह एक .chm है। यह chm ocx घटक के साथ प्रक्रिया में होगा। –

+0

@ डेविड हेफरन - पॉपअपपेंट को स्पष्ट रूप से सेट करना या इसका कोई स्पष्ट प्रभाव नहीं है। आपको मदद करने की क्या ज़रूरत है? यह एक साधारण, दो फॉर्म टेस्ट ऐप के साथ भी होता है। –

उत्तर

9

यह HtmlHelpViewer में एक गंभीर डिजाइन दोष है। और आपके द्वारा वर्णित व्यवहार को पुन: उत्पन्न करना आसान है। समस्या को स्पष्ट रूप से निर्दिष्ट करने के लिए किया गया है। यह मुद्दा 32 और 64 बिट दोनों कार्यक्रमों को समान रूप से प्रभावित करता है।

व्यक्तिगत रूप से मैं HtmlHelpViewer का उपयोग नहीं करता क्योंकि यह अभी काम नहीं करता है। मैं TApplication.OnHelp के लिए एक हैंडलर लागू करता हूं।एक कक्षा में है कि में

class function THelpWindowManager.ApplicationHelp(Command: Word; 
    Data: THelpEventData; var CallHelp: Boolean): Boolean; 
begin 
    CallHelp := False; 
    Result := True; 
    //argh, WinHelp commands 
    case Command of 
    HELP_CONTEXT,HELP_CONTEXTPOPUP: 
    HtmlHelp(GetDesktopWindow, Application.HelpFile, HH_HELP_CONTEXT, Data); 
    end; 
end; 

रख दिया और Application.OnHelp करने के लिए इसे स्टार्टअप पर आवंटित:: यह इस तरह दिखता है

Application.OnHelp := THelpWindowManager.ApplicationHelp; 

मैं सिर्फ इतना है कि बाहर परीक्षण किया है तुच्छ दो प्रपत्र आवेदन पर और यह अच्छी तरह से काम करता है । असली कोड में आप इसे सजा सकते हैं। उदाहरण के लिए, मेरा वास्तविक कोड अधिक जटिल है। यह उपयोगकर्ता सेटिंग में स्टोर विंडो की स्थिति और विंडो स्थिति को बंद होने पर स्टोर करता है। और फिर फिर दिखाए जाने पर, उस स्थिति और विंडो स्थिति को पुनर्स्थापित कर दिया जाता है। ताकि सहायता विंडो याद रखे कि यह आखिरी बार स्क्रीन पर था।


@Sertac के लिए धन्यवाद नीचे दी गई टिप्पणियों में विवरण को ड्रेज करने के लिए धन्यवाद। सारांश में यहाँ है, जहाँ HtmlHelpViewer कोड गलत हो जाता है:

  1. यह बनाता है मदद सिस्टम प्रारंभ होने पर HH_INITIALIZE आदेश भेजता है।
  2. जैसा कि documentation में वर्णित है यह एक माध्यमिक थ्रेड के बजाय कॉलिंग एप्लिकेशन के समान थ्रेड पर चलाने के लिए HTML सहायता कॉन्फ़िगर करता है।
  3. जब आप ShowModal पर कॉल करते हैं जो DisableTaskWindows पर कॉल करता है जो कॉलिंग थ्रेड में विंडो अक्षम करता है।
  4. क्योंकि सहायता दर्शक विंडो आपके ऐप के मुख्य थ्रेड द्वारा बनाई गई थी (HH_INITIALIZE कमांड के कारण), यह अक्षम हो जाता है।

और यही कारण है कि आप एक पूर्व-मौजूदा सहायता विंडो से बातचीत नहीं कर सकते हैं जबकि डेल्फी मोडल फॉर्म सक्रिय है।

+0

यदि आप डेस्कटॉप विंडो की बजाय अपने मुख्य फ़ॉर्म के हैंडल को पास करते हैं तो यह कैसा व्यवहार करता है? –

+1

@Sertac खैर, मुझे उम्मीद है कि विंडो स्वामित्व की समस्याएं होंगी जब मोडल विंडो अपने मालिक को अक्षम करेगी। लेकिन नहीं, यह भी ठीक है। 'HtmlHelpViewer' भाग उड़ाता है। –

+0

यह तब +1 है, क्योंकि अगर आपको फॉर्म के हैंडल को पास करने की आवश्यकता है तो यह रास्ते में नहीं मिलेगा। बीटीडब्लू, मुझे लगता है कि यह ShowModal अक्षम टास्क विंडो के माध्यम से थ्रेड विंडो अक्षम कर रहा है। –