'sunRef/VB'에 해당되는 글 10건
- 2003.10.28 응용 프로그램 설정 관리(레지스트리 등록)
- 2003.10.24 커서 타입과 락 타입의 속성
- 2003.10.22 코닥스캔 컨트롤
- 2003.10.22 컨트롤 사용법
- 2003.10.22 오라클 디비 연결
- 2003.10.22 print
- 2003.10.22 강좌1
- 2003.10.22 클래스 설명 상세히
- 2003.10.22 IP형식 알아보는 모듈
- 2003.10.22 메서드에 대한 간단한 강좌
Microsoft Windows 3.1과 이전 버전의 Windows에서는 대개 .ini 파일에 창 위치, 사용된 파일 그리고 다른 항목과 같은 프로그램 설정이 저장되어 있습니다. 그리고 Windows NT, Windows 95와 이후 버전의 Windows에서는 시스템 레지스트리에 이 프로그램 설정이 저장됩니다.
Visual Basic은 Visual Basic에서 만들어진 응용 프로그램에 대한 프로그램 정보를 저장하기 위해 아래와 같은 두 개의 표준 레지스트리를 제공합니다.
HKEY_CURRENT_USER\\Software\\VB와 VBA Program Settings\\appname\\section\\key
Visual Basic은 또한 응용 프로그램의 레지스트리 위치에 저장된 설정을 관리하기 위해 네 가지 문과 함수를 제공합니다.
함수 또는 문 설명
GetSetting 함수 레지스트리 설정을 검색합니다.
SaveSetting 문 레지스트리 설정을 저장하거나 작성합니다.
GetAllSettings 함수 다중 레지스트리 설정을 포함한 배열을 반환합니다.
DeleteSetting 문 레지스트리 설정을 삭제합니다.
Visual Basic은 Visual Basic에서 만들어진 응용 프로그램에 대한 프로그램 정보를 저장하기 위해 아래와 같은 두 개의 표준 레지스트리를 제공합니다.
HKEY_CURRENT_USER\\Software\\VB와 VBA Program Settings\\appname\\section\\key
Visual Basic은 또한 응용 프로그램의 레지스트리 위치에 저장된 설정을 관리하기 위해 네 가지 문과 함수를 제공합니다.
함수 또는 문 설명
GetSetting 함수 레지스트리 설정을 검색합니다.
SaveSetting 문 레지스트리 설정을 저장하거나 작성합니다.
GetAllSettings 함수 다중 레지스트리 설정을 포함한 배열을 반환합니다.
DeleteSetting 문 레지스트리 설정을 삭제합니다.
ADO 커서 라이브러리
Remote Data Service(RDS) 기술의 일부인 ActiveX Data Objects(ADO) 커서 제공자는
다음 표에 나와 있는 대로 몇 가지 커서 형식을 제공합니다.
커서 형식 상수
앞으로 전용 커서 AdOpenForwardOnly
키 집합 커서 AdOpenKeyset
동적 커서 AdOpenDynamic
정적 커서 AdOpenStatic
데이터 원본과 선택된ADO 커서 라이브러리가 어떻게 다음 표의 잠금 옵션과 함께 병행
성을 관리하는지 제어할 수 있습니다.
잠금 형식 상수
독점 병행성 AdLockPessimistic
행 값을 사용한 공유 병행성 AdLockOptimistic
읽기 전용. 변경할 수 없음 AdLockReadOnly
모든 업데이트는 일괄 업데이트가 완료될 때가지 연기됨. 일괄 업데이트를 수행하려
면 키 집합 또는 정적 커서를 선택해야 함 AdLockBatchOptimistic
추가 정보 ADO 커서 옵션에 대한 자세한 내용은 MSDN Library Visual Studio 6.0의
"CursorType 속성"을 온라인 설명서에서 찾아보십시오. RDS와 그것이 어떻게 ADO를 사
용하여 커서 지원을 제공하는지에 대한 자세한 내용은 "Remote Data Service
Developer"s Guide"와 MSDN Library Visual Studio 6.0의 "원격 데이터 서비스 응용
프로그램의 이해"를 온라인 설명서에서 찾아보십시오. 복수 사용자가 동시에 사용하
는 상황을 처리하기 위한 잠금의 사용에 대한 자세한 내용은 이 장에서 커서 잠금을
사용한 병행성 관리를 참조하십시오
Remote Data Service(RDS) 기술의 일부인 ActiveX Data Objects(ADO) 커서 제공자는
다음 표에 나와 있는 대로 몇 가지 커서 형식을 제공합니다.
커서 형식 상수
앞으로 전용 커서 AdOpenForwardOnly
키 집합 커서 AdOpenKeyset
동적 커서 AdOpenDynamic
정적 커서 AdOpenStatic
데이터 원본과 선택된ADO 커서 라이브러리가 어떻게 다음 표의 잠금 옵션과 함께 병행
성을 관리하는지 제어할 수 있습니다.
잠금 형식 상수
독점 병행성 AdLockPessimistic
행 값을 사용한 공유 병행성 AdLockOptimistic
읽기 전용. 변경할 수 없음 AdLockReadOnly
모든 업데이트는 일괄 업데이트가 완료될 때가지 연기됨. 일괄 업데이트를 수행하려
면 키 집합 또는 정적 커서를 선택해야 함 AdLockBatchOptimistic
추가 정보 ADO 커서 옵션에 대한 자세한 내용은 MSDN Library Visual Studio 6.0의
"CursorType 속성"을 온라인 설명서에서 찾아보십시오. RDS와 그것이 어떻게 ADO를 사
용하여 커서 지원을 제공하는지에 대한 자세한 내용은 "Remote Data Service
Developer"s Guide"와 MSDN Library Visual Studio 6.0의 "원격 데이터 서비스 응용
프로그램의 이해"를 온라인 설명서에서 찾아보십시오. 복수 사용자가 동시에 사용하
는 상황을 처리하기 위한 잠금의 사용에 대한 자세한 내용은 이 장에서 커서 잠금을
사용한 병행성 관리를 참조하십시오
ImgScan1.ScanTo = FileOnly
ImgScan1.MultiPage = True
ImgScan1.PageOption = PromptToCreateNewFile
ImgScan1.FileType = JPG_File
strFileName = ImgAdmin1.GetUniqueName("c:\\my documents", "pic", "jpg")
ImgScan1.Image = "c:\\my documents" & "\\" & strFileName
ImgScan1.StartScan
ImgScan1.MultiPage = True
ImgScan1.PageOption = PromptToCreateNewFile
ImgScan1.FileType = JPG_File
strFileName = ImgAdmin1.GetUniqueName("c:\\my documents", "pic", "jpg")
ImgScan1.Image = "c:\\my documents" & "\\" & strFileName
ImgScan1.StartScan
오라클과 VB 연결하는 방법입니다. 물론 이 방법 말고도 ODBC, OO4O 등 여러가지 방법이 있지만, 제가 생각하기에는 이 방법이 간단한 것 같습니다.
*******************************************************************************************************************************
1. Oracle Client를 설치하고, 연결할 Oracle을 에 대한 설정을 한다.
2. DB connect Function(여기서 XXX 부분에 Oracle Client에서 설정한 값을 입력한다.)
- DB 연결이 필요한 부분에 아래 function을 호출한다.
Private Sub ConnectDB()
Set adoOraCon = New ADODB.Connection
With adoOraCon
.ConnectionString = "Provider=MSDAORA.1;Data Source=XXX;User ID=XXX;Password=XXX;Persist Security Info=True"
.ConnectionTimeout = 60
.Open
End With
End Sub
3. 모듈에 다음 function을 입력한다.
Option Explicit
Public adoOraCon As ADODB.Connection
' Procedure : GetRecordSet
' Description : 인자로 넘어오는 쿼리를 실행하고, 결과값을 RecordSet으로 반환
' Parameter : szSql(쿼리)
'Return Value : Recordset
Public Function GetRecordSet(ByVal szSql As String) As ADODB.Recordset
Dim adoRs As ADODB.Recordset
Set adoRs = New ADODB.Recordset
adoRs.Open szSql, adoOraCon, adOpenKeyset, adLockBatchOptimistic
'Recordset 반환
Set GetRecordSet = adoRs
Set adoRs = Nothing
End Function
' Procedure : ExecuteQuery
' Description : 인자로 넘어오는 쿼리를 실행하고 성공여부를 반환
' Parameter : szSql(쿼리)
'Return Value : True/False
Public Function ExecuteQuery(szSql As String) As Boolean
On Error GoTo ErrHandler
adoOraCon.Execute szSql
ExecuteQuery = True
Exit Function
ErrHandler:
If Err.Number <> 0 Then
MsgBox Err.Source & vbCrLf & Err.Description, vbExclamation, "쿼리 수행 오류"
ExecuteQuery = False
Err.Clear
End If
End Function
4. 원하는 쿼리를 만들어 모듈의 function을 실행한다.
- 일반적으로 값을 가지고 오는 Select Query이면, GetRecordSet를 실행하고,
- insert, delete와 같은 데이터 조작 쿼리인 경우에는 ExecuteQuery를 실행한다.
예) SELECT Query
Dim strSQL As String
Dim adoRs As ADODB.Recordset
'//IMPORTANT : 조회 쿼리 생성
strSQL = "SELECT * FROM TEST_TAB ORDER BY A_COL"
Set adoRs = GetRecordSet(strSQL)
While Not adoRs.EOF
'//IMPORTANT : 가지고 온 결과를 처리하는 부분
adoRs.MoveNext
Wend
adoRs.Close
Set adoRs = Nothing
예) Execute Query
Dim strSQL As String
strSQL = "INSERT INTO TEST_TAB(a_col, b_col, c_col, d_col) VALUES ('" & strName & "', '" & strKorean & "', '" & strMath & "', '" & strEnglish & "')"
If ExecuteQuery(strSQL) = False Then
Msgbox "실패"
Else
Msgbox "성공"
End If
*******************************************************************************************************************************
1. Oracle Client를 설치하고, 연결할 Oracle을 에 대한 설정을 한다.
2. DB connect Function(여기서 XXX 부분에 Oracle Client에서 설정한 값을 입력한다.)
- DB 연결이 필요한 부분에 아래 function을 호출한다.
Private Sub ConnectDB()
Set adoOraCon = New ADODB.Connection
With adoOraCon
.ConnectionString = "Provider=MSDAORA.1;Data Source=XXX;User ID=XXX;Password=XXX;Persist Security Info=True"
.ConnectionTimeout = 60
.Open
End With
End Sub
3. 모듈에 다음 function을 입력한다.
Option Explicit
Public adoOraCon As ADODB.Connection
' Procedure : GetRecordSet
' Description : 인자로 넘어오는 쿼리를 실행하고, 결과값을 RecordSet으로 반환
' Parameter : szSql(쿼리)
'Return Value : Recordset
Public Function GetRecordSet(ByVal szSql As String) As ADODB.Recordset
Dim adoRs As ADODB.Recordset
Set adoRs = New ADODB.Recordset
adoRs.Open szSql, adoOraCon, adOpenKeyset, adLockBatchOptimistic
'Recordset 반환
Set GetRecordSet = adoRs
Set adoRs = Nothing
End Function
' Procedure : ExecuteQuery
' Description : 인자로 넘어오는 쿼리를 실행하고 성공여부를 반환
' Parameter : szSql(쿼리)
'Return Value : True/False
Public Function ExecuteQuery(szSql As String) As Boolean
On Error GoTo ErrHandler
adoOraCon.Execute szSql
ExecuteQuery = True
Exit Function
ErrHandler:
If Err.Number <> 0 Then
MsgBox Err.Source & vbCrLf & Err.Description, vbExclamation, "쿼리 수행 오류"
ExecuteQuery = False
Err.Clear
End If
End Function
4. 원하는 쿼리를 만들어 모듈의 function을 실행한다.
- 일반적으로 값을 가지고 오는 Select Query이면, GetRecordSet를 실행하고,
- insert, delete와 같은 데이터 조작 쿼리인 경우에는 ExecuteQuery를 실행한다.
예) SELECT Query
Dim strSQL As String
Dim adoRs As ADODB.Recordset
'//IMPORTANT : 조회 쿼리 생성
strSQL = "SELECT * FROM TEST_TAB ORDER BY A_COL"
Set adoRs = GetRecordSet(strSQL)
While Not adoRs.EOF
'//IMPORTANT : 가지고 온 결과를 처리하는 부분
adoRs.MoveNext
Wend
adoRs.Close
Set adoRs = Nothing
예) Execute Query
Dim strSQL As String
strSQL = "INSERT INTO TEST_TAB(a_col, b_col, c_col, d_col) VALUES ('" & strName & "', '" & strKorean & "', '" & strMath & "', '" & strEnglish & "')"
If ExecuteQuery(strSQL) = False Then
Msgbox "실패"
Else
Msgbox "성공"
End If
Picture Box에 Line이나 Print 메소드를 이용해서 그래프나, 그림, 글씨등을 그린후
그 내용을 프린트 하려면,
꼭 다른 PictureBox를 사용하지 않아도 되더라구요.
Printer.PaintPicture Picture1.Image, 0, 0, Picture1.Width, Picture1.Height
Printer.EndDoc
이거를 아래처럼 한번 해봤걸랑요
Printer.PaintPicture Picture1.Image, 0, 0, Picture1.Width * 2, Picture1.Height * 2
Printer.EndDoc
이렇게 하면 2배가 확대가 되어 나옵니다.
참 *2 부분에서 꼭 정수가 아니더라도 되더라구요
2배가 약간 커서 1.8을 곱해봤더니 이것두 역시 만족하게 나왔습니다
그 내용을 프린트 하려면,
꼭 다른 PictureBox를 사용하지 않아도 되더라구요.
Printer.PaintPicture Picture1.Image, 0, 0, Picture1.Width, Picture1.Height
Printer.EndDoc
이거를 아래처럼 한번 해봤걸랑요
Printer.PaintPicture Picture1.Image, 0, 0, Picture1.Width * 2, Picture1.Height * 2
Printer.EndDoc
이렇게 하면 2배가 확대가 되어 나옵니다.
참 *2 부분에서 꼭 정수가 아니더라도 되더라구요
2배가 약간 커서 1.8을 곱해봤더니 이것두 역시 만족하게 나왔습니다
▨ 클래스
저는 표준모듈과 클래스모듈과의 차이점은 알고 있지만 어느때 표준과 클래스모듈을 적절히 사용을 해야 하는지에 대해서는 잘 모르겠습니다.
저는 사용자정의프로시져를 주로 이용을 하고 있거든요. (경력이 짧은 관계로..)
▨ 클래스의 요소
- 클래스에서는 외부에 공개를 할꺼냐 ..... Public
아니면 공개를 하지 않을꺼냐 ........... Private
라는 두가지로 선언을 할 수 있습니다.
- Public로 선언
Public로 선인이 되었다면 외부로부터 변수를 마음껏 사용을 할 수 있습니다.
여기서 마음껏이라는 건 접근을 허용할 뿐 아니라 그 값을 변화 시킬 수 있다는 얘기입니다.
쉽게 파일의 쓰기와 읽기 권한을 준다고 보시면 됩니다.
- Private로 선언
외부에서는 절대로 접근을 할 수 없으면 클래스(오브젝트)안에서만 사용을 할 수 있습니다.
▨ 클래스의 Property(속성)
속성 프로시져에는 Property Get와 Property Let라는 두개의 프로시져가 있습니다
만약 모두 Public로 선언을 한다면 외부로부터 값을 전달 받고 또 줄 수 있다는 겁니다.
- Property Get
Property Get는 외부에 자료를 전달 해줄때 사용을 합니다.
다른 말로는 클래스에 선언된 변수를 외부에 전달해줍니다.
사용방법은
Public Property Get MyData() As Integer
End Sub
- Property Let
Property Let는 외부에 자료를 전달 받을 때 사용을 합니다.
사용방법은
Public Property Let MyData(Value As Integer)
End Sub
만약에 표준모듈을 만들어서 사용 하실 수 있는 분이라면 위의 2개의 선언문에서 보는 봐와 같이 차이점을 알 수 있을 겁니다.
Get는 외부로부터 값을 전달 해준는 것....Function과 비슷
Let는 외부로부터 값을 전달 받는 것......Sub나 Function에 인수가 전달 받는 것
표준모듈로 설명을 하자면
Function MyData(Value1 as Integer, Value2 as Integer) as Integer
End Function
이건 외부에서 특정한 값(Value1, Value2)라는 값을 전달 받아서 특정한 일을 하고 그 결과 값을 Integer형으로 전달해주는 겁니다.
이걸 클래스에서는 따로 구분을 짓는 거죠.
전달 받는 것과 (Property Let) 전달 받은 걸 가지고 결과 값을 전달 해주는 것 (Property Get)으로
※ 참고로 VB.Net에서는 하나의 함수 안에 두개의 속성이 존재합니다.
▨ 예제
다음은 간단하게 숫자를 클래스에 전달하고 클래스에서는 전달 받은 값에 100을 더해서 그 결과 값을 다시 돌려주는 예제 입니다.
- 먼저 표준EXE에서 폼(Form1)과 클래스모듈(Class1)을 추가를 합니다.
- 폼에 Command Button을 하나 추가를 하고 아래와 같이 코드창에 코딩을 하고
F8(한단계씩 코드 실행)를 눌러서 한줄씩 실행을 시켜보면 소스에 있는 번호순서대로 실행을 합니다.
*** Class1에 ***
Private MyValue As Integer
4) Public Property Let MyData(Value As Integer)
5) MyValue = Value
6) End Property
8) Public Property Get MyData() As Integer
9) MyData = MyValue + 100
10) End Property
*** Form1에 ***
1) Private Sub Command1_Click()
Dim Result As Integer
Dim C1 As Class1
2) Set C1 = New Class1
3) C1.MyData = 100
7) Result = C1.MyData
11) MsgBoxt Result
End Sub
번호 3번에서 클래스의 Property Let의 프로시져(4번)로 이동을 하는 걸 알 수 있을 겁니다.
위에서 설명을 했듯 Property Let는 외부로부터 값을 전달 받는 것을 알 수 있을 겁니다.
반대로 7번에서 클래스의 값을 Result라는 변수에 저장을 할려고 할때는
클래스의 Property Get(8번)의 프로시져를 실행하는 것을 볼 수 있을 겁니다.
위 예제로 클래스에서 사용하는 두개의 프로시져에 대해서 설명을 했습니다.
오늘은 여기까지 입니다.
다음에는 위 소스를 가지고 좀 더 자세히 분석을 해보죠.
저는 표준모듈과 클래스모듈과의 차이점은 알고 있지만 어느때 표준과 클래스모듈을 적절히 사용을 해야 하는지에 대해서는 잘 모르겠습니다.
저는 사용자정의프로시져를 주로 이용을 하고 있거든요. (경력이 짧은 관계로..)
▨ 클래스의 요소
- 클래스에서는 외부에 공개를 할꺼냐 ..... Public
아니면 공개를 하지 않을꺼냐 ........... Private
라는 두가지로 선언을 할 수 있습니다.
- Public로 선언
Public로 선인이 되었다면 외부로부터 변수를 마음껏 사용을 할 수 있습니다.
여기서 마음껏이라는 건 접근을 허용할 뿐 아니라 그 값을 변화 시킬 수 있다는 얘기입니다.
쉽게 파일의 쓰기와 읽기 권한을 준다고 보시면 됩니다.
- Private로 선언
외부에서는 절대로 접근을 할 수 없으면 클래스(오브젝트)안에서만 사용을 할 수 있습니다.
▨ 클래스의 Property(속성)
속성 프로시져에는 Property Get와 Property Let라는 두개의 프로시져가 있습니다
만약 모두 Public로 선언을 한다면 외부로부터 값을 전달 받고 또 줄 수 있다는 겁니다.
- Property Get
Property Get는 외부에 자료를 전달 해줄때 사용을 합니다.
다른 말로는 클래스에 선언된 변수를 외부에 전달해줍니다.
사용방법은
Public Property Get MyData() As Integer
End Sub
- Property Let
Property Let는 외부에 자료를 전달 받을 때 사용을 합니다.
사용방법은
Public Property Let MyData(Value As Integer)
End Sub
만약에 표준모듈을 만들어서 사용 하실 수 있는 분이라면 위의 2개의 선언문에서 보는 봐와 같이 차이점을 알 수 있을 겁니다.
Get는 외부로부터 값을 전달 해준는 것....Function과 비슷
Let는 외부로부터 값을 전달 받는 것......Sub나 Function에 인수가 전달 받는 것
표준모듈로 설명을 하자면
Function MyData(Value1 as Integer, Value2 as Integer) as Integer
End Function
이건 외부에서 특정한 값(Value1, Value2)라는 값을 전달 받아서 특정한 일을 하고 그 결과 값을 Integer형으로 전달해주는 겁니다.
이걸 클래스에서는 따로 구분을 짓는 거죠.
전달 받는 것과 (Property Let) 전달 받은 걸 가지고 결과 값을 전달 해주는 것 (Property Get)으로
※ 참고로 VB.Net에서는 하나의 함수 안에 두개의 속성이 존재합니다.
▨ 예제
다음은 간단하게 숫자를 클래스에 전달하고 클래스에서는 전달 받은 값에 100을 더해서 그 결과 값을 다시 돌려주는 예제 입니다.
- 먼저 표준EXE에서 폼(Form1)과 클래스모듈(Class1)을 추가를 합니다.
- 폼에 Command Button을 하나 추가를 하고 아래와 같이 코드창에 코딩을 하고
F8(한단계씩 코드 실행)를 눌러서 한줄씩 실행을 시켜보면 소스에 있는 번호순서대로 실행을 합니다.
*** Class1에 ***
Private MyValue As Integer
4) Public Property Let MyData(Value As Integer)
5) MyValue = Value
6) End Property
8) Public Property Get MyData() As Integer
9) MyData = MyValue + 100
10) End Property
*** Form1에 ***
1) Private Sub Command1_Click()
Dim Result As Integer
Dim C1 As Class1
2) Set C1 = New Class1
3) C1.MyData = 100
7) Result = C1.MyData
11) MsgBoxt Result
End Sub
번호 3번에서 클래스의 Property Let의 프로시져(4번)로 이동을 하는 걸 알 수 있을 겁니다.
위에서 설명을 했듯 Property Let는 외부로부터 값을 전달 받는 것을 알 수 있을 겁니다.
반대로 7번에서 클래스의 값을 Result라는 변수에 저장을 할려고 할때는
클래스의 Property Get(8번)의 프로시져를 실행하는 것을 볼 수 있을 겁니다.
위 예제로 클래스에서 사용하는 두개의 프로시져에 대해서 설명을 했습니다.
오늘은 여기까지 입니다.
다음에는 위 소스를 가지고 좀 더 자세히 분석을 해보죠.
*** Class1에 ***
'클래스에 보면 MyValue라는 변수가 선언이 된 걸 볼 수 있을 겁니다.
'이 변수는 오로직 클래스에서만 사용을 하며 외부에서는 절대로 사용할 수 없습니다.
'이유는 저번에 설명을 했듯 변수가 선언이 될때 Private로 선언을 해서 입니다.
Private MyValue As Integer
'이 프로시져는 외부에서 값을 전달 받을 때 사용을 합니다.
'Form1에서 'C1.MyData = 100'라고 100이라는 값을 클래스에 전달을
'해주는 것입니다.
Public Property Let MyData(Value As Integer)
'외부에서 전달 받은 값(100)을 클래스 안에서만 사용이 가능한 변수(MyValue)에 집어 넣습니다.
MyValue = Value
End Property
'외부로 값을 전달해주는 프로시져로써
'클래스 안에서만 사용가능한 MyValue에 100을 더해서 외부로 전달을 해줍니다.
Public Property Get MyData() As Integer
MyData = MyValue + 100
End Property
*** Form1에 ***
Private Sub Command1_Click()
Dim Result As Integer
'참조변수를 선언을 합니다.
Dim C1 As Class1
'인스턴스를 생성(New)을 합니다.
Set C1 = New Class1
'숫자 100을 인스턴스로 생성된 C1의 MyData에 전달을 한다.
'이때 클래스의 Property Let MyData를 실행을 해서
'클래스에 선언된 MyValue라는 변수에 전달을 한다
C1.MyData = 100
'클래스의 MyData라는 프로시져를 실행 후 전달 받은 값을
'Result라는 변수에 전달을 한다.
Result = C1.MyData
MsgBoxt Result
'Nothing으로 New로 생성된 C1을 메모리에 소멸시킴
'Nothing을 하지않으면 메모리등의 자원을 그대로 잠식하기 때문에
'New가 있으면 Nothing이 꼭 있어 합니다.
Set C1 = Nothing
End Sub
다음 예제는 1부터 100까지 숫자를 클래스에서 구해서 그 결과값을 전달해주는 예제 입니다.
위 예제와 틀린 점은 외부에서 특정한 값을 전달 받는 것이 없습니다.
그러므로 Public Property Let라는 프로시져는 필요하지 않습니다.
무조건 외부에 값을 절달해주는 Public Property Get프로시져만 필요한 겁니다.
이 예제도 F5 대신 F8를 눌러서 한단계씩 실행을 시켜가면서 어떤식으로 실행이 되는지 확인을 해보시길...
다음 강좌에서는 클래스의 Method(메서드)에 관해서 설명을 하겠습니다.
'클래스에 보면 MyValue라는 변수가 선언이 된 걸 볼 수 있을 겁니다.
'이 변수는 오로직 클래스에서만 사용을 하며 외부에서는 절대로 사용할 수 없습니다.
'이유는 저번에 설명을 했듯 변수가 선언이 될때 Private로 선언을 해서 입니다.
Private MyValue As Integer
'이 프로시져는 외부에서 값을 전달 받을 때 사용을 합니다.
'Form1에서 'C1.MyData = 100'라고 100이라는 값을 클래스에 전달을
'해주는 것입니다.
Public Property Let MyData(Value As Integer)
'외부에서 전달 받은 값(100)을 클래스 안에서만 사용이 가능한 변수(MyValue)에 집어 넣습니다.
MyValue = Value
End Property
'외부로 값을 전달해주는 프로시져로써
'클래스 안에서만 사용가능한 MyValue에 100을 더해서 외부로 전달을 해줍니다.
Public Property Get MyData() As Integer
MyData = MyValue + 100
End Property
*** Form1에 ***
Private Sub Command1_Click()
Dim Result As Integer
'참조변수를 선언을 합니다.
Dim C1 As Class1
'인스턴스를 생성(New)을 합니다.
Set C1 = New Class1
'숫자 100을 인스턴스로 생성된 C1의 MyData에 전달을 한다.
'이때 클래스의 Property Let MyData를 실행을 해서
'클래스에 선언된 MyValue라는 변수에 전달을 한다
C1.MyData = 100
'클래스의 MyData라는 프로시져를 실행 후 전달 받은 값을
'Result라는 변수에 전달을 한다.
Result = C1.MyData
MsgBoxt Result
'Nothing으로 New로 생성된 C1을 메모리에 소멸시킴
'Nothing을 하지않으면 메모리등의 자원을 그대로 잠식하기 때문에
'New가 있으면 Nothing이 꼭 있어 합니다.
Set C1 = Nothing
End Sub
다음 예제는 1부터 100까지 숫자를 클래스에서 구해서 그 결과값을 전달해주는 예제 입니다.
위 예제와 틀린 점은 외부에서 특정한 값을 전달 받는 것이 없습니다.
그러므로 Public Property Let라는 프로시져는 필요하지 않습니다.
무조건 외부에 값을 절달해주는 Public Property Get프로시져만 필요한 겁니다.
이 예제도 F5 대신 F8를 눌러서 한단계씩 실행을 시켜가면서 어떤식으로 실행이 되는지 확인을 해보시길...
다음 강좌에서는 클래스의 Method(메서드)에 관해서 설명을 하겠습니다.
Public Function IsStrIP(strIp As String) As Boolean
'문법에 맞는 아이피냐? 아니냐?
'000.000.000.000, 127.0.0.1
'각 숫자는 무조건 0보다 크고 255보다 작아야 한다. 단, 로컬 아이피인 127.0.0.1의 경우 가운데 숫자들이 0이므로
'이것을 처리할 수 있어야 한다.
Dim SplitIP() As String
Dim i As Byte
'최대 자릿수인 15자리수가 넘어갔을 경우와 최소 자릿수인 7자리수가 안될 경우
If Len(strIp) > 15 Or Len(strIp) < 7 Then GoTo msgerr
'-------------- 1처리 -----------------
SplitIP = Split(strIp, ".")
'--------------------------------------
'dot(점으)로 나눈 숫자들이 3(=4)과 같지 않으면 아이피가 아닌것으로 판정함.
If UBound(SplitIP) <> 3 Then GoTo msgerr
'나눈 문자열들 중 255보다 크거나 0보다 작을 때 및 빈문자열일 경우 아이피 아님판정
For i = 0 To UBound(SplitIP) '딱 4개로 떨어지지만 확실하게 하기 위해 Ubound사용
If val(SplitIP(i)) > &HFF Or val(SplitIP(i)) < 0 Or SplitIP(i) = "" Then
If (i = 1 Or i = 2) And val(SplitIP(i)) = 0 Then '가운데 숫자는 넘기기
Else
GoTo msgerr
End If
End If
Next
IsStrIP = True
Exit Function
msgerr:
IsStrIP = False
End Function
Public Function GetNonzeroIpAddress(IpStr As String) As String
'아래는 화면디스플레이할 때 자릿수에 맞춰 보기 좋게 하기 위해서 무조건 3자리로 표시합니다.
'예를 들어 192.168.004.188 이런식으로 화면 디스플레이 합니다.
'그런데 이런 상태로 통신하면 안되죠. 이것을 다시 192.168.4.188로 만들기 위한 함수입니다.
Dim pos As Integer
Dim temp_ipstr As String
Dim IPaddr(4) As String
Dim I As Integer
temp_ipstr = IpStr
For I = 1 To 4
pos = InStr(temp_ipstr, ".")
If pos < 0 Then
GetNonzeroIpAddress = ""
Exit Function
ElseIf pos = 0 Then
IPaddr(I) = temp_ipstr
temp_ipstr = ""
Else
IPaddr(I) = Left(temp_ipstr, pos - 1)
temp_ipstr = Mid(temp_ipstr, pos + 1)
End If
While Left(IPaddr(I), 1) = "0"
IPaddr(I) = Mid(IPaddr(I), 2)
Wend
Next
GetNonzeroIpAddress = IPaddr(1) & "." & IPaddr(2) & "." & IPaddr(3) & "." & IPaddr(4)
End Function
Public Function GetPushZeroIP(IpStr As String) As String
'아래 함수는 위의 함수가 하는일의 반대일을 합니다. 화면 디스플레이를 보기 좋게 하기 위해
'세자리 씩 끊어주는 함수죠
Dim IPaddr() As String, I As Byte
IPaddr() = Split(IpStr, ".")
For I = 0 To UBound(IPaddr)
IPaddr(I) = Format(IPaddr(I), "000")
Next
GetPushZeroIP = IPaddr(0) & "." & IPaddr(1) & "." & IPaddr(2) & "." & IPaddr(3)
End Function
'아래 함수는 스트링 형식으로 되어있는 아이피를 바이트 배열로 다시 Long타입으로
'바꿔주는 함수입니다.
'일반적으로 잘 안쓰이지만 장비계통일 하다보면 장비의 아이피를 설정할때 쓰이게
'되는데 장비와 아이피 스트링을 주고 받으려면 Long타입으로 주고 받을 때 사용됩니다.
Public Function GetIptoLong(IPString As String) As Long
Dim longip As Long
Dim nCnt As Byte
Dim value(4) As Byte
Dim strTemp() As String
If IPString = "" Then Exit Function
strTemp = Split(IPString, ".")
For nCnt = 0 To 3
value(nCnt) = val(strTemp(nCnt))
Next
CopyMemory longip, value(0), 4
GetIptoLong = longip
End Function
Public Function GetLongtoIp(ByVal longip As Long) As String
'아래함수는 위의 함수 역기능을 하는 함수로 Long타입으로 되어 있는 것을
'아이피 스트링 타입으로 변환합니다.
Dim value(3) As Byte
Dim nCnt As Byte
CopyMemory value(0), longip, 4
For nCnt = 0 To 3
If value(nCnt) > 255 Then
GetLongtoIp = "ERR"
Exit Function
End If
Next
GetLongtoIp = CStr(value(0)) & "." & CStr(value(1)) & "." & _
CStr(value(2)) & "." & CStr(value(3))
End Function
'문법에 맞는 아이피냐? 아니냐?
'000.000.000.000, 127.0.0.1
'각 숫자는 무조건 0보다 크고 255보다 작아야 한다. 단, 로컬 아이피인 127.0.0.1의 경우 가운데 숫자들이 0이므로
'이것을 처리할 수 있어야 한다.
Dim SplitIP() As String
Dim i As Byte
'최대 자릿수인 15자리수가 넘어갔을 경우와 최소 자릿수인 7자리수가 안될 경우
If Len(strIp) > 15 Or Len(strIp) < 7 Then GoTo msgerr
'-------------- 1처리 -----------------
SplitIP = Split(strIp, ".")
'--------------------------------------
'dot(점으)로 나눈 숫자들이 3(=4)과 같지 않으면 아이피가 아닌것으로 판정함.
If UBound(SplitIP) <> 3 Then GoTo msgerr
'나눈 문자열들 중 255보다 크거나 0보다 작을 때 및 빈문자열일 경우 아이피 아님판정
For i = 0 To UBound(SplitIP) '딱 4개로 떨어지지만 확실하게 하기 위해 Ubound사용
If val(SplitIP(i)) > &HFF Or val(SplitIP(i)) < 0 Or SplitIP(i) = "" Then
If (i = 1 Or i = 2) And val(SplitIP(i)) = 0 Then '가운데 숫자는 넘기기
Else
GoTo msgerr
End If
End If
Next
IsStrIP = True
Exit Function
msgerr:
IsStrIP = False
End Function
Public Function GetNonzeroIpAddress(IpStr As String) As String
'아래는 화면디스플레이할 때 자릿수에 맞춰 보기 좋게 하기 위해서 무조건 3자리로 표시합니다.
'예를 들어 192.168.004.188 이런식으로 화면 디스플레이 합니다.
'그런데 이런 상태로 통신하면 안되죠. 이것을 다시 192.168.4.188로 만들기 위한 함수입니다.
Dim pos As Integer
Dim temp_ipstr As String
Dim IPaddr(4) As String
Dim I As Integer
temp_ipstr = IpStr
For I = 1 To 4
pos = InStr(temp_ipstr, ".")
If pos < 0 Then
GetNonzeroIpAddress = ""
Exit Function
ElseIf pos = 0 Then
IPaddr(I) = temp_ipstr
temp_ipstr = ""
Else
IPaddr(I) = Left(temp_ipstr, pos - 1)
temp_ipstr = Mid(temp_ipstr, pos + 1)
End If
While Left(IPaddr(I), 1) = "0"
IPaddr(I) = Mid(IPaddr(I), 2)
Wend
Next
GetNonzeroIpAddress = IPaddr(1) & "." & IPaddr(2) & "." & IPaddr(3) & "." & IPaddr(4)
End Function
Public Function GetPushZeroIP(IpStr As String) As String
'아래 함수는 위의 함수가 하는일의 반대일을 합니다. 화면 디스플레이를 보기 좋게 하기 위해
'세자리 씩 끊어주는 함수죠
Dim IPaddr() As String, I As Byte
IPaddr() = Split(IpStr, ".")
For I = 0 To UBound(IPaddr)
IPaddr(I) = Format(IPaddr(I), "000")
Next
GetPushZeroIP = IPaddr(0) & "." & IPaddr(1) & "." & IPaddr(2) & "." & IPaddr(3)
End Function
'아래 함수는 스트링 형식으로 되어있는 아이피를 바이트 배열로 다시 Long타입으로
'바꿔주는 함수입니다.
'일반적으로 잘 안쓰이지만 장비계통일 하다보면 장비의 아이피를 설정할때 쓰이게
'되는데 장비와 아이피 스트링을 주고 받으려면 Long타입으로 주고 받을 때 사용됩니다.
Public Function GetIptoLong(IPString As String) As Long
Dim longip As Long
Dim nCnt As Byte
Dim value(4) As Byte
Dim strTemp() As String
If IPString = "" Then Exit Function
strTemp = Split(IPString, ".")
For nCnt = 0 To 3
value(nCnt) = val(strTemp(nCnt))
Next
CopyMemory longip, value(0), 4
GetIptoLong = longip
End Function
Public Function GetLongtoIp(ByVal longip As Long) As String
'아래함수는 위의 함수 역기능을 하는 함수로 Long타입으로 되어 있는 것을
'아이피 스트링 타입으로 변환합니다.
Dim value(3) As Byte
Dim nCnt As Byte
CopyMemory value(0), longip, 4
For nCnt = 0 To 3
If value(nCnt) > 255 Then
GetLongtoIp = "ERR"
Exit Function
End If
Next
GetLongtoIp = CStr(value(0)) & "." & CStr(value(1)) & "." & _
CStr(value(2)) & "." & CStr(value(3))
End Function
오늘은 메서드에 관해 이야기를 하려고 합니다.
F8을 눌러서 한라인씩 실행을 시켜서 실행을 해보십시오.
어떻게 클래스에서 선언된 메서드를 호출하고 어떻게 동작이 되는지 알아 보십시오.
▨ 클래스의 메서드(Method)
오늘은 클래스의 메서드에 대해서 진행을 하겠습니다.
메서드는 일종의 프로시져(Sub, Function)이며 글래스 모듈에서 작성이되면 일반적으로 메tj드라고 부립니다.
클래스에서의 메소드란 표준모듈의 사용자 정의 프로시져와 같습니다.
메tj드도 Public과 Private로 선언을 해서 사용을 하며 어느것으로 선언을 했는지에 따라서 외부로부터 호출을 할 수 있는지 없는지
결정을 할 수 있습니다.
저번 강좌에서 했던 1부터 100까지 구하는 예제는 메소드를 이용하지 않고 사용을 했는데 좋은 방법은 아님니다.
Property Get 프로시져는 오로직 외부로부터 값을 전달만 해주는 기능으로만 이용을 하는 것이 바람직합니다.
다음 예제는 1부터 100까지 구하는 메소드입니다.
Public Sub Compute()
Dim i%
Dim Tot%
Tot = 0
For i = 1 To MyValue
Tot = Tot + i
Next
MyValue = Tot
End Sub
기존에 표준모듈에서 사용을 하던 사용자 정의프로시져와 비슷하다는 걸 알 수 있을 겁니다.
단지 틀린 점은 100까지 구한 결과를 MyValue라는 클래스에서 선언된 변수에 넣는다는 점입니다.
▨ 클래스 메소드 예제
이번 예제는 1부터 100까지 합을 구하는 방법을 클래스의 메서드와 표준모듈의 사용자정의프로시져를 이용해서 그 결과값을 구하는 예제 입니다.
소스에 각 Command Button의 Click이벤트를 보면 클래스의 메소드보다 사용자정의 프로시져를 이용하는 것이 훨씬 소스의 간결함을 볼 수 있을 겁니다.
하지만 표준모듈에서는 이벤트를 만들 수 없다는 단점이 있습니다.
이 클래스이벤트는 나중에 설명을 하지요.
폼에 Command Button을 2개 추가를 하고 표준모듈과 클래스모듈을 각각 하나씩 추가를 합니다.
*** Form1 ***
Private Sub Command1_Click()
Dim Result As Integer
Dim C1 As Class1
Set C1 = New Class1
C1.MyData = 100
C1.Compute '클래스의 메서드를 호출합니다.
Result = C1.MyData
MsgBox "클래스에서 구한 결과 값 " & Result
Set C1 = Nothing
End Sub
Private Sub Command2_Click()
Dim Result As Integer
Result = Compute(100)
MsgBox "사용자 정의 프로시져에서 구한 결과 값 " & Result
End Sub
*** Class1 ***
Private MyValue As Integer
Public Property Let MyData(Value As Integer)
MyValue = Value '외부에서 값을 전달 받는다
End Property
Public Property Get MyData() As Integer
MyData = MyValue '내부에서 사용한 변수의 값을 외부로 전달한다
End Property
Public Sub Compute()
Dim i As Integer
Dim Tot As Integer
Tot = 0
For i = 1 To MyValue 'Property Let로 전달 받은 값으로 반복문을 실행
Tot = Tot + i
Next
MyValue = Tot '반복된 결과값을 내부에서 사용하는 변수에 저장
End Sub
*** Module1 ***
Public Function Compute(Value As Integer) As Integer
Dim i As Integer
Dim Tot As Integer
Tot = 0
For i = 1 To Value
Tot = Tot + i
Next
Compute = Tot
End Function
F8을 눌러서 한라인씩 실행을 시켜서 실행을 해보십시오.
어떻게 클래스에서 선언된 메서드를 호출하고 어떻게 동작이 되는지 알아 보십시오.
▨ 클래스의 메서드(Method)
오늘은 클래스의 메서드에 대해서 진행을 하겠습니다.
메서드는 일종의 프로시져(Sub, Function)이며 글래스 모듈에서 작성이되면 일반적으로 메tj드라고 부립니다.
클래스에서의 메소드란 표준모듈의 사용자 정의 프로시져와 같습니다.
메tj드도 Public과 Private로 선언을 해서 사용을 하며 어느것으로 선언을 했는지에 따라서 외부로부터 호출을 할 수 있는지 없는지
결정을 할 수 있습니다.
저번 강좌에서 했던 1부터 100까지 구하는 예제는 메소드를 이용하지 않고 사용을 했는데 좋은 방법은 아님니다.
Property Get 프로시져는 오로직 외부로부터 값을 전달만 해주는 기능으로만 이용을 하는 것이 바람직합니다.
다음 예제는 1부터 100까지 구하는 메소드입니다.
Public Sub Compute()
Dim i%
Dim Tot%
Tot = 0
For i = 1 To MyValue
Tot = Tot + i
Next
MyValue = Tot
End Sub
기존에 표준모듈에서 사용을 하던 사용자 정의프로시져와 비슷하다는 걸 알 수 있을 겁니다.
단지 틀린 점은 100까지 구한 결과를 MyValue라는 클래스에서 선언된 변수에 넣는다는 점입니다.
▨ 클래스 메소드 예제
이번 예제는 1부터 100까지 합을 구하는 방법을 클래스의 메서드와 표준모듈의 사용자정의프로시져를 이용해서 그 결과값을 구하는 예제 입니다.
소스에 각 Command Button의 Click이벤트를 보면 클래스의 메소드보다 사용자정의 프로시져를 이용하는 것이 훨씬 소스의 간결함을 볼 수 있을 겁니다.
하지만 표준모듈에서는 이벤트를 만들 수 없다는 단점이 있습니다.
이 클래스이벤트는 나중에 설명을 하지요.
폼에 Command Button을 2개 추가를 하고 표준모듈과 클래스모듈을 각각 하나씩 추가를 합니다.
*** Form1 ***
Private Sub Command1_Click()
Dim Result As Integer
Dim C1 As Class1
Set C1 = New Class1
C1.MyData = 100
C1.Compute '클래스의 메서드를 호출합니다.
Result = C1.MyData
MsgBox "클래스에서 구한 결과 값 " & Result
Set C1 = Nothing
End Sub
Private Sub Command2_Click()
Dim Result As Integer
Result = Compute(100)
MsgBox "사용자 정의 프로시져에서 구한 결과 값 " & Result
End Sub
*** Class1 ***
Private MyValue As Integer
Public Property Let MyData(Value As Integer)
MyValue = Value '외부에서 값을 전달 받는다
End Property
Public Property Get MyData() As Integer
MyData = MyValue '내부에서 사용한 변수의 값을 외부로 전달한다
End Property
Public Sub Compute()
Dim i As Integer
Dim Tot As Integer
Tot = 0
For i = 1 To MyValue 'Property Let로 전달 받은 값으로 반복문을 실행
Tot = Tot + i
Next
MyValue = Tot '반복된 결과값을 내부에서 사용하는 변수에 저장
End Sub
*** Module1 ***
Public Function Compute(Value As Integer) As Integer
Dim i As Integer
Dim Tot As Integer
Tot = 0
For i = 1 To Value
Tot = Tot + i
Next
Compute = Tot
End Function