1. 동적으로 컨트롤을 생성하는 방법은 ?
폼위에 동적으로 컨트롤을 생성하여 사용하는 방법을 알고 싶습니다.먼저 ActiveX 컨트롤은 다음과 같습니다.
' WithEvents를 써주면 이벤트도 받아서 처리할 수 있습니다. Dim WithEvents gCtObj As VBControlExtender ' Content 컨트롤을 가리키는 객체 ' Add의 첫번째 인자는 생성하려는 컨트롤의 ProgID ' 두번째 인자는 생성하려는 컨트롤의 이름 ' 세번째 인자는 생성되는 컨트롤이 올라갈 폼 Set gCtObj = Controls.Add("SIMGCTL.SimgctlCtrl.1", "myctl", Me)이렇게 만들어진 컨트롤을 삭제하려면 다음 코드를 사용합니다.
Controls.Remove "myctl"이렇게 만들어진 컨트롤에서 발생하는 이벤트를 받으려면 ObjectEvent라는 함수를 정의해주면 됩니다. 변수이름_ObjectEvent 형태로 이름이 만들어진다는 점에 주의하시기 바랍니다.
Private Sub gCtObj_ObjectEvent(Info As EventInfo) ' 인자인 Info의 Name 필드로 이벤트 이름이 들어옵니다. If Info.Name = "Click" Then ......... End If End Sub다음은 Intrinsic 컨트롤입니다. Intrinsic 컨트롤의 타입은 VB.TextBox, VB.Label등과 같이 줄 수 있습니다. 다음 예를 참조하시기 바랍니다.
// 다음 예는 텍스트 컨트롤을 하나 생성하고 그것의 내용으로 Sample을 올린다. Dim WithEvents gEdit As VB.TextBox Set gEdit = Controls.Add("VB.TextBox", "text1", Form1) gEdit.Text = "Sample" gEdit.Move 0, 0, 3000, 300 gEdit.Visible = True이렇게 만들어진 컨트롤에서 발생하는 이벤트를 받으려면 해당 컨트롤이 디자인 타임에 form위에 추가된 것처럼 이벤트 처리 함수를 만들어 주면 됩니다. 예를 들어 위의 경우에서 Click 이벤트를 처리하려면 다음과 같은 함수를 만듭니다.
Private Sub gEdit_Click() MsgBox "Clicked#1" End Sub
2. 전역 변수와 API 선언문의 위치는 ?
전체 form에서 공유되는 변수와 API의 선언은 어디에서 해주는 것이 가장 좋습니까 ?3. 컴포넌트 생성 방법
Dim ie As New InternetExplorer ' 변수의 정의와 동시에 컴포넌트를 생성한다. ie.Visible = True다음은 CreateObject의 사용 예(1)입니다. 여기서는 변수를 미리 InternetExplorer 타입으로 정의해 놓고 컴포넌트를 생성했기 때문에 호출시에 이름 결정(Name resolution)이 일어나지 않기 때문에 호출 속도가 빠릅니다.
Dim ie As InternetExplorer Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True다음은 CreateObject의 사용 예(2)입니다. 여기서는 변수가 범용 컴포넌트를 나타내는 Object 타입으로 정의해 놓고 컴포넌트를 생성했기 때문에 호출시에 이름 결정 과정이 추가되기 때문에 호출 속도가 앞의 예(1)에 비해 느립니다. 이름 결정 과정이란 컴포넌트에 실제로 호출하려는 메소드나 프로퍼티가 존재하는지 살펴보고 그것을 부른다는 의미로 실제 호출에 앞서 이 과정이 들어가기 때문에 느려지게 됩니다. 또한 실행시간에 존재여부를 따지기 때문에 에러가 발생할 수 있습니다.
4. VB 프로그램의 최적화 방법
- 적절한 타입의 변수를 선언해 사용한다.
- Const 키워드를 자주 사용한다.
- Splash 스크린을 적절히 사용한다.
- 자주 사용되는 폼만 메모리에 로드해둔다.
- 사용되는 컨트롤의 수를 최소화한다. - Advanced 버튼의 사용
- 폼의 수를 최소화한다.
- COM 객체 사용시 Early-bind한다.
- 배열은 되도록이면 사용하지 않는다.
- 사용되지 않는 코드를 제거한다.
- 작업이 긴 시간동안 지속될 경우에는 사용자에게 비주얼한 피드백을 제공한다.
5. IE상의 컨트롤에서 HTML의 Document Object Model 접근 방법
IE상의 컨트롤에서 자신이 올라가 있는 Document Object Model을 접근할 수 있는지 있다면 어떻게 해야하는지 그 방법을 알고 싶습니다.6. 모니터 화면의 해상도 알아내기
ActiveControl | 현재 포커스를 갖고 있는 컨트롤에 대한 레퍼런스 |
ActiveForm | 현재 활성화되어 있는 폼에 대한 레퍼런스 |
Height, Width | 현재 화면의 높이와 폭(픽셀 단위). 읽기 전용 |
MouseIcon | 커스텀 마우스 포인터의 모양을 지정한다.. LoadPicture와 같은 함수로 설정 가능 |
MousePointer | 마우스 포인터의 모양을 지정한다. MouseIcon으로 지정한 모양을 쓰려면 99를 지정 |
TwipsPerPixelX, TwipsPerPixelY | 한 픽셀당 트윕의 수(가로 방향, 세로 방향) |
7. VB로 만든 프로그램에서 자신의 버전 정보 보기
VB로 만든 프로그램에서 실행 중의 자신의 버전 정보를 보려면 어떻게 해야합니까 ?8. RDS를 이용한 원격 객체 생성
Dim iBLL As Object ' HTTP로 연결시 Set iBLL = CreateObject("Bank.Application", "HTTP://www.koreabank.com") ' HTTPS로 연결시 Set iBLL = CreateObject("Bank.Application", "HTTPS://www.koreabank.com") ' DCOM으로 연결시. MyServer는 서버의 컴퓨터 이름 Set iBLL = CreateObject("Bank.Application", "MyServer")
9. 조건부 컴파일 방법
VB에서 조건부 컴파일하는 방법을 알고 싶습니다.#Const DebugVersion = 1 ' DebugVersion이 TRUE가 되면 #If DebugVersion Then '. 디버깅 코드를 실행한다. '. '. #Else '. 실행 코드를 집어넣는다. '. '. #End If#const 문을 사용하지 않는 방법도 있습니다. VB의 주메뉴 '프로젝트(P)'->'<프로젝트 이름> 속성(E)'에서 두번째 탭의 '만들기'에서 '조건부 컴파일 인수(D)'를 지정하셔도 됩니다.
10. RDS를 이용한 컴포넌트 생성시 컴포넌트의 타입
11. 레지스트리 관련 함수
12. Date 타입 관련 함수
이름 | 기능 |
---|---|
Now | 컴퓨터의 현재 시간과 날짜를 얻어옵니다. |
Time | 컴퓨터의 현재 시간을 얻어옵니다. |
Date | 컴퓨터의 현재 날짜를 얻어옵니다. |
Year | Date 타입에서 년도만 얻어옵니다. |
Month | Date 타입에서 달만 얻어옵니다. |
Day | Date 타입에서 일자만 얻어옵니다. |
Weekday | Date 타입이 가리키는 날이 무슨 요일인지 얻어옵니다.(1=일요일,...,7=토요일) |
Hour | Date 타입에서 시간만 얻어옵니다. |
Minute | Date 타입에서 분만 얻어옵니다. |
Second | Date 타입에서 초만 얻어옵니다. |
DateValue | 특정 날짜를 몇 일을 더하면 어떤 날짜가 되는지 계산할 때 사용합니다. |
lblNextDate.Caption = CStr(DateValue(dt, 20))Date 타입이 가리키는 날짜를 문자열로 변경하고자 할 때는 해당 Date 타입을 CStr 함수의 인자로 지정해주면 됩니다. 그런데 이는 기본적으로 년도를 두자리만 표기해주기 때문에 2000년 이상의 연도를 표기할 때는 00으로 나타나는 문제가 있습니다. 이를 해결하려면 다음과 같이 합니다. dt를 Date 타입의 변수라고 하겠습니다.
lblDate.Caption = CStr(dt) ' 연도를 두 자리만 표기 lblDate.Caption = CStr(Format(dt, "Long Date")) ' 연도를 네 자리 모두 표기
13. 체크 박스 두번 눌림 감지
체크 박스를 이용해 프로그래밍을 하고 있는데 같은 체크 박스를 계속 클릭하면 처음 한번만 Click 이벤트가 뜨고 그 뒤로는 Click 이벤트가 뜨지 않습니다. 이를 어떻게 감지해야 할까요 ?14. 폼의 캡션바 없애기
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const WS_CAPTION = &HC00000 Private Const GWL_STYLE = (-16) Option Explicit Private Sub Form_Load() Dim lStyle As Long lStyle = GetWindowLong(hwnd, GWL_STYLE) lStyle = lStyle And (Not WS_CAPTION) SetWindowLong hwnd, GWL_STYLE, lStyle End Sub
15. 통합 환경과 단독 실행시의 구분 코딩 방법
VB의 통합 환경위에서 동작할 때와 실행 파일로 만들어져 단독으로 실행되느냐에 따라 다른 코드를 실행하도록 하고 싶습니다. 쉽게 하는 방법이 없을까요 ?16. VB에서 파일 I/O 방법
Set fso = CreateObject("Scripting.FileSystemObject") Set a = fso.CreateTextFile("c:\testfile.txt", True) a.Write("테스트하는 중입니다.") ' 한줄만 쓰고 싶으면 Writeln 함수를 사용한다. a.Close
17. 윤년을 고려한 일수 계산
Public Function GetDays(ByVal Year As Integer, ByVal Month As Integer) As Integer ' --- 먼저 Year가 윤년인지 따진다. If Month = 2 Then If (Year Mod 4 = 0 And Year Mod 100 <> 0) Then GetDays = 29 Else GetDays = 28 End If Else If Month = 1 Or Month = 3 Or Month = 5 Or Month = 7 Or _ Month = 8 Or Month = 10 Or Month = 12 Then GetDays = 31 Else GetDays = 30 End If End If End Function
다음처럼 Form에서 Controls.Add() 함수를 이용해서 컨트롤을 생성하고, WithEvents로 선언한 참조 변수를 이용하면 동적으로 생성된 컨트롤에 대한 이벤트를 처리할 수 있다.
Private WithEvents cmdDynamicButton As VB.CommandButton
Private Sub cmdDynamicButton_Click()
MsgBox "Click"
End Sub
Private Sub CmdMakeControl_Click()
Dim obj As Object
Set obj = Me.Controls.Add("VB.CommandButton", "Command1")
obj.Move 300, 300, 1200, 450
obj.Caption = "Command1"
obj.Visible = True
Set cmdDynamicButton = obj
Set obj = Nothing
End Sub
▣ WithEvents 문에서는 배열을 선언할 수 없다.
일반적인 변수 선언과 달리 WithEvents 변수에는 몇 가지 제한 사항이 있다. (MSDN 설명)
WithEvents 변수는 포괄적 개체 변수가 될 수 없습니다. 즉, As Object로 선언할 수 없고 변수를 선언할 때 클래스 이름을 지정해야 합니다.
WithEvents 변수를 As New로 선언할 수 없습니다. 이벤트 원본 개체는 명시적으로 작성되고 WithEvents 변수에 할당되어야 합니다.
표준 모듈에서 WithEvents 변수를 선언할 수 없습니다. 클래스 모듈, 폼 모듈, 클래스를 정의하는 기타 모듈 등에서만 선언할 수 있습니다.
WithEvents 변수의 배열을 작성할 수 없습니다.
이러한 이유로 인해 동적으로 생성하는 컨트롤이 많아 지는 경우, 이에 대한 이벤트 처리시 각각의 WithEvents 변수를 선언해야하는 불편함이 있다.
▣ WithEvents 변수에서 배열을 사용 할 수 없는 문제를 우회 하는 방법
글 재주가 부족한 관계로... 간단히 예제 코드로 대신.
dynamic_object_events.exe dynamic_object_events.zip
☞ 본문 출처 : http://www.enjoydev.com/blog/110
1.트리뷰를 동적으로 생성시키고 동적으로 제거한다.
2.동적으로 생긴 트리뷰에 대해 마우스클릭, 더블클릭등의 이벤트를 처리한다.
(더블클릭하면 새로운 폼을 띄웁니다)
Dim strNode As String
Dim WithEvents TreeView1 As TreeView
Private Sub Form_Load()
Dim i As Integer, j As Integer, k As Integer
' MSComctlLib.TreeCtrl.2 이거 몰라서 한참을 헤맸습니다.
' 그리고 VB에서 프로젝트속성 -> 만들기 -> 사용하지 않은 Active X 컨트롤에 대한 정보제거 체크표시 풀어야 합니다.
Set TreeView1 = Form1.Controls.Add("MSComctlLib.TreeCtrl.2", "TreeView1")
With TreeView1
.Height = 3855
.Left = 240
.LineStyle = tvwRootLines
.Top = 120
.Visible = True
.Width = 5895
For i = 1 To 5
Call .Nodes.Add(, , "카테고리" & CStr(i), "카테고리" & CStr(i))
Next i
End With
End Sub
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Debug.Print "Down" & Button
End Sub
Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Debug.Print "Up" & Button
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Debug.Print Node.Text
strNode = Node.Text
End Sub
Private Sub TreeView1_DblClick()
Debug.Print "더블클릭됨"
Form2.Show
MsgBox strNode
End Sub
Private Sub Command1_Click()
Form1.Controls.Remove (TreeView1.TabIndex)
End Sub