2011-12-16 7 views
5

का छुपा व्यवहार ओवरराइड करना मैं वर्तमान में मौजूदा डेल्फी एप्लिकेशन के लिए विंडोिंग सिस्टम लिख रहा हूं।डेल्फी - TForm.showModal

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

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

क्या कोई तरीका है कि मैं मोडल फॉर्म को अपनी प्रक्रिया पूरी होने के बाद स्वचालित रूप से छिपाने से रोक सकता हूं? एक बार पैरेंट फॉर्म फिर से दिखाई देने के बाद यह उन्हें मैन्युअल रूप से छुपाने की अनुमति देगा। मैंने इसे प्रत्येक बच्चे के फॉर्म की फॉर्महाइड घटना में शेड्यूल करने का प्रयास किया है, लेकिन यह काम नहीं करता है क्योंकि बच्चे के रूप में भी अपने बच्चों में से एक खोलते समय छुपाया जाता है।

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

यहाँ मैं अब तक नीचे

procedure openModalChild(child: TForm; parent: TForm); 
var 
    WindowList: Pointer; 
    SaveFocusCount: Integer; 
    SaveCursor: TCursor; 
    SaveCount: Integer; 
    ActiveWindow: HWnd; 
    Result: integer; 
begin 
    CancelDrag; 
    with child do begin 
    Application.ModalStarted; 
    try 
    ActiveWindow := GetActiveWindow; 
    WindowList := DisableTaskWindows(0); 
    //set the window to fullscreen if required 
    setScreenMode(child); 
    try 
    Show; //show the child form 
    try 
     SendMessage(Handle, CM_ACTIVATE, 0, 0); 
     ModalResult := 0; 
     repeat 
     Application.HandleMessage; 
     //if Forms.Application.FTerminate then ModalResult := mrCancel else 
      if ModalResult <> 0 then closeModal(child as TCustomForm); 
     until ModalResult <> 0; 
     Result := ModalResult; 
     SendMessage(Handle, CM_DEACTIVATE, 0, 0); 
     if GetActiveWindow <> Handle then ActiveWindow := 0; 
    finally 
     parent.Show; 
     Hide; 
    end; 
    finally 
    EnableTaskWindows(WindowList); 
    parent.Show; //reshow the parent form 
    if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow); 
    end; 
    finally 
    Application.ModalFinished; 
    end; 
    end; 
end; 

यह अच्छी तरह से काम करता है लेकिन समस्या सिर्फ सक्रिय दोहराने पाश टूट जाता है कभी नहीं, के बाद भी बच्चे को कर दिया गया है है रेमी की सलाह के आधार पर किया है बच निकला और इसलिए माता-पिता का रूप कभी भी नहीं बदला गया। क्या कोई तरीका है जिससे मैं इसे हल कर सकता हूं?

+0

क्या आपने बंद करने से पहले बच्चे के रूप से मूल रूप से दिखाई देने का प्रयास किया है? –

+0

मुझे नहीं लगता कि 'पैरेंट' विंडो को छिपाने के परिणामस्वरूप किसी भी रूप की गतिशीलता होगी। कृपया अपने लक्ष्य का सटीक वर्णन करें, या प्रश्न से अनावश्यक भाग को हटा दें। – NGLN

+0

माता-पिता को छिपाना कोई बदलाव नहीं कर सकता है (वे पहले से ही कर सकते हैं)। जिन प्रारूपों का मैं संदर्भ दे रहा हूं वे सभी एक खिड़की के भीतर होना चाहिए लेकिन मौजूदा डिजाइन कार्यान्वयन के कारण वे नहीं हैं। एक-खिड़की प्रभाव देने के लिए प्रत्येक नए दिखाए गए बच्चे को अपने कॉलिंग माता-पिता के समान स्थान दिया जाता है और जब माता-पिता को बंद कर दिया जाता है तो बच्चे की स्थिति में स्थानांतरित हो जाता है और दृश्यमान होता है। दृश्यमान ये एक खिड़की के रूप में दिखाई देते हैं जिसमें एक संक्षिप्त पल के अपवाद होते हैं जहां कोई फॉर्म दिखाई नहीं देता है। – jmc

उत्तर

10

ShowModal() स्पष्ट रूप से Show() को अपने मोडल प्रोसेसिंग लूप में प्रवेश करने से पहले कॉल करता है, और स्पष्ट रूप से लूप से बाहर निकलने के तुरंत बाद Hide() पर कॉल करता है। आप VCL के Forms.pas स्रोत फ़ाइल में कोड को बदलने के बिना इसे बदल नहीं सकते हैं।

यदि आपको वीसीएल स्रोत कोड संपादित किए बिना विंडोज़ पर बेहतर नियंत्रण की आवश्यकता है, तो ShowModal() का उपयोग न करें। Show(), Hide(), DisableTaskWindows(), और EnableTaskWindows() स्वयं को आवश्यकतानुसार उपयोग करें। मैं आपको फॉर्म्सपास को देखने के लिए देखता हूं कि उनका उपयोग कैसे किया जाता है। अपने स्वयं के फ़ंक्शन में ShowModal() के कार्यान्वयन की प्रतिलिपि बनाएँ, फिर आप इसे आवश्यकतानुसार अनुकूलित कर सकते हैं।

+0

हाय रेमी - एक गैर-अनुभव डेल्फी प्रोग्रामर के रूप में, मैं फ़ॉर्म के संग्रह के लिए शोमोडाल का नया कार्यान्वयन कैसे बना सकता हूं? मुझे लगता है कि उन्हें फॉर्म के कुछ सुपरक्लास से लागू करना है जो टीएफओआर से विरासत में आता है? जावा/सी शब्दों में बोलते हुए ... – jmc

+0

मैं इसे एक स्टैंडअलोन फ़ंक्शन के रूप में कार्यान्वित करता हूं जिसे आप पैरामीटर के रूप में 'TForm' पॉइंटर पास कर सकते हैं। –