2012-04-04 12 views
7

का उपयोग नहीं कर ManualFloat अगर (डेल्फी में) मैंनिर्दिष्ट रेक्ट

Panel1.ManualFloat(Rect(500,500,600,600)); 

कर पैनल निर्दिष्ट रेक्ट स्थान पर नहीं जारी किया गया है, लेकिन इसके बजाय खिड़कियों डिफ़ॉल्ट स्थान का एक प्रकार में। मैं कैसे एक निर्दिष्ट स्थान पर फ्लोट करने के लिए एक पैनल (या अन्य नियंत्रण) मिलता है। ऐसा लगता है कि यह सही आकार है। क्या कोई अन्य संपत्ति है जिसे मुझे सही तरीके से काम करने के लिए सेट करने की आवश्यकता है?

संपादित करें: बस बातें स्पष्ट करना है। मैं ऊपर कोड पैनल एक 100x100 में (500x500) स्क्रीन है, जो यह नहीं है के शीर्ष बाएँ हाथ कोने से संबंधित स्थित वर्ग बनाने के लिए उम्मीद करेंगे। आकार सही है लेकिन स्थान नहीं है। यदि बाद के नियंत्रण फ्लोट किए जाते हैं तो उन्हें स्क्रीन पर कैस्केड किया जाता है।

EDIT2: यह डेल्फी 7 में एक समस्या होने लगते हैं नहीं है, लेकिन XE2 के माध्यम से डेल्फी 2007 में (और संभवतः पहले)

+0

में तय कोड जब 'ManualFloat',' रेक्ट (500, 500, 600, 600) के साथ प्रयोग किया 'है 500 पिक्सेल नीचे और स्क्रीन के ऊपर से छोड़ दिया , हमेशा। (यह मूल रूप से, "खिड़कियों डिफ़ॉल्ट स्थान" प्रकार क्षेत्र है, क्योंकि 'ManualFloat' स्क्रीन निर्देशांक का उपयोग करता है और न खिड़की समन्वय करता है।) आप के बजाय निर्देशांक (अपने रूप के स्थान के आधार) की उम्मीद कर रहे हैं यह ग्राहक में होने की? –

+0

@KenWhite, धन्यवाद केन लेकिन क्या नहीं होता है।पैनल की अपेक्षा की जा रही 100x100 वर्ग है, लेकिन शीर्ष बाईं ओर के स्थान पर (500,500) स्क्रीन के कोने के पास – Alister

+0

@ केनहाइट, अपने कोड को आजमाएं और अपने लिए देखें ... –

उत्तर

5

आगे देखो : वीसीएल में यह एक बग है।

ManualFloat एक अस्थायी विंडो बनाता है और TControl.CreateFloatingDockSite(Bounds: TRect) में अपनी Top, Left मान सेट करता है और बाद में सेट अपने ClientWidth

एक गलती है ऐसा इसलिए है क्योंकि कर रही है कि बलों WindowHandle निर्माण

function TCustomForm.GetClientRect: TRect; 
begin 
    if IsIconic(Handle) then // <=== 

में (यह एक हैंडल अभी तक नहीं था) और उस खिड़की के डिफ़ॉल्ट स्थिति कॉल (व्यापक रोज़मर्रा की घटना ...) रीसेट करने Top और Left

ठीक TControl.CreateFloatingDockSite(Bounds: TRect)

में Top और Left गुण सेट करने से पहले ClientWidth और ClientHeight स्थापित करने के लिए किया जाएगा

अद्यतन: Controls.pas

function TControl.CreateFloatingDockSite(Bounds: TRect): TWinControl; 
begin 
    Result := nil; 
    if (FloatingDockSiteClass <> nil) and 
    (FloatingDockSiteClass <> TWinControlClass(ClassType)) then 
    begin 
    Result := FloatingDockSiteClass.Create(Application); 
    with Bounds do 
    begin 
     // Setting Client area can create the window handle and reset Top and Left 
     Result.ClientWidth := Right - Left; 
     Result.ClientHeight := Bottom - Top; 
     // It is now safe to position the window where asked 
     Result.Top := Top; 
     Result.Left := Left; 
    end; 
    end; 
