2012-05-10 12 views
7

मैं XE2 के साथ एक अजीब मुद्दे का सामना करना पड़ा के बाद टॉप पर फार्म रखने के लिए:डेल्फी XE2, कैसे VCL शैलियों को बदलने

मैं SetWindowPos साथ HWND_TOPMOST उपयोग कर रहा हूँ शीर्ष पर मेरे सेट कर, लेकिन अगर मैं रनटाइम पर VCL शैलियों स्विच , खिड़की अब सबसे ज्यादा नहीं है, और इसे अनसेट/पुनः सेट करने से यह ठीक नहीं होता है।

इसे ठीक करने का कोई तरीका?

+0

एक बग की तरह लगता है। आपको इसकी रिपोर्ट [क्यूसी] (http://qc.embarcadero.com/) पर करनी चाहिए। –

+0

@MasonWheeler यह एक बग नहीं है, इस तरह vcl शैलियों का काम करता है, हर बार जब आप vcl शैली बदलते हैं तो रूपों का संभाल फिर से बनाया जाता है। – RRUZ

+0

@RRUZ: ओपी के मूल विवरण के आधार पर, विशेषता को फिर से सेट करना शैलियों के साथ काम नहीं करता है, यह निश्चित रूप से एक बग होगा यदि यह सच था। (वास्तव में क्या हो रहा था के बेहतर स्पष्टीकरण के लिए एसएआरएटीएसी के जवाब पर ओपी की टिप्पणी देखें।) –

उत्तर

8

आपकी समस्या यह है कि स्टाइल परिवर्तन की वजह से फॉर्म को फिर से बनाया जा रहा है और इसकी शीर्ष शैली को खोने के बाद से वीसीएल को इसका कोई ज्ञान नहीं है। या तो उपयोग:

FormStyle := fsStayOnTop; 

या CreateWindowHandle तो ओवरराइड कि SetWindowPos हर बार प्रपत्र निर्मित है कहा जाता है:

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    procedure CreateWindowHandle(const Params: TCreateParams); override; 
    .. 

procedure TForm1.CreateWindowHandle(const Params: TCreateParams); 
begin 
    inherited; 
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); 
end; 


Btw, मैं नकल नहीं कर सकता है "unsetting/पुनः स्थापित करने नहीं है इसे ठीक करें "। मेरे परीक्षणों के साथ, SetWindowPos पर कॉल करने से इसे फिर से तय किया गया।

+0

धन्यवाद। आप सही हैं, इसे फिर से स्थापित करना वास्तव में काम करता है। मुद्दा यह था कि खिड़की के हैंडल अलग थे क्योंकि मैं एक अलग मुद्दे को दूर करने के लिए वीसीएल शैलियों को बदलने के बाद RecreateWnd को कॉल करता हूं, इसलिए मैं अब सेट अवांछित हैंडल के साथ SetWindowPos को कॉल कर रहा था। – hikari

+0

@ हिकारी - आपका स्वागत है! –

5

नियंत्रण पर एक नई शैली स्थापित करने से नियंत्रण की विंडो हैंडल को फिर से बनाया जा सकता है, इस प्रकार HWND_TOPMOST को फिर से लागू किया जाना होगा।

0

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

procedure TForm1.FormShow(Sender: TObject); 
begin 
    Application.RestoreTopMosts; 
end; 
संबंधित मुद्दे