2011-11-11 16 views
9

कुछ पृष्ठभूमि (TLabel and TGroupbox Captions Flicker on Resize के एक निरंतरता की तरह):जोड़ना गैर VCL खिड़की

  • तो, मैं एक आवेदन है कि विभिन्न प्लग इन लोड करता है और एक TPageControl पर एक नया टैब बनाता है प्रत्येक के लिए।
  • प्रत्येक डीएलएल में इसके साथ जुड़े एक TForm है।
  • फॉर्म अपने माता-पिता एचडब्ल्यूएनडी के साथ नई टीटीएबीशीट के रूप में बनाए जाते हैं। चूंकि टीटीएबीशीट्स फॉर्म के माता-पिता नहीं हैं, जहां तक ​​वीसीएल संबंधित है (गतिशील आरटीएल का उपयोग नहीं करना चाहता था, और अन्य भाषाओं में बनाए गए प्लगइन्स) मुझे मैन्युअल रूप से आकार बदलना होगा।

मैं सिर्फ आवेदन के इस "प्लगइन" प्रकार के लिए नए मुद्दों (लेकिन महान सीखने के अनुभव) का एक बहुत में चल कर रहे हैं।

तो, मेरा वर्तमान संघर्ष एक प्लगइन रखने की कोशिश कर रहा है जो टीटीएबीशीट में डाला नहीं जाता है लेकिन इसका आकार बदल दिया जाएगा और सीधे फॉर्म पर गठबंधन किया जाएगा।

चूंकि यह आसान होगा एक तस्वीर के साथ व्याख्या करने के लिए: Visual representation of question अब मैं मैन्युअल संरेखण और आकार कर सकता है, लेकिन मैं बहुत बल्कि VCL संरेखण प्रक्रियाओं alClient, alTop, आदि होगा () यह मेरे लिए करो। इस तरह मुझे बिना किसी सोच के प्लगइन संरेखण को अपने रूप में सेट करना होगा।

वीसीएल स्रोत को देखने के बाद मैंने संरेखण कोड और इसे कैसे कहा जाता है, के माध्यम से कदम उठाना शुरू कर दिया। असल में जब एक TControl एक WM_RESIZE कहीं भी होगी हो जाता है:

  1. कॉल फिर से संगठित करना() जो AlignControl कॉल()
  2. AlignControl() ग्राहक रेक्ट हो और AlignControls()
  3. AlignControls (कॉल करेंगे) DoAlign कॉल करेंगे() इस क्रम में प्रत्येक TAlignment प्रकार के लिए: alTop, alBottom, alLeft, ठीक है, alClient, alCustom, alNone
  4. DoAlign() FControls और FWinControls (जो TLists कर रहे हैं) और उन्हें उचित रूप से संरेखित होगा
के माध्यम से लूप होगा

तो मेरी विचार प्रक्रिया यह है कि यदि मैं एक नया TWINControl बना देता हूं, तो इसे प्लगइन फॉर्म (विंडो) पर संभाल लें, इसे संरेखित करें और इसे उचित संरेखण के साथ FControls सूची में डालें, इसे मेरे लिए अपना काम करना चाहिए।

बेशक मैं यहां हूं, इसलिए यह बुरी तरह विफल रहा। अमान्य विंडो हैंडल के बारे में एप्लिकेशन से बाहर निकलने पर मुझे एवी भी मिलता है। मेरा अनुमान है कि मैंने बनाया TWINControl प्लगइन्स फॉर्म (विंडो) के हैंडल को मुक्त करने का प्रयास कर रहा है जो अब और मौजूद नहीं है।

मैं क्या कोशिश की है:

procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign); 
var 
    NewWinControl : TWinControl; 
begin 
    NewWinControl := TWinControl.Create(frmMain); 
    NewWinControl.WindowHandle := AHandle; 
    NewWinControl.Align := Align; 
    NewWinControl.Width := frmMain.ClientWidth; 
    NewWinControl.Height := 30; 
    NewWinControl.Parent := frmMain; 
end; 

procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign); 
var 
    NewWinControl : TWinControl; 
begin 
    NewWinControl := TWinControl.Create(frmMain); 
    NewWinControl.WindowHandle := AHandle; 
    NewWinControl.Align := Align; 
    NewWinControl.Width := frmMain.ClientWidth; 
    NewWinControl.Height := 30; 
    TWinControl(frmMain).Insert(NewWinControl); 
end; 

Soooo, विचार?

संपादित करें 1:

ठीक है, तो यह सही ढंग से सूची नियंत्रण कहते हैं और अनुरूप TAlign सेट (कारण है कि यह है कि मैं 8 घंटे कुछ पता लगाने की कोशिश खर्च करते हैं, मैं यहाँ पोस्ट करें, और तो इस सवाल का जवाब सिर्फ प्रकट होता है ... ओह अच्छी तरह से किसी को इस सवाल और मेरे ramblings उपयोगी) मिल सकती है:

procedure AddHandleToControlList(AHandle: DWORD; AName: PChar; ATop, ALeft, AWidth, AHeight: Integer; AAlign: TAlign); 
var 
    NewWinControl : TWinControl; 
begin 
    NewWinControl := TWinControl.Create(frmMain); 
    With NewWinControl Do 
    begin 
    Name := AName; 
    Top := ATop; 
    Left := ALeft; 
    Width := AWidth; 
    Height := AHeight; 
    Align := AAlign; 
    WindowHandle := AHandle; 
    Visible := True; 
    end; 
    TWinControl(frmMain).InsertControl(NewWinControl); 
end; 

मुद्दा अब है कि जब आवेदन बंद कर देता है, मैं अमान्य त्रुटि ए वी मिलता है ... मैं जारी करेगा !!

संपादित करें 2: ठीक है, इसे TWinControl.DestroyWindowHandle कि ए वी को जन्म देती है क्योंकि खिड़की संभाल किसी भी अधिक मौजूद नहीं है तो। मैं एक साफ समाधान के बारे में सोचने की कोशिश कर रहा हूँ।

उत्तर

9

TWinControl से एक नई कक्षा प्राप्त करें और HWND प्रदान करने के लिए अपने वर्चुअल DestroyWindowHandle() विधि को ओवरराइड करें। TWinControl.DestroyWindowHandle() का डिफ़ॉल्ट कार्यान्वयन Win32 API DestroyWnd() फ़ंक्शन को कॉल करता है।

+0

यह मैं जो कर रहा था उससे कहीं अधिक सुंदर समाधान है! पूर्ण धन्यवाद! – ThievingSix

+0

+1 मीठा –

+0

+1 हो सकता है। डेविड के साथ सहमत - अच्छा! –

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