| |
* 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.
1. 액세스 버전(95,97,2000,2002):
2. 윈도우즈의 버전(win95,win98,winME,winNT,win2000,winXP):
3. CPU (486,PentiumI/II/III/IV...):
4. RAM (32,64,128,256,512MB,1G...):
* 아래줄에 질문을 작성하세요 >>
이전부터 오피스튜터에 클래스모듈에 관한 질문을 했었는데요 아무도 답글을 달지 않더군요 제발좀 알려주세요
아래모듈에서 버튼을 클릭하면 클래스모듈안의 이벤트가 발생해야 하는데
연결이 안됩니다. 엑셀에서는 되거든요 무엇이 문제인지좀 알려주셨으면 감사하겠습니다.
그럼 좋은 하루 되시고 평안하십시오
'폼의모듈
Option Compare Database
Dim but() As New Class
Dim ctl As Control
Dim i
Private Sub Form_Load()
i = 1
For Each ctl In Controls
If TypeName(ctl) = "CommandButton" Then
ctl.Caption = i
i = i + 1
ReDim Preserve but(i)
Set but(i).button = ctl
End If
Next ctl
End Sub
----------------------------------------------------
'클래스모듈 이름은 Class
Option Compare Database
Public WithEvents button As CommandButton
Private Sub button_Click()
MsgBox button.Caption
End Sub
여기까지 입니다. 무엇이 잘못되었는지요?
==============[페르님 글에 대한 답변입니다]==============
흥미로운 질문이군요.
엑셀이나 비베에서는 가능하지만 액세스에서는.....안되지요.
이유는....
비베나 엑셀의 커맨트 버튼은 이벤트속성을 가지고 있지 않기 떄문에
먼저 클래스에 정의된 이벤트를 실행하지만....
액세스의 커맨드버튼은
이벤트 속성을 가지고 있고 그리고 클래스에 정의해 둔 button_Click 이벤트는 무시됩니다.
따라서
클래스에 버튼을 셋팅할 때 이 이벤트 속성에는 아무 것도 설정이 되지 않기 때문입니다.
다음과 같이 해보시고 아이디어를 내보십시오.
클래스는 그대로 두시고 폼 모듈의 내용을 수정하시고...
Option Compare Database
Dim but() As New Class1
Dim ctl As Control
Dim i
Private Sub Form_Load()
i = 0
For Each ctl In Controls
If TypeName(ctl) = "CommandButton" Then
i = i + 1
ctl.Caption = i + 1
ReDim Preserve but(i)
Set but(i).button = ctl
but(i).button.OnClick = "=ButtonMsg(" & i & ")"
End If
Next ctl
End Sub
Function ButtonMsg(strTitle)
MsgBox strTitle
End Function
물론 이러한 작업은 지금까지 액세스 프로그래밍의 경험상
큰 의미는 없어보이지만
일단 안되는 부분에 대한 이유는 이해 하셨으리라 생각됩니다.
액세스 베이직과 비주얼베이직, 엑셀 베이직 등이 완전히 동일한 것은 아니라는 것을
명심하십시오.
각 어플리케이션에 편리한 형태로 변형되어 있는 것이지요.
따라서 액세스의 기능을 충분히 활용할 수 있도록 작업을 하셔야 합니다.
그럼 ...:))
==============[김규경님 글에 대한 답변입니다]==============
액세스에서 클래스모듈이 필요없다는 것이 아니라
질문하신 작업에는 굳이 클래스모듈을 적용하지 않아도 된다는 겁니다.
여러 커맨드버튼의 클릭이벤트에 동일한 작업을 적용하고자 한다면
but(i).button.OnClick = "=ButtonMsg(" & i & ")" 와 같이
그냥 버튼을 모두 선택한 다음 속성창에서 OnClick 속성에 해당 함수이름을 적어 넣어버리면 끝나는 것이지요.
=ButtonMsg()
Function ButtonMsg()
MsgBox ActiveControl.Caption
기타 작업....
Select Case ActiveControl.Caption
Case "1"
Case "2"
.....
End Select
End Function
이미 액세스에서는 초보들이 사용하기 어려운 클래스를 이용하지 않도록
사용하기 편리하게 만들어 두었다는 것입니다.
클래스는 하나의 작업단위 개체인 것입니다.
디비 프로그램에서 클래스는 대개 데이타 로직을 만드는데 많이 사용합니다. 액세스는 데이타베이스 프로그램이므로 데이타 관련작업에 클래스를 많이 사용하지 않도록 이미 인터페이스가 만들어져 있습니다. 액세스에서 언바운드 폼을 이용하는 경우 데이타 클래스는 유용하게 쓰입니다.
책이나 인터넷싸이트 정보는 저도 없습니다.
OOP의 기본개념이므로 관련 책자들을 많이 읽어보십시오.
액세스 고급과정의 원서를 보시면 많이 있지않을까 생각됩니다.
|
|