end; 
+0

लेकिन डिफ़ॉल्ट फ़्लोटिंग डॉक साइट क्लास 'फॉर्म्स। कस्टमडॉकफॉर्म' में' बॉर्डर स्टाइल = bsSizeToolWin' है और यह प्रतिष्ठित नहीं है। यही कारण है कि मैंने पूछा कि क्या ओपी के पास पैनल के लिए असाइन किया गया 'फ़्लोटिंग डॉकसाइट क्लास' है। – NGLN

+0

@NGLN। सीमा स्टाइल या प्रतिष्ठित अप्रासंगिक है। विंडो हैंडल बनाने से पहले ऊपर और बाएं सेट करना उन्हें खोने का एक निश्चित तरीका है ... बस एक साधारण उदाहरण के साथ ओपी की तरह प्रयास करें: एक फॉर्म, एक पैनल, पैनल को फ़्लोट करने और देखने के लिए उसके कोड वाला एक बटन .. –

+0

'क्लाइंटरक्ट' सेट करना या प्राप्त करना विंडो को फिर से बनाना नहीं है। और नहीं, मैं नहीं देखता: मैंने अपने उत्तरों के साथ-साथ ओपी के सभी उदाहरणों की कोशिश की है और वे वीसीएल के इरादे से काम करते हैं _ (हालांकि डी 7 में) _। – NGLN

1

the function की TRect पैरामीटर के नाम की तरह - ScreenPos - तरह का कहना है यह पहले से ही है, निर्देशांक माता-पिता की बजाय स्क्रीन इकाइयों में हैं।

आप पैनल, एक ही जगह है जहाँ यह था पर रहने निर्देशांक स्क्रीन के सापेक्ष अनुवाद करना चाहते हैं:

with Panel1.ClientToScreen(Point(0, 0)) do 
    Panel1.ManualFloat(Bounds(X, Y, 100, 100)); 

या, पैनल की सीमा में शामिल करने के:

if Panel1.HasParent then 
    with Panel1.Parent.ClientToScreen(Panel1.BoundsRect.TopLeft) do 
     Panel1.ManualFloat(Bounds(X, Y, 100, 100)); 

या , माता-पिता के सापेक्ष एक विशिष्ट समन्वय में अनुवाद करने के लिए, उपयोग करें:

if Panel1.HasParent then 
    with Panel1.Parent.ClientOrigin do 
     Panel1.ManualFloat(Bounds(X + 500, Y + 500, 100, 100)); 
+0

हां मैं स्क्रीन निर्देशांक के आवश्यक अनुवाद से अवगत हूं। समस्या यह है कि मैनुअलफ्लैट एक्स और वाई को अनदेखा करता है (ऊपर से अपने चर का उपयोग करने के लिए)। फॉर्म के साथ पूरी तरह से काम करता है लेकिन मैं इसे पैनल के साथ काम करने के लिए नहीं मिल सकता। हालांकि चौड़ाई और ऊंचाई सही हैं। यदि मैं एक्स और वाई को 0 पर सेट करता हूं, तो मुझे उम्मीद है कि पैनल स्क्रीन के ऊपरी बाएं कोने में दिखाई देगा, लेकिन यह वह जगह नहीं है जहां मैं फंस गया हूं। – Alister

+0

क्या आप अपने 'फ़्लोटिंग डॉकसाइट क्लास' का उपयोग कर रहे हैं? अन्यथा मैं समझा नहीं सकता कि यह क्यों काम नहीं करता है। – NGLN

+0

@NGLN * "अन्यथा मैं यह समझा नहीं सकता कि यह क्यों काम नहीं करता है।" *, उसका कोड आज़माएं और देखें .. –