2009-08-31 17 views
14

में काम नहीं कर एंकर सॉफ्टवेयर मेरी XP मशीन पर डेल्फी 7.डेल्फी 7 रूपों, विस्टा

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

तो ऐसा लगता है कि Vista मशीन एंकर संपत्ति को अनदेखा कर रही है। कोई विचार जो इसका कारण बन रहा है और इसे कैसे ठीक किया जाए?

महत्वपूर्ण अपडेट (फ़्राँस्वा):
हम अपने D2007 आवेदन और सभी 64 खिड़कियों पर के साथ एक ही समस्या थी।
एंड्रियास का जवाब वास्तव में ठीक था। तो यह डी 7 और न ही Vista से संबंधित है।

+0

विंडोज के किस संस्करण के तहत प्रोग्राम संकलित किया गया था? – Argalatyr

+0

संकलित एक्सपी/डेल्फी 7 – Robo

+1

Argalatyr का जवाब देखें। क्या इस का कोई मतलब निकलता है? – Hemant

उत्तर

12

शायद यह "विंडोज कर्नेल स्टैक ओवरफ़्लो" समस्या से संबंधित है जो तब होता है जब आपके नियंत्रण में कई माता-पिता हैं। और यदि आप इसे 64 बिट सिस्टम पर चलाते हैं तो कर्नेल स्टैक ओवरफ़्लो बहुत तेज होता है। (इस बारे में अधिक: http://news.jrsoftware.org/news/toolbar2000/msg07779.html) http://cc.embarcadero.com/Item/25646

+0

क्या मुझे यह धारणा है कि यह केवल तभी लागू होता है जब आपके पास लगभग 20 स्तरों के घोंसले को नियंत्रित किया जाता है? – Argalatyr

+0

यह इस बात पर निर्भर करता है कि WH_CALLWNDPROC विंडो हुक कितने सिस्टम-व्यापी स्थापित हैं। (उदाहरण के लिए Logitech WH_CALLWNDPROC हुक का उपयोग करता है, और इसलिए TActionManager भी करता है)। –

+0

मैं अभी काम पर इस में भाग गया और इस मुद्दे पर इसे ट्रैक करने में कामयाब रहा, यहां आपकी पोस्ट के लिए धन्यवाद। एंड्रियास की जानकारी और फिक्स के लिए धन्यवाद। फिर भी आपकी पहले से ही काफी टोपी में एक और पंख। –

0

Vista पर XP संगतता मोड में प्रोग्राम चलाने का प्रयास करें। डेल्फी 7 द्वारा संकलित प्रोग्राम पूरी तरह से Vista देशी मोड का समर्थन नहीं कर सकते हैं (वास्तव में कोई आश्चर्य नहीं है)।

+0

ग्राहक इसे अनुकूलता मोड की बजाय देशी Vista में चलाने के लिए चाहते हैं, उम्मीद है कि इसके आसपास जाने का कोई तरीका है। – Robo

+0

समझा। क्षमा करें मेरे पास प्रस्ताव देने के लिए और अधिक नहीं है - अब मैं डी 7 का उपयोग नहीं करता हूं, और मेरी प्रतिक्रिया स्थिति की मेरी समझ को सारांशित करती है। मुझे आशा है कि आपको समाधान मिलेगा! – Argalatyr

+2

यदि आप पूर्ण Vista समर्थन चाहते हैं, तो आपको अपग्रेड करना होगा। यह डेल्फी 2007 के बाद से एक विशेषता रही है। असल में, यदि आप वास्तव में चालू रहना चाहते हैं, तो आपको डेल्फी 2010 मिलना चाहिए, जो पिछले हफ्ते बाहर आया था। इसे विंडोज 7 के साथ-साथ Vista के लिए पूर्ण समर्थन मिला है। –

2

यह क्योंकि पारदर्शी फ्रेम जो विस्टा से दिखाया गया है की हो सकता है। (अलग-अलग विंडो समान पारदर्शी उपस्थिति देने के लिए।

एंकर के बजाय "संरेखित" उपयोग करने का प्रयास (alClient)। आप सभी लंगर का उपयोग कर रहे हैं, कि और अधिक समझ में आता है।

+0

यह काम नहीं करेगा क्योंकि नियंत्रण अन्य स्क्रीन को कवर करने वाली पूरी स्क्रीन लेगा। – Robo

+1

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

+0

+1 यह काम करता है (हेमंत की अतिरिक्त टिप्पणी के साथ)। उदाहरण के रूप में मेरे उत्तर में कामकाजी कोड देखें (मैंने हेमंत के जवाब को संपादित किया होगा, लेकिन चिंतित है कि यह कठोर हो सकता है)। – Argalatyr

2

से पहले एंकर डेल्फी 4 में पेश किए गए , हम घटकों गतिशील आकार दिया एक ही प्रभाव को प्राप्त करने। आप आसानी से ले जाने के/प्रपत्र के onresize घटना में घटकों समायोजित कर सकते हैं।

true को प्रपत्र की doublebuffered गुण को सेट, झिलमिलाहट को कम कर सकते paint विधि बफरिंग से। मुझे याद है हम इस्तेमाल किया खुद को भी लागू करना है!

1

गतिशील आकार बदलने मैं के लिए एक विकल्प के रूप में:

Embarcadero के CodeCentral पर इस बग के लिए एक समाधान (: डेल्फी 2009 VCL में 1 जो भी लगभग नकल की जाती है 1) है सुझाव दिया, हेमंत के सुझाव के आधार पर मैंने कुछ कामकाजी कोड (नीचे) को थप्पड़ मार दिया। बस एक वीसीएल फॉर्म एप्लिकेशन बनाएं, tpanel पर ड्रॉप करें जो फ़ॉर्म के किसी भी किनारे को स्पर्श नहीं करता है (डिफ़ॉल्ट रूप से, Align = alNone) और यूनिट 1 को नीचे दिए गए कोड से प्रतिस्थापित करें। जब आप इसे चलाते हैं, तो आप प्रारंभ में जोड़े गए चार पीले पैनलों को देखेंगे, और केंद्रीय पैनल फॉर्म के साथ आकार बदल जाएगा (जैसे कि सभी एंकर true थे)।

unit Unit1; 

interface 

uses 
    Windows, Classes, Controls, Forms, ExtCtrls, Graphics; 

type 
    TPanelPos = (ppLeft, ppRight, ppTop, ppBottom); 
    TForm1 = class(TForm) 
    Panel1: TPanel; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    Panels : array[TPanelPos] of tpanel; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    PanelPos : TPanelPos; 
begin 
    for PanelPos := ppLeft to ppBottom do 
    begin 
    Panels[PanelPos] := tpanel.Create(Form1); 
    Panels[PanelPos].Parent := Form1; 
    Panels[PanelPos].Color := clYellow; 
    case PanelPos of 
    ppLeft : 
     begin 
     Panels[PanelPos].Align := alLeft; 
     Panels[PanelPos].Width := Panel1.Left - 1; 
     end; 
    ppRight : 
     begin 
     Panels[PanelPos].Align := alRight; 
     Panels[PanelPos].Width := Form1.Width - Panel1.Left - Panel1.Width; 
     end; 
    ppTop : 
     begin 
     Panels[PanelPos].Align := alTop; 
     Panels[PanelPos].Height := Panel1.Top - 1; 
     end; 
    ppBottom : 
     begin 
     Panels[PanelPos].Align := alBottom; 
     Panels[PanelPos].Height := Form1.Height - Panel1.Top - Panel1.Height; 
     end; 
    end; 
    Panel1.Align := alClient; 
    end; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
var 
    PanelPos : TPanelPos; 
begin 
    for PanelPos := ppLeft to ppBottom do 
    Panels[PanelPos].Free; 
end; 

end. 
+1

अच्छा (और पूरी तरह से) स्निपेट! – Hemant

0

ऐसा लगता है कि यह बहुत पुराना सवाल है, वैसे भी यहाँ ब्रह्मांड में इस समस्या के लिए केवल एक ही समाधान है: WM_SIZE और WM_SIZING फँसाने एपीआई का उपयोग कर पुरानी शैली विंडोज प्रोग्रामिंग आकार विधि का उपयोग करें, कि infalible एक है और कार्य करेंगे हर विंडोज़ में आप जान लेंगे।

बेशक इसका मतलब है कि आपको बुद्धिमानी और ऊंचाइयों को निर्धारित करने के लिए मुख्य रूप से GetClientRect() का उपयोग करना होगा और फिर ऐसे मानों के आधार पर नियंत्रण का आकार बदलना होगा, सुनिश्चित करें कि एक स्पेसशिप को आग लगने की कोशिश की तरह लग सकता है लेकिन यह सबसे अच्छा है।

नहीं तो आप की तरह और अधिक व्यावहारिक और जल्दी से कुछ एक आकार बदलने की प्रक्रिया में कर सकता है:

Control1.Left := Control2.Left + (buttonControl.Width div 2) - (buttonControl3.Width div 2); 
//for example widths 
Control4.Width := (Control.Width * 4) + (Control.Left * 8) + 54 ; 

मैं सिर्फ सभी Windows में कोडिंग और कार्यों उस तरह कर कोई बात नहीं है जो संस्करण यह होगा।

आप केवल कुछ इस तरह कर रही संदर्भ के लिए स्क्रीन रिज़ॉल्यूशन पर कुछ मूल्यों की आवश्यकता:

iCXSCREEN := GetSystemMetrics(SM_CXSCREEN); 
iCYSCREEN := GetSystemMetrics(SM_CYSCREEN); 

    if ((iCXSCREEN = 1280) and (iCYSCREEN = 720)) or ((iCXSCREEN = 1280) and (iCYSCREEN = 700)) or ((iCXSCREEN = 1280) and (iCYSCREEN = 600)) then begin 

// blah blah 

end; 

आशा किसी और मदद करता है!

चीयर्स!

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