※ 아래 Daily Tip은 최천군님이
제공해주신 내용입니다.
(오늘의 학습자료 다운받기)
우리는 보통 폼을 열 때 DoCmd.OpenForm 매크로를
이용합니다. 일반적인 방법은 아니지만 폼 클래스의 인스턴스를 생성함으로써 폼을 열 수도 있습니다.
위의 그림은 두 개의 똑 같은 폼과 하나의 다른 폼을 연 것으로 보이지만 사실은 모두 하나의 폼입니다.
원리적인 부분은 차후 클래스를 다룰 때 상세히 설명하기로 하고 오늘은 클래스가 무엇인지 이해하는 차원에서
위와 같이 자신을 다시 호출하는 방법에 대해 소개 하겠습니다.
클래스와 인스턴스는 보통 붕어빵 기계와 붕어빵으로 비유되는데 적절하나
약간 혼동되기 쉽습니다. 클래스는 하나의 모델이고 인스턴스는 그 모델을 본 딴 실체(오브젝트)로 생각하시면
됩니다.
클래스를 생성하려면 클래스 모듈을 이용해야 합니다. 클래스 모듈을
생성하려면 메뉴에서 삽입, 클래스 모듈을 차례로 클릭하면 됩니다. 아래와 같이 클래스 모듈이 생성 됩니다.
아이콘만 다르고 표준 모듈과 달라 보이지 않습니다. 그렇지만 왠지 생소합니다. 하지만 어색하고 어렵게 느끼실
필요 없습니다.
어느 정도 폼이나 보고서를 사용해 보신 분이라면 이미 무수히 클래스 모듈을 사용해 오셨기 때문입니다.
폼의 이벤트 프로시저가 있는 폼 모듈이 바로 클래스 모듈입니다.
다시 말하면 폼이 바로 클래스의 하나인 것입니다. 폼의 실체는 사실상
무수히 많은 코드로 이루어진 코드 덩어리이고 우리가 만드는 폼은 액세스 기본폼 클래스의 속성 등을 상속 받고
새로운 속성이 추가 되거나 기본 속성이 변경된 새로운 하나의 클래스가 됩니다.
폼의 클래스 모듈에서 폼 클래스를 이용하여 새로운 인스턴스 즉 폼 개체(오브젝트)를 생성하여 오픈 하는
과정을 소개 하겠습니다.
NorthWind의 원래 폼에서 상자 부분에 컨트롤을 추가 했으며 폼 하나 더 열기 버튼의
클릭이벤트는 아래와 같습니다.
Dim frmInstance As
Access.Form ‘전역 개체 변수
Private Sub cmdViewDS_Click()
Set frmInstance = New Form_Products
frmInstance.SetFocus
If Me.ViewMode Then ‘데이터시트 형식으로 열 것인지
옵션그룹을 확인합니다.
DoCmd.RunCommand acCmdDatasheetView
’데이터시트 형식이면 데이터시트 보기 매크로를
실행합니다.
End If
DoEvents ‘폼의 생성이 완료되기를 기다리고
frmInstance.Recordset.Bookmark = Me.Recordset.Bookmark '새로
열린 폼의 레코드 위치와 연 폼의 레코드 위치가 같도록 맞춥니다.
End Sub |
• Dim frmInstance As Access.Form ‘전역 개체 변수
이벤트 프로시저에 선언하면 프로시저가 끝남과 동시에 개체 변수가 사라지게 되므로 전역 개체 변수를
선언합니다. 액세스 폼 클래스로 변수 선언을 했지만 사용자가 만든 Products폼도 클래스 이므로 아래와
같이 선언해도 됩니다.
Dim frmInstance As Form_Products
Form_Products이란 Products라는 이름으로 사용자가 만든 폼의 클래스 이름입니다. 이 클래스를
통해 생성되는 폼 인스턴스의 이름이 Prodects가 됩니다.
• Set frmInstance = New Form_Products
New 키워드와 함께 frmInstance라는 개체 변수에 클래스를 선언하여 새로운 인스턴스를 생성합니다.
이 순간에 이미 폼이 하나 생성 되었습니다. 다만 액세스 폼의 Visible속성이 False이므로 화면에는
나타나지 않습니다.
• frmInstance.SetFocus
frmInstance.Visible 속성에 True값을 주면 화면에 폼이 나타납니다. 또는 생성된
인스턴스에 포커스를 위치 시킴으로써 화면에 나타나게 할 수도 있습니다. 이 때는 생성된 인스턴스가 활성창이
됩니다.
폼의 열리는 위치가 이전 폼과 같기 때문에 겹쳐 집니다. 제목
표시줄을 클릭하여 폼의 위치를 옮기면 이전 폼이 나타납니다.
또한 개체 변수가 하나 뿐이기 때문에 최초의 폼에서 만들 수 있는
인스턴스는 하나 뿐입니다. 다시 버튼을 클릭하면 이전 인스턴스의 클래스 참조가 사라지고 인스턴스는 없어지면서
새로운 인스턴스가 발생합니다. 즉 하나의 폼만 만들어지게 됩니다.
여러 개의 개체변수를 사용하면 여러 개의 같은 인스턴스를 생성할 수 있습니다.
예제의 경우는 새롭게 생성된 인스턴스가 자체로 하나의 개체변수를 가지고 있으므로 새로 만들어진 폼은 또
하나의 같은 폼을 열 수 있습니다. 끝없이 인스턴스를 생성할 수 있지요.
열린 폼들의 이름은 모두 같습니다.
아래의 코드로 확인해 보십시요.
Sub CheckOutForms()
For Each frm In Access.Forms
Debug.Print frm.Name
Next
End Sub |
|