나눔터  
  HOME > 나눔터 > 묻고답하기 > 액세스
액세스
액세스에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 김규경 (k3dragon)

추천:  0
파일:     조회:  616
제목:   OOP의 기본개념이므로 관련 책자들을 많이 읽어보십시오.
     
  * 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.

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의 기본개념이므로 관련 책자들을 많이 읽어보십시오.
액세스 고급과정의 원서를 보시면 많이 있지않을까 생각됩니다.

 
[불량 게시물 신고]  
페르바쁘신데도 답변해주셔서 감사합니다. 많은 도움 되었습니다^^12-04 (09:32)
삭제 ■신고
김규경http://safari.informit.com/ ;
이곳에 가보시면 영문이지만 무료 Online Book도 있고
기타 여러 책들의 내용들이 소개되어 있어 책을 고르시는데 도움이 될 수있을 것입니다.

참고하십시오.
12-04 (10:01)
삭제 ■신고
탠저린덧붙이자면 사실 엑세스의 각 폼에 할당되어 있는 이벤트 - 예를 들어 private sub form_load() 같은 - 들이 모두 클래스 모듈의 기능을 쓴다고 생각하시면 됩니다. 그렇기 때문에 모든 폼에서 재사용이 가능할 수 있는 것이죠. 이런 클래스모듈의 처리방식은 우리가 알 수도 없고, 알 필요도 없죠. 그냥 가져다 잘 쓰기만 하면 되는 것입니다. 그러나 클래스모듈은 고급 개발자가 되기 위해선 필수적으로 넘어야 될 부분이라고 생각합니다. 재사용이 가능한 코드를 만들기 위해서, 그리고 대형 프로그램에서 반복적인 코드작업을 줄이기 위해서 많이 사용하는 것이 클래스모듈이라고 생각합니다.
12-06 (16:33)
삭제 ■신고
        
  

작성일 : 2002-12-04(08:41)
최종수정일 : 2002-12-04(08:41)
 


 ◎ 관련글

  제 목   작성자   날짜
클래스모듈질문 페르 2002-12-03
[RE]클래스모듈질문- 참~ 흥미로운 질문이였습니다. 김규경 2002-12-03
OOP의 기본개념이므로 관련 책자들을 많이 읽어보십시오. 김규경 2002-12-04