Visual Basic으로 응용 프로그램을 만드는 첫째 단계는 사용자와 상호 작용할 응용 프로그램의 시각적인 부분인 인터페이스를 만드는 것입니다. 폼과 컨트롤은 인터페이스를 만드는 기본 구성 요소로 응용 프로그램을 만드는 데 사용할 개체입니다.
폼은 모양을 결정하는 속성과 행동을 결정하는 메서드 그리고 사용자와 상호 작용을 정의하는 이벤트를 나타내는 개체입니다. 폼 속성을 설정하고 이벤트에 응답하는 Visual Basic 코드를 작성하여 응용 프로그램의 요건을 만족하도록 개체를 사용자 정의합니다.
컨트롤은 폼 개체에 포함되는 개체입니다. 컨트롤의 각 형식은 특정 목적에 알맞게 해주는 자체의 속성, 메서드, 이벤트를 가지고 있습니다. 응용 프로그램에서 사용할 수 있는 일부 컨트롤은 문자를 입력하고 표시하는 데 적합합니다. 기타 컨트롤은 다른 응용 프로그램에 액세스하여 원격 응용 프로그램이 코드의 일부분인 것처럼 데이터를 처리할 수 있게 합니다.
이 장에서는 폼과 컨트롤 그리고 관련된 속성, 메서드 및 이벤트에 대한 작업의 기본 개념을 소개합니다. 많은 표준 컨트롤과 메뉴나 대화 상자 같은 폼의 항목들에 대해서도 설명합니다.
3.1 속성, 메서드, 이벤트 설명
Visual Basic의 폼과 컨트롤은 자체의 속성, 메서드, 이벤트를 나타내는 개체입니다. 속성은 한 개체의 특성이고 메서드는 개체의 행동이고 이벤트는 개체의 응답으로 생각할 수 있습니다.
수소 풍선 같은 일상적인 물체(개체)도 속성과 메서드와 이벤트를 가지고 있습니다. 풍선의 속성에는 크기, 지름 그리고 색깔과 같은 눈에 보이는 특성이 있습니다. 다른 속성들은 부풀려지거나 부풀려지지 않은 풍선의 상태나 풍선의 수명과 같은 보이지 않는 특성을 나타냅니다. 정의한 대로 모든 풍선들은 이러한 속성을 가지고 있고 이 속성의 값은 풍선에 따라 다릅니다.
풍선은 실행할 수 있는 고유의 메서드 또는 동작도 갖습니다. 풍선을 수소로 채우는 동작 같은 부풀리기 메서드나 공기를 빼는 메서드 그리고 풍선을 날려버리는 떠오르기 메서드가 있습니다. 모든 풍선은 이러한 메서드를 가집니다.
풍선은 특정 외부 이벤트에 대해 미리 정해진 응답을 갖습니다. 예를 들면 풍선에 구멍을 내는 이벤트에 대해 공기를 빼는 것으로 응답하고 풀어놓는 이벤트에 대해서는 공기 중에 떠오르는 것으로 응답합니다.
그림 3.1 개체는 속성을 가지고 이벤트에 응답하며 메서드를 실행합니다
풍선을 프로그래밍한다면 Visual Basic 코드는 아래와 같이 풍선의 속성을 설정합니다.
Balloon.Color = Red
Balloon.Diameter = 10
Balloon.Inflated = True
코드 구문에 유의하십시오. 풍선 개체(Balloon) 뒤에 색 속성(Color)이 오고 빨간색 값이 지정됩니다. 코드에서 이 문장을 반복하면서 다른 값을 대체하여 풍선의 색깔을 바꿀 수 있습니다. 또한 속성은 응용 프로그램의 디자인 모드 [속성] 창에서 설정할 수 있습니다.
풍선의 메서드는 아래와 같이 호출할 수 있습니다.
Balloon.Inflate
Balloon.Deflate
Balloon.Rise 5
이 구문은 속성과 비슷합니다. 명사인 개체 뒤에 동사인 메서드가 붙습니다. 셋째 줄 예문에는 떠오르는 거리를 나타내는 추가 항목인 인수(5)가 있습니다. 일부 메서드는 수행될 작동을 더 자세히 나타내는 다수의 인수를 가질 수 있습니다.
풍선은 아래와 같이 이벤트에 대해 응답할 수 있습니다.
Sub Balloon_Puncture()
Balloon.Deflate
Balloon.MakeNoise '뻥'
Balloon.Inflated = False
Balloon.Diameter = 1
End Sub
이 경우 코드는 구멍 내기 이벤트가 발생했을 때 풍선의 동작을 설명합니다. 즉 공기 빼기 메서드를 호출하고 "뻥" 하는 소리 인수로 소리 내기 메서드를 호출합니다. 풍선이 더 이상 부풀어 있지 않기 때문에 부풀림 속성은 False로 설정되고 지름 속성은 새로운 값으로 설정됩니다.
풍선을 실제로 프로그래밍할 수는 없지만 Visual Basic 폼이나 컨트롤을 프로그래밍할 수는 있습니다. 프로그래머로서 사용자가 제어할 수 있습니다. 원하는 모양과 동작을 얻기 위해서 변경할 속성과 호출할 메서드 및 응답할 이벤트를 결정합니다.
3.2 폼 디자인
Form 개체는 Visual Basic 응용 프로그램의 기본 구성 요소로서 응용 프로그램을 실행할 때 상호 작용하는 실제 창입니다. 폼에는 모양과 행동을 제어할 수 있는 자체의 속성과 이벤트와 메서드가 들어 있습니다.
그림 3.2 폼과 컨트롤에는 자체의 속성과 이벤트와 메서드가 들어 있습니다
폼을 디자인하는 첫 단계는 폼의 속성을 설정하는 것입니다. 디자인 모드에서는 [속성] 창에서, 실행 모드에서는 코드를 작성하여 폼의 속성을 설정할 수 있습니다.
메모 Visual Basic 환경에서 응용 프로그램을 만들 때 폼의 속성을 설정하고 이벤트에 대한 코드를 작성하여 폼과 컨트롤에 대하여 작업할 때를 디자인 모드라고 하고 실제로 응용 프로그램을 실행하여 사용자와 상호 작용할 때를 실행 모드라고 합니다.
3.2.1 폼 속성 설정
폼의 물리적 모양에 영향을 미치는 여러 가지 폼 속성이 있습니다. Caption 속성은 폼의 제목 표시줄에 나타날 문자를 결정합니다. Icon 속성은 폼이 아이콘화되었을 때 표시되는 아이콘을 설정합니다. MaxButton과 MinButton 속성은 폼이 전체 화면으로 표시될 수 있을 지 또는 아이콘으로 표시될 수 있을 지를 결정합니다. BorderStyle 속성을 변경하여 폼 크기를 재조정하는 동작을 제어할 수 있습니다.
Height와 Width 속성은 폼의 초기 크기를 결정하고 Left와 Top 속성은 화면의 왼쪽 위 모서리를 기준으로 폼의 위치를 결정합니다. WindowState 속성을 사용하여 폼을 시작할 때 전체 화면 크기로 표시할 지 아이콘 상태로 표시할 지 아니면 보통 화면 크기로 표시할 지를 설정할 수 있습니다.
Name 속성은 코드에서 참조할 폼 이름을 설정합니다. 폼이 프로젝트에 처음으로 추가될 때 이름은 기본적으로 Form1, Form2 등으로 설정됩니다. 명령 입력 폼에 대한 Name 속성을 "frmEntry"와 같이 더 의미있는 이름으로 설정하는 것이 좋습니다.
폼의 여러 가지 속성들을 익히는 가장 좋은 방법은 실습해 보는 것입니다. 그림 3.3의 [속성] 창에 있는 폼의 속성들을 변경하고 응용 프로그램을 실행하여 결과를 살펴 보십시오. 속성을 선택하고 <F1>키를 눌러 상황에 따른 도움말을 보면 해당 속성에 대하여 자세히 배울 수 있습니다.
그림 3.3 속성 창
3.2.2 폼 이벤트와 메서드
개체로서 폼은 메서드를 실행하고 이벤트에 응답할 수 있습니다.
폼의 Resize 이벤트는 사용자의 상호 작용이나 코드에 의해 폼 크기가 변경될 때마다 호출됩니다. 이렇게 하여 폼 크기가 변경되었을 때 폼의 컨트롤을 이동하거나 크기를 변경할 수 있습니다.
폼이 활성화되면 항상 Activate 이벤트가 발생합니다. 다른 폼이나 다른 응용 프로그램이 활성화되면 Deactivate 이벤트가 발생합니다. 이런 이벤트들은 폼의 동작을 초기화하고 종료하는 데 편리하게 사용할 수 있습니다. 예를 들면 Activate 이벤트에서 특정 입력란의 글자가 반전되도록 코드를 작성할 수 있고 Deactivate 이벤트에서 파일이나 데이터베이스의 변경 사항을 저장할 수 있습니다.
폼을 나타내려면 Show 메서드를 호출해야 합니다.
Form2.Show
Show 메서드를 호출하는 것은 폼의 Visible 속성을 True로 설정하는 것과 같습니다.
폼의 많은 메서드는 텍스트나 그래픽에 관련되어 있습니다. Print, Line, Circle, Refresh 메서드는 폼의 표면에 직접 쓰거나 그리는 데 유용합니다. 이들 메서드와 기타 관련 사항은 "텍스트와 그래픽 작업"에 설명되어 있습니다.
3.3 동작을 수행하는 명령 단추
사용자가 응용 프로그램과 상호 작용하는 가장 쉬운 방법은 누르는 단추를 제공하는 것입니다. Visual Basic에서 제공하는 CommandButton 컨트롤을 사용할 수도 있고 아이콘 같은 그래픽을 포함한 Image 컨트롤을 사용하여 자신만의 '단추'를 만들 수도 있습니다.
3.3.1 CommandButton 사용
대부분의 Visual Basic 응용 프로그램들은 누르기만 하면 실행되는 명령 단추를 가지고 있습니다. 단추를 선택하면 적절한 기능을 수행하면서 단추가 눌러졌다가 다시 되돌아오는 것처럼 보입니다. 단추를 누를 때마다 Click 이벤트 프로시저가 호출됩니다. Click 이벤트 프로시저에 코드를 작성하여 원하는 동작을 수행합니다.
실행 모드에서 여러 가지 방법으로 명령 단추를 선택할 수 있습니다.
l 마우스를 사용하여 단추를 누릅니다.
l <Tab>키를 눌러 원하는 단추에 포커스를 이동한 뒤에 <스페이스바>나 <Enter>키를 눌러서 단추를 선택합니다. 이 장의 뒷부분에 있는 "포커스 설명"을 참조하십시오.
l 명령 단추에 대한 선택키(Alt+밑줄 친 글자)를 누릅니다.
l 코드에서 명령 단추의 Value 속성을 True로 지정합니다.
l cmdClose.Value = True
l 코드에 있는 명령 단추의 Click 이벤트를 호출합니다.
l cmdClose_Click
l 해당 명령 단추가 폼의 기본 명령 단추라면 명령 단추가 아닌 다른 컨트롤로 포커스를 변경하였더라도 <Enter>키를 눌러 기본 명령 단추를 선택할 수 있습니다. 디자인 모드에서 단추의 Default 속성을 True로 설정하여 기본 명령 단추로 지정합니다.
l 명령 단추가 폼의 기본 취소 단추라면 명령 단추가 아닌 다른 컨트롤로 포커스를 변경하였더라도 <Esc>키를 눌러 기본 취소 단추를 선택할 수 있습니다. 디자인 모드에서 단추의 Cancel 속성을 True로 설정하여 기본 취소 단추로 지정합니다.
위의 모든 동작들은 Visual Basic이 Click 이벤트 프로시저를 호출하도록 합니다.
3.3.3 단추 테스트 응용 프로그램
Caption 속성을 사용하여 단추가 하는 일을 설명하는 텍스트를 단추에 표시합니다. 그림 3.4에서 컨트롤 예제 응용 프로그램의 테스트 단추 예제에는 Caption 속성이 '신호 바꾸기(S)'로 설정된 명령 단추가 있습니다. 이 예제의 동작을 알려면 Controls.vbp 예제 응용 프로그램에 들어 있는 Button.frm을 참조하십시오.
밑줄 그어진 ‘S’가 이 단추의 선택키입니다. Caption 속성의 문자열에 앰퍼샌드 기호(&)를 삽입하고 원하는 글자를 앰퍼샌드 기호(&) 바로 뒤에 작성하면 해당 단추에 대한 선택키가 됩니다. 예를 들면 신호 바꾸기(&S)에서 'S'가 선택키입니다.
그림 3.4 캡션이 있는 CommandButton
명령 단추를 누르면 이벤트 프로시저의 코드가 실행됩니다. 예제에서 단추를 선택할 때마다 서로 다른 신호등 아이콘이 표시됩니다.
3.4 텍스트 표시 컨트롤과 텍스트 입력 컨트롤
Label과 TextBox 컨트롤은 문자열을 표시하거나 입력하는 데 사용합니다. 응용 프로그램의 폼에 문자열을 표시하려면 Label 컨트롤을 사용하고 문자열을 입력하려면 TextBox 컨트롤을 사용하십시오. Label 컨트롤에는 읽기 전용 문자열이 들어 있고 TextBox 컨트롤에는 편집할 수 있는 문자열이 들어 있습니다.
제공하는 기능 사용하는 컨트롤
편집 가능한 문자열(예: 명령 입력 필드나 암호 입력란) TextBox
표시만 되는 문자열(예: 폼에서 필드를 식별하거나 사용자에게 안내문 보여 주기) Label
3.4.1 Label을 사용하여 텍스트 표시
Label 컨트롤은 사용자가 직접 변경할 수 없는 텍스트를 화면에 표시합니다. 자체의 Caption 속성을 가지고 있지 않은 TextBox나 스크롤 막대 같은 컨트롤을 식별하는 데 Label 컨트롤을 사용할 수 있습니다. Label에 표시되는 실제 텍스트는 Label의 Caption 속성에 의해 제어됩니다. Label의 Caption 속성은 디자인 모드에서는 [속성] 창에서, 실행 모드에서는 코드로 지정하여 설정할 수 있습니다.
기본적으로 Caption은 Label 컨트롤에서 눈에 보이는 유일한 부분입니다. 그러나 디자인 모드에서 BorderStyle 속성을 1로 설정하면 Label이 테두리를 갖고 나타나 TextBox와 비슷해 보입니다. BackColor, BackStyle, ForeColor, Font 속성을 설정하여 Label의 모양을 바꿀 수 있습니다.
1) 내용에 맞는 Label 크기 지정
디자인 모드에서 한 줄로 된 Label의 Caption을 [속성] 창에서 지정할 수 있습니다. 긴 캡션은 실행 모드에서 변경될 캡션을 입력하고 싶을 때는 Label의 AutoSize와 WordWrap 속성을 사용하여 Caption의 크기에 맞게 컨트롤의 크기를 설정할 수 있습니다.
AutoSize 속성은 내용의 크기에 맞게 자동으로 컨트롤의 크기를 조정할 지를 결정합니다. True로 설정하면 Label은 그림 3.5에 보이는 것처럼 내용에 맞게 수평으로 늘어납니다.
그림 3.5 자동 크기 조정 예제
WordWrap 속성은 그림 3.6처럼 Label이 같은 너비를 유지하면서 내용에 맞게 수직으로 늘어나게 합니다. 이 예제의 실행은 Controls.vbp 예제 응용 프로그램에 있는 Wordwrap.frm을 참조하십시오.
그림 3.6 단어 보호 예제
메모 Controls.vbp에서 자동 크기 조정 예제를 실행하는 경우 단어 보호 예제를 실제로 작동시키려면 두 가지 확인란을 모두 선택해야 합니다. Label의 WordWrap 속성이 유효하려면 AutoSize 속성을 True로 설정해야 하기 때문입니다. 한 단어의 너비가 컨트롤의 현재 너비를 초과할 때에만 Label의 너비가 늘어납니다.
3.4.2 TextBox 작업
TextBox는 사용자의 입력을 받아들이거나 텍스트를 표시하는 데 사용할 수 있는 다목적의 컨트롤입니다. TextBox는 Locked 속성을 True로 설정하여 사용자가 변경할 수 없는 텍스트를 표시할 수 있습니다. 그러나 Locked 속성을 True로 설정하지 않으면 표시된 텍스트를 사용자가 변경할 수 있습니다.
TextBox에 표시되는 실제 문자열은 Text 속성에 의해 제어됩니다. Text 속성을 세 가지 방법으로 설정할 수 있습니다. 디자인 모드에서는 [속성] 창에서, 실행 모드에서는 코드에 지정하거나 입력하여 설정할 수 있습니다. 실행 모드에서 Text 속성을 읽어와 TextBox의 현재 내용을 가져올 수 있습니다.
1) 다중 줄 TextBox와 자동 줄 바꿈
기본적으로 TextBox는 한 줄의 문자열로 표시되고 스크롤 막대는 표시되지 않습니다. 문자열이 입력 가능한 영역보다 길면 문자열의 일부만 보일 것입니다. 디자인 모드에서 MultiLine과 ScrollBars의 두 속성을 설정하여 TextBox의 모양과 동작을 변경할 수 있습니다.
메모 ScrollBars 속성을 스크롤 막대 컨트롤과 혼동해서는 안됩니다. 스크롤 막대 컨트롤은 TextBox에 첨부되지 않으며 자체의 속성 집합을 가집니다.
MultiLine 속성을 True로 설정하면 TextBox가 실행 모드에서 여러 줄의 문자열을 받아 들이거나 표시할 수 있습니다. 다중 줄 TextBox는 수평 스크롤 막대가 없으면 자동으로 줄 바꿈합니다. ScrollBars 속성은 기본 값으로 0-없음으로 지정되어 있습니다. 자동 줄 바꿈은 줄의 끝에서 줄 바꿈을 입력해야 하는 문제를 해결해 줍니다. 문자열이 한 줄에 표시될 수 있는 것보다 더 길 때 TextBox는 그 문자를 다음 줄로 줄 바꿈합니다.
디자인 모드에서 [속성] 창에 줄 바꿈을 입력할 수 없습니다. 프로시저에서 라인 피드(ANSI 문자 10) 다음에 캐리지 리턴(ANSI 문자 13)을 삽입하여 줄바꿈할 수 있습니다. 또한 vbCrLf 상수를 사용하여 캐리지 리턴/라인 피드 조합을 삽입할 수 있습니다. 예를 들면 아래의 이벤트 프로시저는 폼을 로드할 때 여러 줄 입력란(Text1)에 두 줄의 문자열을 집어 넣습니다.
Sub Form_Load ()
Text1.Text = "입력란에 " _
& vbCrLf & "두 줄이 있습니다."
End Sub
2) TextBox에서 문자열 작업
SelStart, SelLength, SelText 속성으로 TextBox에서의 삽입점과 선택 작업을 제어할 수 있습니다. 이들 속성은 실행 모드에서만 사용할 수 있습니다.
TextBox가 처음 포커스를 받으면 TextBox 의 삽입점 커서 위치는 기존 문자의 맨 왼쪽이 됩니다. 이것을 키보드나 마우스로 이동시킬 수 있습니다. TextBox가 포커스를 잃었다가 다시 되찾을 때 삽입점은 사용자가 마지막 둔 그 자리가 됩니다.
때때로 이러한 동작이 사용자를 당황하게 합니다. 사용자는 워드 프로세스 응용 프로그램에서 기존의 문자열 뒤에 새로운 글자가 나타나기를 기대할 수도 있습니다. 데이터 입력 응용 프로그램에서 문자 입력으로 새로운 데이터가 기존의 데이터를 대체하기를 기대할 수도 있습니다. SelStart와 SelLength 속성으로 목적에 맞게 동작을 수정할 수 있습니다.
SelStart 속성은 문자열 내에서 삽입점을 지정하는 숫자로 0은 맨 왼쪽 위치를 나타냅니다. SelStart 속성이 입력란에 있는 글자의 개수와 같거나 더 큰 숫자가 설정되면 그림 3.7처럼 삽입점은 마지막 글자 뒤에 놓여집니다. 예제의 실행은 Controls.vbp 예제 응용 프로그램의 Text.frm을 참조하십시오.
그림 3.7 삽입점 예제
SelLength 속성은 삽입점의 너비를 설정하는 수치값입니다. SelLength를 0보다 큰 숫자로 설정하면 현재의 삽입점에서 시작하여 그 숫자만큼의 글자가 선택되어 반전 표시됩니다. 그림 3.8은 선택 작업을 보여줍니다.
그림 3.8 선택 예제
문자열 블록이 선택되어 있을 때 글자 입력을 시작하면 선택된 문자열이 바뀝니다. 붙여 넣기 명령을 사용하여 선택한 문자열을 새로운 문자열로 바꿀 수도 있습니다. SelText 속성은 실행 모드에서 현재 선택된 문자를 바꾸도록 지정할 수 있는 문자열 값입니다. 문자열이 선택되지 않았다면 SelText는 현재의 삽입점에 그 내용을 삽입할 것입니다.
3.5 사용자 선택 컨트롤
대부분의 응용 프로그램은 예/아니오 같은 간단한 선택에서부터 수백 가지 대안이 담겨 있는 목록에서의 선택에 이르기까지 사용자에게 선택을 제시할 필요가 있습니다. Visual Basic은 선택을 제시하는 데 편리한 여러 가지 표준 컨트롤을 포함하고 있습니다. 아래 표에는 이런 컨트롤과 이 컨트롤의 올바른 사용법을 간략하게 설명합니다.
원하는 작업 사용할 컨트롤
작은 옵션 집합에서 하나 이상의 옵션을 선택하게 할 때 CheckBox
작은 옵션 집합에서 옵션을 하나만 선택하게 할 때 OptionButton (추가 그룹이 필요하면 Frame을 사용합니다.)
스크롤 막대 목록에서 선택하게 할 때 ListBox
문자 편집 필드를 가진 스크롤 막대 목록에서 선택하게 할 때. 사용자는 목록에서 선택하거나 편집 필드에 직접 입력할 수 있습니다. ComboBox
3.5.1 CheckBox로 개별 옵션 선택
CheckBox는 특정 상태의 선택 여부를 나타냅니다. 응용 프로그램에서는 CheckBox를 사용하여 True/False 또는 Yes/No 옵션을 제공합니다. CheckBox는 서로 독립적으로 작동하기 때문에 한번에 여러 개의 CheckBox를 설정할 수 있습니다. 그림 3.9의 예제에서 굵게와 기울임꼴 모두를 선택할 수 있습니다.
그림 3.9 CheckBox
1) CheckBox 응용 프로그램
CheckBox 예제는 텍스트를 보통 글씨체로 표시할 지 아니면 기울임꼴로 표시할 지를 결정하는 데 사용합니다. 이 예제의 실행은 Controls.vbp 예제 응용 프로그램의 Check.frm을 참조하십시오.
응용 프로그램은 그림 3.10에서처럼 각각 한 개의 TextBox, Label, CommandBotton 그리고 두 개의 CheckBox를 가지고 있습니다.
그림 3.10 CheckBox 예제
다음은 응용 프로그램의 개체들에 대한 속성 설정 목록입니다.
개체 속성 설정
Form NameCaption frmCheckCheckBox 예제
TextBox NameText txtDisplayCheckBox 예제 문자열
첫째 CheckBox NameCaption chkBold굵게(&B)
둘째 CheckBox NameCaption chkItalic기울임꼴(&I)
CommandButton NameCaption cmdClose닫기(&C)
굵게 또는 기울임꼴을 설정하면 CheckBox의 Value 속성이 1로 설정됩니다. 해제하려면 Value 속성을 0으로 설정합니다. 기본 Value 속성값은 0입니다. Value를 변경하지 않으면 처음 화면에 나타날 때 CheckBox는 설정되어 있지 않습니다. 1과 0 설정값 대신 vbChecked와 vbUnchecked 상수를 사용할 수 있습니다.
2) CheckBox 응용 프로그램 이벤트
CheckBox의 Click 이벤트는 CheckBox를 설정하는 순간에 발생합니다. 이 이벤트 프로시저는 CheckBox가 설정되었는지 여부, 즉 Value = vbChecked인지 검사합니다. Value = vbChecked라면 TextBox의 Font 속성이 반환한 Font 개체의 Bold 또는 Italic 속성을 설정하여 문자열을 굵게 또는 기울임꼴로 변환합니다.
Private Sub chkBold_Click ()
If ChkBold.Value = vbChecked Then ' 선택한 경우
txtDisplay.Font.Bold = True
Else ' 선택하지 않은 경우
txtDisplay.Font.Bold = False
End If
End Sub
Private Sub chkItalic_Click ()
If ChkItalic.Value = vbChecked Then ' 선택한 경우
txtDisplay.Font.Italic = True
Else ' 선택하지 않은 경우
txtDisplay.Font.Italic = False
End If
End Sub
3.5.2 OptionButton으로 옵션 그룹화
OptionButton은 사용자에게 두 개 이상의 선택을 제시합니다. 그러나 CheckBox와는 달리 OptionButton은 항상 그룹의 일부분으로 작동하여 하나의 OptionButton을 선택하면 해당 그룹 내의 다른 모든 단추가 즉시 취소됩니다. OptionButton 그룹을 정의하는 것은 '여러 가지 선택 요소 중에서 오직 하나만 선택할 수 있습니다.'라고 사용자에게 말하는 것입니다.
예를 들면 그림 3.11에 보이는 OptionButton 그룹에서 사용자는 세 가지 옵션 중에서 하나만 선택할 수 있습니다.
그림 3.11 OptionButton 선택
1) OptionButton 그룹 작성
PictureBox나 Frame이 아닌 Form에 직접 위치한 모든 OptionButton은 하나의 그룹을 구성합니다. 추가 OptionButton 그룹을 만들고 싶다면 항목을 반드시 Frame이나 PictureBox 안에 놓아야 합니다.
주어진 Frame 안의 모든 OptionButton은 PictureBox 내의 모든 OptionButton과 마찬가지로 하나의 개별 그룹을 만듭니다. 이렇게 개별 그룹을 만들 때 항상 Frame이나 PictureBox를 먼저 그리고 나서 OptionButton을 그 위에 그리십시오. 그림 3.12는 두 개의 OptionButton 그룹을 가진 폼을 보여줍니다.
그림 3.12 OptionButton 그룹
한 Frame에 여러 OptionButton을 그리면 그룹에서 하나의 OptionButton만 선택할 수 있습니다.
한 Frame 안에 있는 컨트롤을 그룹화하려면
l 도구 상자에서 Frame 컨트롤을 선택하여 폼에 Frame을 그립니다.
l 도구 상자에서 OptionButton 컨트롤을 선택하여 Frame 안에 그립니다.
l 단계 2를 반복하여 여러 OptionButton을 Frame에 추가로 그립니다.
l
Frame을 먼저 그리고 나서 각 컨트롤을 Frame 안에 그려 넣으면 Frame과 컨트롤은 같이 이동합니다. 미리 추가된 컨트롤을 Frame 위로 이동하면 Frame과 함께 움직이지 않습니다.
메모 하나의 Frame에 그룹화하려는 기존의 컨트롤들이 있으면 그 컨트롤을 모두 선택한 다음 잘라내어 Frame이나 PictureBox 컨트롤에 붙여 넣으면 됩니다.
2) 컨트롤 컨테이너
컨트롤이 독립 개체이지만 상위와 하위 관계가 폼과 컨트롤 사이에 있습니다. 그림 3.12는 OptionButton이 어떻게 폼이나 Frame 컨트롤에 포함되는지를 보여줍니다.
컨테이너 개념을 이해하려면 모든 컨트롤은 컨트롤 자신이 그려진 폼의 하위 컨트롤이라는 사실을 이해해야 합니다. 실제로 대부분의 컨트롤은 읽기 전용의 Parent 속성을 지원하는 데, 그것은 그 폼이 위치한 상위 폼을 돌려줍니다. 하위가 되면 상위 폼 내의 컨트롤 위치에 영향을 줍니다. 컨트롤의 Left와 Top 속성은 상위 폼에 상대적이며 상위의 한계 밖으로 이동될 수 없습니다. 컨테이너를 옮기면 컨트롤도 함께 이동됩니다. 컨트롤은 컨테이너와 함께 이동하기 때문에 컨테이너의 Left와 Top 속성에 상대적인 컨트롤 위치는 변하지 않습니다.
3) OptionButton의 선택과 해제
아래와 같은 방법으로OptionButton을 선택할 수 있습니다.
l 실행 모드에서 마우스를 눌러 선택합니다.
l 탭을 사용하여 OptionButton 그룹으로 이동한 다음 <화살표>키로 그룹 내의 OptionButton을 선택합니다.
l 코드에서 Value 속성을True로 지정하여 선택합니다.
optChoice.Value = True
Label의 Caption에 지정된 선택키를 누릅니다.
OptionButton 그룹에서 하나의 OptionButton을 기본값으로 만들려면 디자인 모드에서 해당 OptionButton의 Value 속성을 True로 지정합니다. 사용자가 다른 OptionButton을 선택하거나 코드에서 변경하지 않으면 선택된 상태로 유지됩니다.
OptionButton을 해제하려면 해당 OptionButton의 Enabled 속성을 False로 지정합니다. 프로그램이 실행될 때 이 옵션 단추는 흐리게 표시되어 사용할 수 없다는 것을 나타냅니다.
4) 옵션 응용 프로그램
그림 3.13의 폼은 가상 컴퓨터에 대해 프로세서의 종류와 운영 체제를 결정하기 위해 OptionButton을 사용합니다. 각 그룹에서 OptionButton을 선택하면 현재의 선택을 반영하여 Label의 Caption이 변경됩니다. 이 예제의 실행은 Controls.vbp 예제 응용 프로그램의 Options.frm을 참조하십시오.
그림 3.13 OptionButton 예제
다음은 응용 프로그램의 개체에 대한 속성 설정을 나열합니다.
개체 속성 설정
Label NameCaption LblDisplay(비웠음)
CommandButton NameCaption CmdClose닫기(&C)
첫째 OptionButton NameCaption opt486486(&4)
둘째 OptionButton NameCaption Value opt586Pentium(&P) True
셋째 OptionButton NameCaption opt686Pentium Pro(&E)
Frame NameCaption FraSystem운영 체제(&O)
넷째 OptionButton NameCaption OptWin95Windows 95
다섯째 OptionButton NameCaption Value OptWinNTWindows NT True
5) 옵션 응용 프로그램 이벤트
옵션 응용 프로그램은 이벤트에 아래와 같이 응답합니다.
처음 세 개의 OptionButton에 대한 Click 이벤트는 해당 설명을 폼 수준 문자열 변수인 strComputer로 지정합니다.
나머지 두 개의 OptionButton에 대한 Click 이벤트는 해당 설명을 둘째 폼 수준 변수인 strSystem으로 지정합니다.
여기에서 가장 중요한 것은 두 개의 폼 수준 변수 strComputer와 strSystem의 사용입니다. 이 변수들은 마지막에 선택된 OptionButton에 따라 서로 다른 문자열 값을 가지고 있습니다.
새로운 OptionButton이 선택될 때마다 선택된 OptionButton의 Click 이벤트에 있는 코드는 해당 변수를 업데이트합니다.
Private Sub opt586_Click()
Private Sub opt586_Click()
strComputer = "Pentium"
Call DisplayCaption
End Sub
그런 다음 DisplayCaption이라는 Sub 프로시저를 호출합니다. 이것은 두 변수를 결합하여 Label의 Caption 속성을 업데이트합니다.
Sub DisplayCaption()
lblDisplay.Caption = strSystem &"이 실행되고 있는 " & _
strComputer & "를 선택했습니다."
End Sub
Caption 속성을 업데이트하는 프로시저가 다섯 개의 모든 OptionButton에 대하여 동일하게 작동하기 때문에 DisplayCaption Sub 프로시저가 사용되며 변수값만 다른 것으로 변경됩니다. 이렇게 하여 각 Click 이벤트에 대해 동일한 코드를 반복하지 않아도 됩니다.
3.5.3 ListBox와 ComboBox 사용
ListBox와 ComboBox는 사용자에게 선택할 수 있는 목록을 제시합니다. 여러 열로 설정할 수 있지만 기본적으로 선택 목록이 한 열에 수직으로 표시됩니다. 항목의 수가 ComboBox나 ListBox에서 표시될 수 있는 것보다 많으면 컨트롤에 스크롤 막대가 자동으로 나타납니다. 그러면 사용자는 목록을 위 아래로 또는 왼쪽에서 오른쪽으로 스크롤할 수 있습니다. 그림 3.14는 단일 열 ListBox를 보여줍니다.
그림 3.14 단일 열 ListBox
ComboBox 컨트롤은 TextBox와 ListBox의 특징을 겸비하고 있습니다. 이 컨트롤을 사용하여 문자를 ComboBox에 직접 입력하거나 목록에서 항목을 선택할 수 있습니다. 그림 3.15는 ComboBox를 보여줍니다.
그림 3.15 ComboBox
Label의 Caption 속성이나 TextBox의 Text 속성 같이 단일 값을 갖는 여러 다른 컨트롤과는 달리 ListBox와 ComboBox는 여러 개의 값을 갖고 있거나 설정값 집합을 가지고 있습니다. ListBox와 ComboBox에는 실행 모드에서 설정값 집합에 값을 추가하거나 삭제 또는 검색하기 위한 내부 메서드가 있습니다. List1이라는 이름의 ListBox에 몇 가지 항목을 추가하기 위한 코드는 아래와 같습니다.
List1.AddItem "Paris"
List1.AddItem "New York"
List1.AddItem "San Francisco"
ListBox와 ComboBox는 제한된 공간에서 많은 선택을 제시할 때 효과적입니다.
3.5.4 ScrollBar를 입력 장치로 사용
스크롤 막대는 대부분 입력란이나 창에 붙어 있지만 입력 장치로 사용될 수도 있습니다. 이 컨트롤은 현재의 위치를 눈금으로 가리키기 때문에 프로그램 입력을 제어하는 데 ScrollBar 컨트롤을 개별적으로 사용할 수 있습니다. 예를 들면 소리 크기를 조정하거나 그림의 색깔을 조정하는 데 사용할 수 있습니다. HscrollBar(수평 스크롤 막대)와 VscrollBar(수직 스크롤 막대) 컨트롤은 다른 컨트롤과 독립적으로 운영되고 고유의 이벤트와 속성과 메서드를 가지고 있습니다. Scroll bar 컨트롤은 TextBox나 ListBox, ComboBox 그리고 MDI 폼들에 내장된 스크롤 막대와 다릅니다. TextBox와 MDI 폼은 컨트롤에 내장된 스크롤 막대를 추가하거나 제거하는 ScrollBars 속성을 가지고 있습니다.
Windows 인터페이스 안내서에는 스크롤 막대 대신에 Slider 컨트롤을 입력 장치로 사용하도록 권장하고 있습니다. Slider 컨트롤의 예는 Windows 95 제어판에서 볼 수 있습니다. Windows 95 유형 Slider 컨트롤은 Visual Basic의 Professional edition과 Enterprise edition에 포함되어 있습니다.
3.6 그림과 그래픽 표시 컨트롤
Windows는 그래픽 사용자 인터페이스이기 때문에 응용 프로그램의 인터페이스에서 그래픽 이미지를 표시하는 방법을 확보하는 것이 중요합니다. Visual Basic에는 그래픽 작업을 쉽게 할 수 있는 PictureBox 컨트롤, Image 컨트롤, Shape 컨트롤, Line 컨트롤이 들어 있습니다.
Image, Shape, Line 컨트롤은 때때로 ‘Lightweight’ 그래픽 컨트롤로 불리기도 합니다. 이 컨트롤은 PictureBox 컨트롤보다 시스템 리소스를 적게 필요로 하여 PictureBox 컨트롤보다 빠르게 화면에 표시됩니다. 이들은 PictureBox에서 사용 가능한 속성, 메서드, 이벤트의 부분 집합을 가지고 있습니다. 각각은 특정 목적에 가장 잘 맞게 되어 있습니다.
제공하는 기능 사용할 컨트롤
다른 컨트롤을 위한 컨테이너 PictureBox
인쇄 또는 그래픽 메서드 PictureBox
화면에 그림을 표시 Image 컨트롤이나 PictureBox
Lightweight 그래픽 요소를 화면에 표시 Shape나 Line 컨트롤
3.6.1 PictureBox 컨트롤 작업
PictureBox 컨트롤의 가장 기본적인 용도는 사용자에게 그림을 보여주는 것입니다. 화면에 표시되는 실제 그림은 Picture 속성에 의해 결정됩니다. Picture 속성에는 화면에 표시할 그림 파일의 이름과 경로 옵션이 있습니다.
메모 Form 개체들도 폼의 배경에 직접 그림을 표시하도록 설정할 수 있는 Picture 속성을 가지고 있습니다.
실행 모드에서 그림을 화면에 나타내거나 바꾸려면 LoadPicture 함수를 사용하여 Picture 속성을 설정하면 됩니다. 그림 파일의 이름과 경로(선택 사항)를 제공하면 LoadPicture 함수는 그림 파일을 로드해서 화면에 나타냅니다.
picMain.Picture = LoadPicture("VANGOGH.BMP")
PictureBox 컨트롤은 AutoSize 속성을 가지고 있으며 이 속성을 True로 설정하면 PictureBox가 그 내용의 크기에 따라 자동으로 크기가 조정됩니다. AutoSize가 지정된 PictureBox를 사용하려면 폼을 디자인할 때 특별히 주의를 기울여야 합니다. PictureBox는 폼의 다른 컨트롤에 관계없이 크기가 조정되므로 다른 컨트롤을 덮어버리는 것과 같은 예측하지 않았던 결과를 일으킬 수도 있습니다. 디자인 모드에서 각각의 그림을 로드해서 테스트해보는 것이 좋습니다.
1) PictureBox를 컨테이너로 사용
PictureBox 컨트롤을 다른 컨트롤의 컨테이너로 사용할 수도 있습니다. Frame 컨트롤처럼 PictureBox 위에 다른 컨트롤을 끌어 놓을 수 있습니다. PictureBox 안의 컨트롤들은 PictureBox와 함께 이동하며 이 컨트롤의 Top과 Left 속성은 폼이 아니라 PictureBox에 상대적으로 설정됩니다.
PictureBox 컨테이너의 일반적인 용도는 도구 모음이나 상태 표시줄입니다. Image 컨트롤을 PictureBox에 놓고 단추처럼 사용할 수 있으며 Label을 추가하여 현재 상태 메시지를 표시할 수 있습니다. Align 속성을 "0-없음", "1-위 맞춤", "2-아래 맞춤", "3-왼쪽 맞춤", 또는 "4-오른쪽 맞춤" 등으로 설정하면 PictureBox는 폼의 가장자리에 '붙습니다'. 그림 3.16은 Align 속성이 "2-아래 맞춤"으로 설정된 PictureBox를 보여줍니다. 거기에는 현재 상태 표시 메시지를 화면에 표시하는 데 사용할 수 있는 두 개의 Label 컨트롤이 있습니다.
그림 3.16 상태 표시줄로 사용되는 PictureBox
2) PictureBox의 기타 용도
PictureBox 컨트롤에는 여러 가지 용도에 편리하게 사용할 수 있는 다양한 메서드가 들어 있습니다. PictureBox를 그림을 그리고 색을 칠할 수 있는 흰 캔버스라고 생각하십시오. 하나의 PictureBox 컨트롤에 문자열과 그래픽 그리고 간단한 애니메이션까지 표시할 수 있습니다.
Print 메서드를 사용하면 프린터에 인쇄하듯이 PictureBox 컨트롤에 문자열을 출력할 수 있습니다. 여러 가지 글꼴 속성을 사용하여 Print 메서드로 출력되는 문자열의 특성을 제어할 수 있습니다. Cls 메서드는 출력 내용을 지우는 데 사용할 수 있습니다.
Circle, Line, Point, Pset 메서드는 PictureBox에 그림을 그리는 데 사용할 수 있습니다. DrawWidth, FillColor, FillStyle 같은 속성들은 그림의 모양을 사용자 정의할 수 있게 합니다.
PaintPicture 메서드를 사용하여 PictureBox 컨트롤 내로 이미지를 옮기고 여러 가지 서로 다른 이미지를 신속하게 바꾸어 애니메이션을 만들 수도 있습니다.
3.6.2 Lightweight 그래픽 컨트롤
Image, Shape, Line 컨트롤들은 Lightweight 컨트롤로 간주됩니다. 이 컨트롤들은 PictureBox의 속성과 메서드와 이벤트의 부분 집합만 지원합니다. 그러므로 이 컨트롤들은 일반적으로 PictureBox 보다 적은 시스템 리소스를 필요로 하며 PictureBox 컨트롤보다 빠르게 로드합니다.
1) PictureBox 대신 Image 컨트롤 사용
Image 컨트롤은 PictureBox 컨트롤과 비슷하지만 그림을 화면에 표시하는 데만 사용됩니다. Image 컨트롤은 다른 컨트롤에 대한 컨테이너로 사용할 수 없습니다. 또한 PictureBox 컨트롤의 고급 메서드를 지원하지 않습니다.
Image 컨트롤은 PictureBox와 동일한 방법으로 그림을 로드합니다. 디자인 모드에서는 Picture 속성을 파일 이름과 경로로 설정하고 실행 모드에서는 LoadPicture 함수를 사용합니다.
Image 컨트롤의 크기 조정 행동 양식은 PictureBox와는 다릅니다. PictureBox가 AutoSize 속성을 가지고 있는 반면 Image 컨트롤은 Stretch 속성을 가지고 있습니다. AutoSize 속성을 True로 설정하면 PictureBox의 크기가 그림의 크기에 따라 조정되고 False로 설정하면 그림이 일부분만 보이거나 잘립니다. Image 컨트롤의 Stretch 속성을 기본값인 False로 설정하면 그림의 크기에 따라 Image 컨트롤의 크기가 조정됩니다. Stretch 속성을 True로 설정하면 Image 컨트롤의 크기에 맞게 그림의 크기가 조정됩니다. 이렇게 하면 그림이 찌그러져 나타날 수 있습니다.
2) Image 컨트롤을 사용하여 단추 만들기
Image 컨트롤은 또한 Click 이벤트를 인식합니다. 그러므로 CommandButton을 사용할 수 있는 모든 곳에 Image 컨트롤을 사용할 수 있습니다. 이렇게 하여 Caption 대신에 그림이 있는 단추를 아주 편리하게 만들 수 있습니다. 여러 가지 Image 컨트롤을 화면의 맨 위쪽에 수평으로 그룹화하면(일반적으로 PictureBox 안에) 응용 프로그램에서 도구 모음을 만들 수 있습니다.
예를 들면 TestButtons 예제는 사용자가 명령 단추처럼 선택할 수 있는 Image 컨트롤을 보여줍니다. 폼이 처음으로 화면에 표시될 때 컨트롤은 Visual Basic에 포함되어 있는 아이콘 라이브러리에서 가져온 3개의 신호등 아이콘 중에 하나를 화면에 표시합니다. Image 컨트롤이 선택될 때마다 서로 다른 아이콘이 표시됩니다. 이 예제의 실행은 Controls.vbp 응용 프로그램 예제의 Button.frm을 참조하십시오.
디자인 모드에서 폼을 검사해 보면 실제로 세 개의 모든 아이콘들이 서로의 위에 "쌓여있다는" 것을 알게 될 것입니다. 맨 위에 있는 Image 컨트롤의 Visible 속성을 False로 변경하면 Visible 속성이 True로 설정된 다음 이미지가 맨 위에 나타납니다.
그림 3.17은 신호등 아이콘(Trffc10a.ico) 중에서 하나의 아이콘이 들어 있는 Image 컨트롤을 보여줍니다.
그림 3.17 하나의 신호등 아이콘을 가진 Image 컨트롤
Image 컨트롤 주위에 테두리선을 넣으려면 BorderStyle 속성을 "1-단일 고정"으로 설정합니다.
메모 명령 단추와는 달리 Image 컨트롤은 선택되어도 눌려진 것처럼 보이지 않습니다. 이것은 MouseDown 이벤트에서 비트맵을 변경하지 않으면 "단추"의 눌려진 상태를 알 수 있는 어떠한 표시도 없음을 의미합니다.
추가 정보 Image 컨트롤에 그래픽 이미지를 나타내는 방법에 대한 자세한 내용은 "Visual Basic 표준 컨트롤 사용"을 참조하십시오.
3) Shape과 Line 컨트롤 사용
Shape과 Line 컨트롤은 폼의 표면에 그래픽 요소를 그리는 데 편리합니다. 이 컨트롤들은 이벤트를 지원하지 않고 장식적인 용도로만 사용됩니다.
Shape 컨트롤의 모양을 조정하기 위해 여러가지 속성이 제공됩니다. Shape 속성을 설정하여 직사각형, 정사각형, 타원, 원, 둥근 모서리 직사각형이나 둥근 모서리 정사각형을 표시할 수 있습니다. BorderColor와 FillColor 속성을 설정하여 색을 변경할 수 있으며 BorderStyle, BorderWidth, FillStyle 및 DrawMode 속성을 사용하여 도형이 그려지는 방법을 조정합니다.
Line 컨트롤은 Shape 컨트롤과 비슷하지만 직선을 그릴 때에만 사용됩니다.
3.6.3 Image 응용 프로그램
그림 3.18의 폼은 4개의 Image 컨트롤, Shape 컨트롤, PictureBox 그리고 CommandButton을 사용합니다. 놀이 카드 기호를 선택하면 Shape 컨트롤은 기호를 반전시켜 나타내고 PictureBox에 설명이 나타납니다. 이 예제의 실행은 Controls.vbp 예제 응용 프로그램의 Images.frm을 참조하십시오.
그림 3.18 Image와 Shape 컨트롤 예제
다음은 응용 프로그램의 개체들에 대한 속성 설정 목록입니다.
개체 속성 설정
PictureBox NameAlign picStatusBottom
첫째 Image 컨트롤 NamePicture imgClubSpade.ico
둘째 Image 컨트롤 NamePicture imgDiamondDiamond.ico
셋째 Image 컨트롤 NamePicture imgHeartHeart.ico
넷째 Image 컨트롤 NameCaption imgSpadeSpade.ico
Shape 컨트롤 NameShapeBorderWidth HeightWidth shpCard4 – 둥근 사각형2 735495
CommandButton NameCaption cmdClose닫기(&C)
1) Image 응용 프로그램의 이벤트
Image 응용 프로그램은 이벤트에 아래와 같이 응답합니다.
l 각 Image 컨트롤의 Click 이벤트는 도형을 이미지의 위쪽으로 옮기면서 Shape 컨트롤의 Left 속성을 자신의 Left 속성과 동일하게 설정합니다.
l PictureBox의 Cls 메서드가 실행되어 상태 표시줄에서 현재의 캡션을 지웁니다.
l PictureBox의 Print 메서드가 실행되어 상태 표시줄에 새로운 캡션을 출력합니다.
Image 컨트롤의 Click 이벤트에 대한 코드는 아래와 같습니다.
Private Sub imgHeart_Click()
shpCard.Left = imgClub.Left
picStatus.Cls
picStatus.Print "Selected: Club"
shpCard.Visible = True
End Sub
Click 이벤트 코드의 첫줄에서 = 연산자를 사용하여 Image 컨트롤의 Left 속성을 Shape 컨트롤의 Left 속성으로 지정합니다. 다음 두 줄은 메서드를 호출하여 실행하므로 연산자가 필요하지 않습니다. 셋째 줄에 있는 문자열('Selected: Club')은 Print 메서드에 전달되는 인수입니다.
이 응용 프로그램에는 관심을 둘 만한 코드가 한 줄 더 있는 데 Form Load 이벤트에 들어 있습니다.
shpCard.Visible = False
Shape 컨트롤의 Visible 속성을 False로 설정하면 Shape 컨트롤은 맨 처음 이미지를 선택할 때까지 숨겨져 있습니다. Shape 컨트롤의 Visible 속성은 Image 컨트롤의 Click 이벤트에 내의 마지막 줄에서 True로 설정됩니다.
3.7 추가 컨트롤
여러 가지 기타 표준 컨트롤이 Visual Basic 도구 상자에 들어 있습니다. 일부 컨트롤은 외부의 데이터베이스에 포함된 대량의 데이터를 처리하는 데 편리합니다. 기타 다른 컨트롤은 Windows 파일 시스템을 액세스하는 데 사용할 수 있습니다. 기타 다른 컨트롤들은 분류하기가 어색하지만 편리하게 사용할 수 있습니다.
이전에 사용자 정의 또는 OLE 컨트롤이라고 부르던 ActiveX 컨트롤도 Visual Basic 응용 프로그램에서 표준 컨트롤을 사용하는 것과 같은 방법으로 사용할 수 있습니다. Visual Basic의 Professional edition과 Enterprise edition은 여러 가지 ActiveX 컨트롤을 포함하고 있을 뿐만 아니라 사용자 정의 컨트롤을 만들 수 있는 기능들을 제공합니다. 필요한 모든 용도에 적합한 추가 ActiveX 컨트롤을 수많은 소프트웨어 공급업체로부터 구입할 수 있습니다.
1) 데이터 액세스 컨트롤
오늘날의 업무 환경에서는 거의 모든 정보를 다수의 중앙 데이터베이스에 저장합니다. Visual Basic은 Microsoft Access와 SQL Server를 포함하여 가장 많이 사용하는 데이터베이스를 액세스하기 위한 수많은 데이터 액세스 컨트롤을 제공합니다.
l ADO Data 컨트롤은 데이터베이스에 연결하는 데 사용됩니다. ADO Data 컨트롤을 폼의 여러 컨트롤과 데이터베이스 사이를 연결하는 배관이라고 생각하면 됩니다. ADO Data 컨트롤의 속성과 메서드와 이벤트를 사용하여 응용 프로그램에서 외부 데이터를 검색하고 처리할 수 있습니다.
l DataList 컨트롤은 TextBox 컨트롤과 비슷합니다. DataList 컨트롤을 ADO Data 컨트롤과 함께 사용하여 외부 데이터베이스의 한 필드에서 데이터 목록을 자동으로 채울 수 있습니다.
l DataCombo 컨트롤은 DataList 컨트롤을 입력란과 결합한 것과 비슷합니다. 입력란에서 선택한 문자열을 편집할 수 있으며 변경 사항은 하부 데이터베이스에 나타납니다.
l DataGrid 컨트롤은 데이터를 모눈이나 도표에 표시합니다. DataGrid 컨트롤은 ADO Data 컨트롤과 함께 사용하여 외부 데이터베이스의 여러 필드에서부터 완전히 편집 가능한 데이터를 제시합니다.
l Microsoft Hierarchical FlexGrid 컨트롤은 데이터를 여러 가지 방법으로 볼 수 있게 해주는 유일한 컨트롤입니다. Microsoft Hierarchical FlexGrid 컨트롤은 모눈이 Tree 컨트롤이나 Outline 컨트롤과 결합된 컨트롤이라고 생각하면 됩니다. 실행 모드에서 행과 열을 재정렬하여 데이터를 여러 가지 표시 방식으로 나타낼 수 있습니다.
2) 파일 시스템 컨트롤
파일 처리 기능을 응용 프로그램에 추가하기 위해 Visual Basic은 3개의 컨트롤을 제공합니다. 이런 컨트롤은 일반적으로 함께 사용되어 드라이브, 디렉터리, 파일을 표시합니다. 이런 컨트롤에는 서로를 묶어 주는 특수한 속성과 이벤트를 갖고 있습니다.
l DriveListBox 컨트롤은 ComboBox와 비슷합니다. 사용자가 선택할 수 있는 드라이브가 나열되어 있는 드롭다운 목록을 제공합니다.
l DirListBox는 ListBox 컨트롤과 비슷하지만 현재 선택된 드라이브의 디렉터리 목록을 표시하는 내장 기능이 있습니다.
l FileListBox 컨트롤도 ListBox 컨트롤과 비슷하지만 선택한 디렉터리에 들어 있는 파일의 이름을 목록으로 표시합니다.
메모 이런 컨트롤은 Visual Basic의 이전 버전으로 만들어진 응용 프로그램과 호환하기 위해 제공된 컨트롤입니다. CommonDialog 컨트롤을 사용하여 파일을 더 쉽게 액세스할 수 있습니다. CommonDialog 컨트롤에 대한 자세한 내용은 아래에서 설명하는 "기타 컨트롤"을 참조하십시오.
3) 기타 컨트롤
다수의 기타 표준 컨트롤이 Visual Basic에 들어 있습니다. 각 컨트롤은 특수한 용도로 사용됩니다.
l Timer 컨트롤은 일정한 간격을 두고 순환되는 응용 프로그램의 이벤트를 만드는 데 사용됩니다. 이것은 사용자와의 상호 작용 없이 코드를 실행하는 데 유용합니다.
l OLE Container 컨트롤을 사용하여 연결이나 통합과 같은 기능을 응용 프로그램에 쉽게 추가할 수 있습니다. OLE Container 컨트롤을 사용하여 Microsoft Excel이나 Word 같은 OLE 응용 프로그램의 기능을 사용할 수 있습니다.
l CommonDialog 컨트롤은 응용 프로그램에 내장된 대화 상자를 추가하여 파일, 색, 글꼴, 인쇄 기능을 선택할 수 있게 합니다.
3.8 포커스 설명
포커스는 마우스나 키보드를 통하여 사용자의 입력을 받아들일 수 있는 기능입니다. 한 개체가 포커스를 가지고 있을 때 사용자로부터 입력을 받아들일 수 있습니다. Microsoft Windows 인터페이스에서는 다수의 응용 프로그램을 동시에 실행할 수 있습니다. 그러나 포커스를 가진 한 개의 응용 프로그램만이 활성화된 제목 표시줄을 가지고 사용자의 입력을 받아들일 수 있습니다. 다수의 TextBox를 가진 Visual Basic 폼에서 포커스를 가진 TextBox만이 키보드를 통해 입력된 문자를 표시할 수 있습니다.
GotFocus와 LostFocus 이벤트는 한 개체가 포커스를 받거나 잃을 때에 각각 발생합니다. 폼과 대부분의 컨트롤은 이 이벤트를 지원합니다.
이벤트 설명
GotFocus 개체가 포커스를 받을 때 발생합니다.
LostFocus 개체가 포커스를 잃을 때 발생합니다. LostFocus 이벤트 프로시저는 기본적으로 업데이트 검증과 확인 또는 개체의 GotFocus 프로시저에서 설정한 조건을 되돌리거나 변경하는 데 사용합니다.
다음과 같은 방법으로 개체에 포커스를 줄 수 있습니다.
l 실행 모드에서 개체 선택
l 실행 모드에서 선택키를 사용하여 개체 선택
l 코드에서 SetFocus 메서드 사용
개체가 포커스를 가지고 있을 때 알 수 있습니다. 예를 들어 CommandButton에 포커스가 있으면 캡션 주위에 반전된 테두리가 표시됩니다.(그림 3.19 참조)
그림 3.19 포커스를 갖는 명령 단추
개체는 자신의 Enabled 속성과 Visible 속성이 True로 설정될 때에만 포커스를 받을 수 있습니다. Enabled 속성은 개체가 키보드나 마우스 이벤트 같은 사용자가 만든 이벤트에 응답할 수 있도록 합니다. Visible 속성은 개체를 화면에 나타낼지의 여부를 결정합니다.
메모 폼은 포커스를 받을 수 있는 컨트롤이 포함되어 있지 않을 때만 포커스를 받을 수 있습니다.
3.9 탭 순서 설정
탭 순서는 <Tab>키를 눌러 한 컨트롤에서 다른 컨트롤로 이동하는 순서를 말합니다. 각 폼은 고유의 탭 순서를 가집니다. 일반적으로 탭 순서는 컨트롤을 만드는 순서와 일치합니다.
예를 들면 두 개의 TextBox(Text1과 Text2)와 CommandButton 하나(Command1)를 만든다고 해봅시다. 응용 프로그램이 시작될 때 Text1에 포커스가 있습니다. 그림 3.20처럼 <Tab>키를 누르면 포커스는 컨트롤이 만들어진 순서대로 컨트롤 사이를 이동합니다.
그림 3.20 탭 예제
컨트롤에 대한 탭 순서를 변경하려면 TabIndex 속성을 설정하십시오. 컨트롤의 TabIndex 속성은 탭 순서 위치를 결정합니다. 기본적으로 처음에 그려진 컨트롤은 0의 TabIndex 값을 갖고 두번째 그려진 컨트롤은 1의 TabIndex 값을 갖습니다. 컨트롤의 탭 순서 위치를 변경할 때 Visual Basic은 다른 컨트롤의 탭 순서 위치에 번호를 자동으로 부여하여 삽입과 삭제를 반영합니다. 예를 들면 탭 순서에서 Command1을 첫째로 만들었다면 다른 TabIndex 값은 아래 표에 나타난 것처럼 자동으로 수정됩니다.
컨트롤 변경 전 TabIndex 변경 후 TabIndex
Text1 0 1
Text2 1 2
Command1 2 0
0부터 번호가 매겨지기 때문에 가장 높은 TabIndex 설정값은 항상 탭 순서에 있는 컨트롤의 수보다 1이 적습니다. TabIndex 속성을 컨트롤의 숫자보다 더 높은 수를 설정해도 Visual Basic은 그 값을 컨트롤의 숫자에서 1을 감하여 되돌려 변환합니다.
메모 포커스를 가질 수 없는 컨트롤은 Enabled와 Visible 속성이 True로 설정된 컨트롤과 마찬가지로 TabIndex 속성을 가지지 않으며 탭 순서에 포함되지 않습니다. <Tab>키를 누르면 이 컨트롤은 건너뜁니다.
1) 탭 순서에서 컨트롤 제외
대개 실행 모드에서 <Tab>키를 눌러 탭 순서로 각 컨트롤을 선택합니다. 컨트롤의 TabStop 속성을 False (0)로 지정하여 탭 순서에서 해당 컨트롤을 제외할 수 있습니다.
TabStop 속성이 False로 설정된 컨트롤은 실제 탭 순서에서 여전히 위치를 유지하지만 <Tab>키로 컨트롤을 순환하여 선택하더라도 해당 컨트롤은 건너뜁니다.
메모 OptionButton 그룹은 단 하나의 TapStop을 가지고 있습니다. Value가 True로 설정되어 선택된 단추는 TabStop 속성이 자동으로 True로 설정되고 반면에 다른 단추들의 TabStop 속성은 False로 설정됩니다.
3.10 메뉴의 기초
응용 프로그램에서 명령 집합을 제공하려면 메뉴를 사용하십시오. 메뉴를 사용하여 편리하고 일관성 있는 명령들을 그룹화하면 사용자는 쉽게 명령을 사용할 수 있습니다.
그림 3.21은 제목이 없는 폼에서 메뉴 인터페이스의 요소를 보여줍니다.
그림 3.21 Visual Basic 폼에서의 메뉴 인터페이스 요소
메뉴 표시줄은 폼에서 제목 표시줄 바로 아래에 나타나고 다수의 메뉴 제목을 갖습니다. 예를 들어 [파일] 제목을 선택하면 [새 파일]이나 [끝내기] 같은 메뉴 항목이 들어 있는 목록이 메뉴 아래로 펼쳐집니다. 메뉴 항목은 [새 파일]이나 [끝내기] 등과 같은 명령들과 구분선과 하위 메뉴 제목을 포함할 수 있습니다. 사용자가 보는 각 메뉴 항목은 이 장의 뒷 부분에 설명하는 메뉴 편집기에서 정의한 메뉴 컨트롤과 같습니다.
응용 프로그램을 더 쉽게 사용할 수 있도록 만들려면 메뉴 항목을 기능에 따라 그룹화해야 합니다. 예를 들면 그림 3.21처럼 파일 관련 명령인 [새 파일], [열기], [다른 이름으로 저장] 등은 모두 [파일] 메뉴에서 찾을 수 있습니다.
어떤 메뉴 항목은 직접 작업을 실행합니다. 예를 들면 [파일] 메뉴의 [끝내기] 메뉴 항목은 응용 프로그램을 닫습니다. 다른 메뉴 항목들은 대화 상자를 화면에 나타냅니다. 대화 상자는 응용 프로그램이 명령을 실행하는 데 필요한 정보를 사용자가 제공할 수 있도록 해주는 창입니다. 대화 상자가 나타나는 메뉴 항목 뒤에는 생략 부호(…)가 붙어야 합니다. 예를 들면 [파일] 메뉴에서 [다른 이름으로 저장...]을 선택하면 [다른 이름으로 저장] 대화 상자가 나타납니다.
메뉴 컨트롤은 개체이며 다른 개체와 마찬가지로 모양과 행동을 정의하는 데 사용하는 속성을 갖습니다. 디자인 모드에나 실행 모드에서 Caption, Enabled, Visible, Checked 그리고 기타 속성을 설정할 수 있습니다. 메뉴 컨트롤은 Click 이벤트 하나만 갖고 있습니다. 메뉴 컨트롤의 Click 이벤트는 마우스나 키보드를 사용하여 메뉴 컨트롤을 선택할 때 발생합니다.
1) 팝업 메뉴
팝업 메뉴는 그림 3.22에서 보는 바와 같이 메뉴 표시줄과는 독립적으로 폼 위에 떠다니는 메뉴입니다. 팝업 메뉴에 표시되는 항목들은 마우스 오른쪽 단추가 눌러졌을 때 포인터의 위치에 따라 다릅니다. 그러므로 팝업 메뉴를 상황에 따른 메뉴라고도 합니다. Windows 95에서는 마우스 오른쪽 단추를 눌러서 상황에 따른 메뉴를 나타냅니다. 팝업 메뉴를 사용하여 일반 상황에 적합한 명령에 액세스하기 위한 효과적인 메서드를 제공해야 합니다. 마우스 오른쪽 단추로 입력란을 선택하면 그림 3.22와 같은 상황에 따른 메뉴가 나타납니다.
그림 3.22 팝업 메뉴
하나 이상의 메뉴 항목을 가지고 있는 모든 메뉴를 실행 모드에서 팝업 메뉴로 표시할 수 있습니다. 팝업 메뉴를 표시하려면 PopupMenu 메서드를 사용하십시오.
2) 메뉴 편집기로 메뉴 작성
메뉴 편집기로 기존의 메뉴에 새로운 명령을 추가하거나 기존 메뉴 명령을 자신의 명령으로 바꾸거나 새로운 메뉴와 메뉴 표시줄을 만들거나 기존의 메뉴나 메뉴 표시줄을 변경하고 삭제할 수 있습니다. 메뉴 편집기의 가장 중요한 장점은 사용이 편리하다는 것입니다. 프로그래밍이 거의 필요 없이 완전히 상호 작용하는 방식으로 메뉴를 구성할 수 있습니다.
메뉴 편집기를 화면에 나타내려면
l [도구] 메뉴에서 [메뉴 편집기]를 선택합니다.
l 이렇게 하면 그림 3.23에 보이는 바와 같이 메뉴 편집기가 나타납니다.
그림 3.23 메뉴 편집기
대부분의 메뉴 컨트롤 속성은 메뉴 편집기를 사용하여 설정할 수 있지만 모든 메뉴 속성은 [속성] 창에서도 설정할 수 있습니다. 일반적으로 메뉴 편집기에서 메뉴를 만들지만 하나의 속성만 간단하게 변경하려면 [속성] 창을 사용하면 됩니다.
3.11 사용자에게 대화 상자 보여주기
Windows를 기반으로 하는 응용 프로그램에서 대화 상자는 응용 프로그램을 계속 실행하는 데 필요한 데이터를 확인하거나 정보를 사용자에게 보이는 데 사용됩니다. 대화 상자는 다음의 3가지 방법 중 하나를 사용하여 만들 수 있는 특별한 종류의 Form 개체입니다.
l 미리 정의된 대화 상자들은 코드에서 MsgBox나 InputBox 함수를 사용하여 만들 수 있습니다.
l 사용자 정의된 대화 상자는 표준 폼을 사용하거나 기존의 대화 상자를 사용하여 만들 수 있습니다.
l 인쇄, 파일 열기 같은 표준 대화 상자는 CommonDialog 컨트롤을 사용하여 만들 수 있습니다.
그림 3.24는 MsgBox 함수를 사용하여 만든 미리 정의된 대화 상자의 예입니다.
그림 3.24 미리 정의된 대화 상자
코드에서 MsgBox 함수를 실행시키면 이 대화 상자가 나타납니다. 그림 3.24의 대화 상자를 나타내는 코드는 아래와 같습니다.
MsgBox "파일을 여는 중 오류가 발생하였습니다." &vbCrLf & "다시 시도하십시오.", _
vbExclamation, "텍스트 편집기"
MsgBox 함수에 3개의 인수를 전달해야 합니다. 3개의 인수는 메시지 문자열, 대화 상자의 형태를 결정하는 수치 상수 그리고 제목입니다. 단추와 아이콘을 다양하게 조합하여 여러 가지 모양의 대화 상자를 쉽게 만들 수 있습니다.
대부분의 대화 상자는 사용자와의 상호 작용을 필요로 하기 때문에 일반적으로 모달 대화 상자로 표시됩니다. 응용 프로그램을 계속 실행하려면 모달 대화 상자를 닫아야 합니다. 예를 들면 다른 폼이나 대화 상자로 전환하기 전에 반드시 [확인]이나 [취소]를 눌러야 한다면 모달 대화 상자가 표시되었습니다.
모덜리스 대화 상자는 현재의 대화 상자를 닫지 않아도 포커스를 대화 상자에서 다른 폼으로 이동할 수 있도록 허용합니다. 대화 상자가 표시되어 있는 동안에도 현재의 응용 프로그램을 계속 작업할 수 있습니다. 모덜리스 대화 상자는 별로 많지 않습니다. 일반적으로 응용 프로그램을 계속 실행하려면 응답이 필요하므로 대화 상자를 표시할 것입니다. Visual Basic에서 [편집] 메뉴의 [찾기] 대화 상자가 모덜리스 대화 상자의 한 예입니다. 자주 사용하는 명령이나 정보를 표시하려면 모덜리스 대화 상자를 사용하십시오.