2009-09-15 6 views
5

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

तो, मेरा सवाल है: इसे कैसे पकड़ें एमडीआई बाल फार्म को सक्रिय रूप से सक्रिय/निष्क्रिय कर दिया गया है, बिना बच्चे के फॉर्म का उपयोग किए?

उत्तर

3

मैंने एक टास्कबार प्रकार का घटक लिखा है जो साल पहले एक समूह था जो इस तरह की चीज करता है। इसे TrmMDITaskbar कहा जाता है। आप Torrys पर इसकी एक प्रति पा सकते हैं, यह rmControls लाइब्रेरी पैकेज का हिस्सा है। यह सक्रियण, न्यूनतम, अधिकतम करने आदि को संभालता है।

यह कैसे काम करता है इसका सारांश यह है कि यह MDIarents विंडो हैंडल को एमडीआईसीएचल्ड घटनाओं की तलाश में रखता है और उन घटनाओं के आधार पर सामान करता है।

यदि आप अपना खुद का लिखना चाहते हैं तो मैं सुझाव दूंगा कि शुरू करने के लिए एक अच्छी जगह के रूप में।

रयान।

पीएस Torrys पर संस्करण थोड़ा पुराना है लेकिन अभी भी काम करना चाहिए। मेरे पास मेरी समर्थन वेबसाइट पर एक नया संस्करण उपलब्ध है। (Mills Enterprise)

+0

धन्यवाद। आखिरकार मैंने इसे SPTBXLib से कोड का उपयोग करके हल किया जो WH_CBT ध्वज का उपयोग करके हुक करता है ... :) – migajek

+0

हाय रयान, मुझे उस घटक को आजमाने की इच्छा होगी लेकिन समर्थन वेबसाइट मुझे त्रुटि 403 देती है - निषिद्ध (आपने किसी दस्तावेज़ तक पहुंचने का प्रयास किया आपके पास विशेषाधिकार नहीं हैं।) –

+0

@Alin Sfetcu, मैंने हाल ही में अपनी होस्टिंग सेवा बदल दी है और अभी तक मेरे सभी लिंक और फ़ोरम को पुनर्स्थापित नहीं किया है। सच्चाई बताने के लिए मैंने सोचा कि मेरे पास पहले से ही काम करने वाले समर्थन मंच थे। मैं उस ASAP में देख लूंगा। गुम के लिए खेद है। जैसा कि मैंने कहा कि टोरी साइट कॉपी अभी भी काम करनी चाहिए। –

1

आप रनटाइम पर अपने कोड से "तथ्य के बाद" घटनाओं को हमेशा हुक कर सकते हैं। (आप प्रपत्र बनाने के बाद सबसे अधिक संभावना सही) फिर

type 
    TEventHolder = class 
    private 
    FSFActivate: TNotifyEvent; 
    published 
    property SavedFormActivate : TNotifyEvent 
     read FSFActivate write fSFActivate; 
    end; 

type 
    TMainForm = class(Tform) 
    : 
    SavedEvents : tStringList; 
    procedure ChildFormActivate(Sender: TObject); 
    procedure InitChildForm(MdiForm:TForm); 
    end; 

procedure TMainForm.ChildFormActivate(Sender: TObject); 
var 
    i : integer; 
begin 
    // your special processing here this is called for the child form. 
    i := SavedEvents.IndexOf(ClassName); 
    if i <> -1 then 
    tEventHolder(SavedEvents.Objects[i]).SavedFormActivate(Sender); 
end; 

procedure TMainForm.InitChildForm(MdiForm:TForm); 
var 
    OrigEvents : TEventHolder; 
begin 
    if not Assigned(SavedEvents) then 
    SavedEvents := tSTringlist.create; 
    if Assigned(MdiForm.OnActivate) then 
    begin 
     OrigEvents := tEventHolder.create; 
     OrigEvents.SavedFormActivate := MdiForm.OnActivate; 
     SavedEvents.AddObject(MdiForm.ClassName,OrigEvents); 
    end; 
    MdiForm.OnActivate := ChildFormActivate; 
end; 

अपने कार्यक्रम में कुछ बिंदु पर अपने जेनेरिक संस्करण के लिए ईवेंट हैंडलर्स स्थापित करने के लिए InitChildForm फोन: मूल रूप से एक सामान्य OnActivate कि कुछ इस तरह दिखता पैदा करते हैं। बेशक मुख्य रूप बंद होने पर आप सहेजे गए एवेन्ट्स (और लिंक किए गए ऑब्जेक्ट्स) को मुक्त करना चाहते हैं।

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