콘텐츠로 건너뛰기
Home » 폼이 하나 밖에 표시되지 않도록하고 액세스하는 방법

폼이 하나 밖에 표시되지 않도록하고 액세스하는 방법

  • by
폼이 하나 밖에 표시되지 않도록하고 액세스하는 방법

Visual Basic 6.0 사용자의 대부분이 VB.NET의 폼을 표시하는 차이에 당황하게 될것입니다.
VB6에서는 폼을 만들고 코드에서 (폼 이름) .Show 만으로도 폼을 열수있었습니다.
게다가 같은 양식의 Show 메서드를 여러 번 호출해도 폼은 하나밖에 표시되지 않았습니다.

.net에서는 클래스의 개념을 공부를 하셔야 합니다만 여기에서는 다루지 않겠습니다.

방법은 이렇습니다. 열고자하는 폼의 인스턴스를 생성하고 Show 메서드를 호출하면 됩니다.
인스턴스(new) 와 show 를 반복하면 창을 여러개 띄울수 있게 됩니다.

여기에서는 VB6처럼 폼을 사용 할 수있게하는 방법을 소개합니다.

기본적인 설계 (.NET Framework 2.0 이상)

예를 들어, “Form2” 라는 폼의 인스턴스는 “My.Forms.Form2” 라는 속성을 얻을 수 있습니다.
즉, “Form2” 를 표시하고 싶다면 “My.Forms.Form2.Show()” 라고합니다.
“My.Forms.Form2.Show()” 를 여러 번 호출하면 Form2는 1 장 밖에 표시되지 않게 해야합니다.

또한 “Form2” 에 배치 된 “TextBox1″의 Text 값을 취득하고자 한다면 “My.Forms.Form2.TextBox1.Text”라고합니다.
“My.Forms.Form2” 는 간략하게 “Form2” 만으로 기술이 가능합니다.
“Form2.Show()” 명령으로 “Form2” 를 열수있습니다.

“Form2” 가 비활성 상태 일때만 폼을 생성 합니다.
(하나만 생성되게 하는 방법)

“My.Forms” 에서 액세스 할수있는 폼은 같은 프로젝트안에 존재해야 합니다.

참고 : “Form2” 라는 양식이 여러 개있는 경우, 양식 이름 앞에 네임 스페이스를 추가 할 필요가 있습니다.

그러나 “My.Forms” 은 스레드마다 폼의 인스턴스를 생성하기 때문에 다른 스레드에서 폼을 액세스하는 경우는 이 방법은 사용할 수 없습니다.

VB.NET

'Form2 열기
My.Forms.Form2.Show() '같은의미 Form2.Show()
'Form2のTextBox1의 내용을 취득합니다.
'TextBox1의 속성중 Modifiers의 옵션을 Public으로 설정해주셔야합니다.
MessageBox.Show(My.Forms.Form2.TextBox1.Text) '같은의미 Form2.TextBox1.Text

C#

//Form2 열기
this.Forms.Form2.Show() '같은의미 Form2.Show()
//Form2のTextBox1의 내용을 취득합니다.
//TextBox1의 속성중 Modifiers의 옵션을 Public으로 설정해주셔야합니다.
MessageBox.Show(this.Forms.Form2.TextBox1.Text) '같은의미 Form2.TextBox1.Text

정적 프로퍼티를 사용하는 방법

정공법은 양식의 인스턴스를 정적 필드에 보관 해두고 정적 속성에 null 또는 Dispose 가 되어있을때 새로운 인스턴스를 생서하는 방법을 생각해볼수 있어요.

다음은 샘플을 보여줍니다.
“Form2” 라는 폼 클래스가있는 것으로, 이 클래스에 다음과 같은 _instance 필드와 Instance 속성을 추가합니다.

참고 : “Form2” 클래스는 싱글 클래스로, “Form2” 의 생성자를 비공개로 전환하면 더욱 확실합니다.
구체적인 코드는 아래의 “싱글 톤 디자인 패턴의 적용”을 참조하십시오.

VB.NET

'단 하나의 폼의 인스턴스를 보유하는 필드
Private Shared _instance As Form2

'단 하나의 폼에 액세스하기 위한 속성
Public Shared ReadOnly Property Instance() As Form2
    Get
        '_instance가 Nothing 또는 폐기된 상태일때
        '새로운 인스턴스를 생성합니다.
        If _instance Is Nothing OrElse _instance.IsDisposed Then
            _instance = New Form2
        End If
        Return _instance
    End Get
End Property

C#

//단 하나의 폼의 인스턴스를 보유하는 필드
private static Form2 _instance;

