2014-01-25 4 views
0

Windows Form과 관련하여 일반 적이 아니지만 전반적으로 C#에서 나아지고 있습니다. 나는 약을위한 프로젝트를 개발 중이다. 음식물. 클래스이고 여러 자식 폼을 허용하는 MDI 폼입니다.MDI 프로젝트에서 자식 폼이 닫힐 때 타이머 이벤트를 중지하는 방법

여기 내 피클입니다. 부모 양식에 타이머가 있습니다. 똑딱 거리면 두 개의 레이블 메서드를 처리하고 텍스트 문서의 문자 수를 계산하고 다른 하나는 확대/축소 수준을 표시합니다.

자식 창이 열릴 때 타이머를 실행할 수 있지만 내 이벤트를 처리 할 수 ​​있지만 창을 닫을 때 타이머를 중지하는 방법을 알아 내려고합니다. 나는 form.closing 이벤트를 시도하고 완료되었을 때 타이머를 사용하지 못하도록 시도했지만 도움이되지 않았습니다.

프로젝트는 텍스트 편집기이고 개체의 이름은 "문서"입니다. 객체가 Disposed 일 때 당연히 예외가 발생하지만이 경우 타이머를 사용하지 않기를 원합니다.

은 ...

 void New() 
     { 
      // Generate a new form from scratch 
      TextEditorChild = new Form(); // Declare a variable containing a new Form method 
      TextEditorChild.Text = "Document " + count.ToString(); // Text Property - also gets the forms order number 
      TextEditorChild.Icon = Properties.Resources._new_doc_icon; // Use our own icon 
      TextEditorChild.MdiParent = this; // Ensure we are using the original form as the parent form 
      Document = new RichTextBox(); // Call a new RichTextBox object 
      Document.Multiline = true; // Yes, a multiline textbox 
      Document.Dock = DockStyle.Fill; // Ensure that the textbox fills the new window 
      TextEditorChild.Controls.Add(Document); // Apply our controls to the child window 
      TextEditorChild.Show(); // Display the window 
      count++; // Add this window to a potnetial list of windows, should multiple be opened all at once 
      timer.Enabled = true; 
     } 

가 여기 내 타이머도 핸들러입니다 .. 다음은 자식 폼의 인스턴스 A를 호출 내 새로운() 메소드의

"삭제 된 개체에 액세스 할 수 없다"

 private void timer_Tick(object sender, EventArgs e) 
    { 
      charCount.Text = "Characters in the current document: " + Document.TextLength.ToString(); 
      zoom.Text = Document.ZoomFactor.ToString(); 
    } 
+0

하나 이상의 TextEditorChild를 열었습니까? – Steve

+0

하나만 있으면 예외가 발생합니다. 실제로 내가 게시 한 코드는 타이머가 시작되도록 허용하지 않습니다. 내 첫 번째 스태 브가 작성되었고 IF 문과 ' if (TextEditorChild == null) { return; } 다른 { // 방법 } ' 이 근무하지만 자식 창을 닫을 때, 나는 다시 메시지를 받았습니다. –

답변

1

당신은 추가 할 수

TextEditorChild.FormClosing += new FormClosingEventHandler(Close); 
그래서 형태 닫을 때 새로운 방법()


private void Close(object sender, FormClosingEventArgs e) 
{ 
    timer.Enabled = false; 
} 

및 새로운 방법이 그것을 만드는


로서, 이하이 추가 0

는, 상기 타이머를 정지하고, 다음 양식을 종료합니다

+0

그게 다예요. 나는 이미 비슷한 것을 시도해 보았을지도 모르지만 그 방법에서 사용할 인자의 타입을 확신하지 못했습니다. 감사합니다. –

+0

기꺼이 도울 수 있어요 :) – Joe

1

타이머를 활성화하는 줄 바로 앞에 다음 코드를 추가하십시오.

 var tec = TextEditorChild; 
     FormClosingEventHandler closing = null; 
     closing = (s, e) => 
     { 
      tec.FormClosing -= closing; 
      if (--count == 0) 
      { 
       timer.Enabled = false; 
      } 
     }; 
     tec.FormClosing += closing; 

모든 창이 닫히면 타이머를 중지해야합니다. 모듈 레벨 TextEditorChildtec으로 캡처하여 새 하위 창을 열 때 참조가 변경되지 않도록하십시오.

다른 곳에서는 count 값을 줄여서 로직을 조정해야한다고 가정하지만 좋은 시작일 것입니다.

+0

나는 그 방법을 사용할 수 없었다. 내 아이 창수가 0에 이르렀을 때 단순히 타이머를 사용하지 않도록 비슷한 아이디어가 있었기 때문에 나는 그 일에 함께 할 생각이었습니다. –

+0

다른 방법으로이 방법을 계속 사용해 보겠습니다.이 방법을 사용하면이 방법을 처리하는 가장 이상적인 방법이기 때문입니다. 귀하의 의견을 보내 주셔서 감사합니다. –

+0

@ codeman061988 - 작동하지 않는 이유는 무엇입니까? – Enigmativity

관련 문제