2009-03-31 14 views
19

मैं मुख्य रूप से फोकस खोए बिना मुख्य फॉर्म के ऊपर दूसरा फॉर्म दिखाने के लिए संघर्ष करता हूं।डेल्फी: सक्रियण के बिना विंडो दिखाएं

मैंने ShowWindow(second.handle, SW_SHOWNOACTIVATE) का प्रयास किया है, लेकिन मुख्य प्रारूप फोकस खो देता है। अगर मैं दूसरी खिड़की पर Visible := false निर्धारित करते हैं, ShowWindow करने के लिए कॉल दूसरा रूप को सक्रिय नहीं है, लेकिन जब से पता चला खिड़कियों खाली है ...

किसी को भी इस के लिए एक अच्छा नुस्खा है?

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

+0

हम ... मेरे संपादन में से एक चला गया है ... मुझे लगता है कि पहले कुछ समस्याएं थीं ...? – Vegar

उत्तर

24

आपके कोड में कुछ गड़बड़ होना है।

मैं इस कोड का परीक्षण किया, यह काम करता है:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE); 
    Form2.Visible := True; 
end; 

Visible, नहीं Show उपयोग करने के लिए सावधान रहें! अन्यथा यह SW_SHOWNOACTIVATE ओवरराइड करेगा।

+0

मुझे खेद है, लेकिन यह अभी भी सक्रिय है :-( – Vegar

+0

मैंने अपना जवाब संशोधित किया और इसका परीक्षण किया :) –

+0

वाह, यह आश्चर्यजनक है :-) चालें डिज़ाइनटाइम पर झूठी दिखने लगती हैं, और इसे सत्य पर सेट करने के बाद दिखाने के लिए कॉल()। धन्यवाद! – Vegar

2

आप विंडो (गैर मोडल) दिखा सकते हैं और फोकस को मुख्यविंडो पर रीसेट कर सकते हैं।

procedure TMainForm.ButtonClick(Sender: TObject); 
begin 
    OtherForm.Show; 
    SetFocus; 
end; 

2006.

इस पर परीक्षण किया गया शीर्ष पर अन्य रूप नहीं दिखाती है। लेकिन यह शीर्ष पर एक खिड़की रखने के लिए बहुत काउंटर सहज है जिसमें फोकस नहीं है।

+0

लेकिन यह घटनाओं और डेटास्टोरेज इत्यादि को ट्रिगर करने के लिए पर्याप्त होगा, और मुझे यह नहीं चाहिए ... – Vegar

+0

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

1

मैं चाहिए अतीत

SetWindowPos(WindowHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE); 

मैं डेल्फी हालांकि के हाल के संस्करणों के साथ इस परीक्षण नहीं किया गया है में इस का उपयोग किया है ...

1

संभव हैं, तो आप टूल टिप के कुछ प्रकार का उपयोग कर विचार अधिसूचना जानकारी प्रदर्शित करने के लिए खिड़की। एक टूल टिप आपके द्वारा प्रदर्शित होने पर मुख्य विंडो से फोकस नहीं करेगा या जब कोई उपयोगकर्ता उस पर क्लिक करेगा। एक नियमित रूप से डिफ़ॉल्ट रूप से सीमा होगी और यदि उपयोगकर्ता उस सीमा पर क्लिक करता है तो आपका मुख्य रूप फोकस खो देगा।

यह करने के लिए यहां कुछ बुनियादी कोड है। जब टिप कहा जाता है तो टिप गायब हो जाती है; हालांकि आप नींद का उपयोग करने से टाइमर सेट करना बेहतर होगा।

with THintWindow.Create(nil) do 
    try 
    ActivateHint(MyRect, 'My Notification'); 
    Sleep(DisplayTime); 
    finally 
    Free; 
    end 
+0

शायद यह जाने का सबसे आसान तरीका है, लेकिन मुझे केवल सरल पाठ से अधिक दिखाने के लिए हिंटविंडो को कस्टमाइज़ करना होगा ... – Vegar

1

यहाँ आप कर रहे हैं:

// you have set your 2nd form as non resizable, without border nor title etc... 
    Form2.Enabled := False; // prevent the 2nd form to grab focus even when clicked 
    SetWindowPos(Form2.Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE); 
    // be sure to hide it automatically when done as it is disabled... 
+0

इससे यह फ़ॉर्म दृश्यमान सेट किए बिना वास्तव में दिखाई देता है? –

1

मैंने पहले भी ऐसा किया, लेकिन क्योंकि यह पिछले काम में मालिकाना था (खेद) मैं कोड नहीं है।

अगर मैं अच्छी तरह से याद है, क्या मैंने किया था:

  1. ग्राहक वर्ग एक से एक प्रक्रिया (या समारोह) कहते हैं कि किसी भी वर्ग (एक पारंपरिक पास्कल विधि) के अंतर्गत आता है नहीं है।
  2. उस विधि से, कक्षा बी में कुछ विधि कॉल करें जो TForm
  3. बी में विधि से, पॉपअप फॉर्म पी का एक उदाहरण बनाएं, लेकिन माता-पिता या स्वामी के साथ; और उदाहरण में एक विधि बुलाओ।
  4. उदाहरण में बुलाए गए तरीके से, स्वयं को दिखाएं।

(चरण 3 की) कोड कुछ इस तरह जा सकते हैं:

var p: TPopupForm; 
begin 
    p := TPopupForm.Create(nil); 
    p.ShowWindow; 
    p.Release; 
end; 

मैं माफी चाहता हूँ अगर यह काम नहीं करता, मैं डेल्फी भी जरूरत नहीं है।

0

डेनियल कोड काम करता है जब तक ...

ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE); 
Form2.Visible := True; 

तक अपने दूसरे रूप गतिशील बनाई गई है। फिर आपका दूसरा फॉर्म डिफ़ॉल्ट चौड़ाई और ऊंचाई के साथ 0,0 स्थिति पर स्थित है।

एक संक्षिप्त पल के लिए जब ShowWindow निष्पादित किया गया है तो आपको स्क्रीन पर दूसरा फॉर्म दिखाई देगा, अगली पंक्ति निष्पादित होने पर गायब हो जाएगी।

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

SetWindowPos(Form2.Handle, HWND_TOP, Left, Top, Width, Height, SWP_NOACTIVATE); 
Form2.Visible := True; 
संबंधित मुद्दे