2013-09-03 5 views
5

दोस्तों, मुझे लगता है कि अगर कोई भी ऐसी घटना या विधि जानता है जिसे मैं सभी एमडीआई फॉर्म बंद कर देता हूं तो मैं रोक सकता हूं।घटना जब सभी एमडीआई फॉर्म बंद होते हैं

उदाहरण:

मैं अपने मुख्य रूप में एक घटना को लागू करने की है, जहां जब मैं सभी एमडीआई रूपों बंद करते हैं, इस तरह की घटना ट्रिगर किया गया।

कोई भी मदद कर सकता है तो आभारी।

उत्तर

7

एमडीआई बाल रूप (वास्तव में किसी भी रूप), नष्ट होने के दौरान, मुख्य रूप को सूचित करेंगे। आप इस अधिसूचना तंत्र का उपयोग कर सकते हैं। उदाहरण:

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    procedure Notification(AComponent: TComponent; Operation: TOperation); 
     override; 

    .. 

procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation); 
begin 
    inherited; 
    if (Operation = opRemove) and (AComponent is TForm) and 
     (TForm(AComponent).FormStyle = fsMDIChild) and 
     (MDIChildCount = 0) then begin 

    // do work 

    end; 
end; 
+0

+1 अच्छा! मुझसे बेहतर। ;-) – NGLN

+0

@NGLN - धन्यवाद! यद्यपि आप यह जानना चाहते हैं कि कोई बच्चा यह कब करता है और ... :) –

+1

एनजीएलएन, सर्टाक अकायस और रेमी लेबेउ। आपके उत्तरों के लिए धन्यवाद, सभी उत्कृष्ट। तुम बहुत अच्छे हो। इस के लिए मेरी स्थिति, सबसे अच्छा कोड Sertac Akyuz था। मेरी समस्या अधिक सरल और हल हो गई है। एनजीएलएन और रेमी, मैंने भविष्य में स्थितियों के लिए अपना कोड सहेजा। धन्यवाद। – Delphiman

4

पकड़ने WM_MDIDESTROY संदेश एमडीआई ग्राहक खिड़की पर भेज दें:

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    FOldClientWndProc: TFarProc; 
    procedure NewClientWndProc(var Message: TMessage); 
    end; 

... 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    if FormStyle = fsMDIForm then 
    begin 
    HandleNeeded; 
    FOldClientWndProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC)); 
    SetWindowLong(ClientHandle, GWL_WNDPROC, 
     Integer(MakeObjectInstance(NewClientWndProc))); 
    end; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    SetWindowLong(ClientHandle, GWL_WNDPROC, Integer(FOldClientWndProc)); 
end; 

procedure TForm1.NewClientWndProc(var Message: TMessage); 
begin 
    if Message.Msg = WM_MDIDESTROY then 
    if MDIChildCount = 1 then 
     // do work 
    with Message do 
    Result := CallWindowProc(FOldClientWndProc, ClientHandle, Msg, WParam, 
     LParam); 
end; 
2

आप MainForm प्रत्येक एमडीआई बच्चे यह बनाता है के लिए एक OnClose या OnDestroy ईवेंट हैंडलर आवंटित हो सकता है। प्रत्येक बार जब एक एमडीआई ग्राहक बंद/नष्ट हो जाता है, तो हैंडलर जांच सकता है कि क्या कोई और एमडीआई बाल रूप अभी भी खुला है, और यदि नहीं तो उसे जो भी करने की ज़रूरत है, वह करें।

procedure TMainForm.ChildClosed(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 

    // the child being closed is still in the MDIChild list as it has not been freed yet... 
    if MDIChildCount = 1 then 
    begin 
    // do work 
    end; 
end; 

या:

const 
    APPWM_CHECK_MDI_CHILDREN = WM_APP + 1; 

procedure TMainForm.ChildDestroyed(Sender: TObject); 
begin 
    PostMessage(Handle, APPWM_CHECK_MDI_CHILDREN, 0, 0); 
end; 

procedure TMainForm.WndProc(var Message: TMessage); 
begin 
    if Message.Msg = APPWM_CHECK_MDI_CHILDREN then 
    begin 
    if MDIChildCount = 0 then 
    begin 
     // do work 
    end; 
    Exit; 
    end; 
    inherited; 
end; 
संबंधित मुद्दे