//단 하나의 폼에 액세스하기 위한 속성
public static Form2 Instance
{
    get
    {
        //_instance가 Nothing 또는 폐기된 상태일때
        //새로운 인스턴스를 생성합니다.
        if (_instance == null || _instance.IsDisposed)
        {
            _instance = new Form2();
        }
        return _instance;
    }
}

“Form2” 의 인스턴스에 액세스하려면 Form2.Instance 정적 메소드를 사용합니다. 예를 들어, “Form2” 를 모달리스로 표시하려면 “Form2.Instance.Show()” 이라고하면됩니다. “Form2.Instance.Show()” 를 여러 번 호출해도 폼은 1 장 밖에 표시되지 않습니다.

참고:이 속성은 스레드로부터 안전하지 않습니다. 스레드로부터 안전하게 보호하려면 아래의 예를 참고하세요.

VB.NET

'Form2을 표시
Form2.Instance.Show()

'Form2 TextBox1의 내용을 취득
'TextBox1의 속성중 Modifiers의 옵션을 Public으로 설정해주셔야합니다.
MessageBox.Show(Form2.Instance.TextBox1.Text)

C#

//Form2을 표시
Form2.Instance.Show();

//Form2 TextBox1의 내용을 취득
//TextBox1의 속성중 Modifiers의 옵션을 Public으로 설정해주셔야합니다.
MessageBox.Show(Form2.Instance.TextBox1.Text);

싱글 톤 디자인 패턴의 적용

클래스의 인스턴스가 단 하나임을 보장하기위한 디자인 패턴으로 싱글 톤 (Singleton) 디자인 패턴이 있습니다. 싱글 톤 구현에 대해 다음 페이지가 도움이됩니다.

Microsoft patterns & practices Patterns – 싱글 톤

C#에서 싱글 톤 구현

Implementing the Singleton Pattern in C#

여기에서는 “C#에서 싱글 톤 구현”의 “정적 초기화”에서 소개 된 방법을 사용하여 인스턴스가 하나 인 Form2 양식을 작성하여 봅시다. 우선 Form2 클래스를 봉인 클래스로, Form2의 생성자를 비공개로 전환 다음과 같은 _instance 필드와 Instance 속성을 추가합니다.

주의 : .NET Framework 2.0 이상에서 Visual Studio의 Forms 디자이너가 생성 한 폼 클래스에는 partial 키워드를 사용하고 있습니다. 다음 코드에서는 partial을 사용하지 않으므로 필요한 경우 추가한다.

VB.NET

'기본 클래스로 사용하지 못하도록하는
Public NotInheritable Class Form2
    Inherits System.Windows.Forms.Form

    '생성자를 Private하기
    Private Sub New()
        '(생략)
    End Sub

    '(생략)

    '폼의 인스턴스를 보유하는 필드
    Private Shared _instance As New Form2

    '폼에 액세스하기위한 속성
    Public Shared ReadOnly Property Instance() As Form2
        Get
            Return _instance
        End Get
    End Property
End Class

C#

//기본 클래스로 사용하지 못하도록하는
public sealed class Form2 : System.Windows.Forms.Form
{
    //생성자를 Private하기
    private Form2()
    {
        //(생략)
    }

    //(생략)

    //폼의 인스턴스를 보유하는 필드
    private static readonly Form2 _instance = new Form2();

    //폼에 액세스하기위한 속성
    public static Form2 Instance
    {
        get
        {
            return _instance;
        }
    }
}

하지만 이것만으로는 완성이 될수 없습니다.
폼을 닫고 다시 폼을 열려고하면 오류가 발생합니다. 왜냐하면 폐기 된 폼은 열 수 없기 때문입니다.

이 문제를 해결하려면 다른 방법으로 폼이 삭제되지 않도록 폼이 닫히지 않게하는 방법을 생각할 수 있습니다.

예를 들어, Form2 클래스에 다음과 같은 코드를 추가하면 닫지 않고 대신 숨기도록 할 수 있습니다.

주의 : .NET Framework 1.1 이전 버전에서는 Form 클래스의 FormClosing 이벤트 대신 Closing 이벤트를 사용하십시오.

VB.NET

'폼을 닫지 않고 숨기기
Protected Overrides Sub OnFormClosing(ByVal e As FormClosingEventArgs)
    e.Cancel = True
    Me.Hide()
End Sub

C#

//폼을 닫지 않고 숨기기
protected override void OnFormClosing(FormClosingEventArgs e)
{
    e.Cancel = true;
    this.Hide();
}
태그:

댓글 남기기