초점을 제한하여 제어 데이터 검증
Validate 이벤트와 CausesValidation 속성은 사용자가 컨트롤에서 포커스를 이동할 수 있도록 허용하기 전에 컨트롤에 대한 입력을 확인하는 데 함께 사용됩니다. 예: 여러 개의 텍스트 상자와 도움말 버튼이 있는 응용 프로그램을 생각해 보세요. 각 텍스트 상자가 포커스를 받으면 텍스트 상자의 특수 유효성 검사 기준이 충족될 때까지 사용자가 포커스를 이동하지 못하도록 하려고 합니다. 사용자는 텍스트 상자에 포커스가 있을 때 포커스를 이동할 수 있습니다. 도움말 버튼은 언제든지 클릭할 수 있습니다. 이렇게 하려면 Validate 이벤트에서 유효성 검사 조건을 설정하고 도움말 단추의 CausesValidation 속성을 False로 설정하십시오. 속성이 True(기본 설정)로 설정되면 첫 번째 컨트롤에서 Validate 이벤트가 발생합니다. 속성이 False로 설정되면 첫 번째 컨트롤의 Validate 이벤트가 먼저 발생합니다.
Validate 이벤트는 LostFocus 이벤트(정의에 따라)가 포커스가 이동한 후에 발생하기 때문에 LostFocus 이벤트보다 데이터 항목의 유효성을 검사하는 데 더 적합합니다. 대신 Validate 이벤트를 사용하면 유효성 검사 규칙이 충족될 때까지 포커스가 다른 컨트롤로 이동하는 것을 방지할 수 있습니다.
가능한 용도
데이터 입력 응용 프로그램은 MaskedEdit 컨트롤에서 제공하거나 비즈니스 규칙에서 발생하는 검증보다 더 복잡한 데이터 입력 검증을 수행해야 합니다.
양식은 데이터가 필드에 입력될 때까지 사용자가 TAB 키나 액셀러레이터 키를 사용하여 컨트롤을 이동하는 것을 방지해야 합니다.
Internet Explorer에서 실행되는 ActiveX 문서에는 스크립트가 프로그래밍 방식으로 포커스를 이동하기 전에 사용자가 양식 작업을 완료할 수 있는 방법이 필요합니다.
Validate 이벤트에 대한 포커스 제어
Validate 이벤트에는 keepfocus 매개변수가 포함되어 있습니다. 매개변수가 True로 설정되면 컨트롤이 포커스를 유지합니다. 이는 사용자가 다른 컨트롤을 클릭하는 것을 효과적으로 방지합니다.
컨트롤 배열 사용
컨트롤 배열은 공통 이름과 유형을 가진 컨트롤 그룹입니다. 그들의 사건 진행 과정도 마찬가지다. 컨트롤 배열에는 요소가 하나 이상 있어야 하며, 요소 수는 시스템 리소스와 메모리가 허용하는 범위 내에서 늘어날 수 있습니다. 배열의 크기도 각 컨트롤에 필요한 메모리와 Windows 리소스에 따라 달라집니다. 컨트롤 배열에서 사용할 수 있는 최대 인덱스 값은 32767입니다. 동일한 컨트롤 배열의 요소에는 고유한 속성 설정이 있습니다. 컨트롤 배열의 일반적인 용도에는 메뉴 컨트롤 및 옵션 버튼 그룹화 구현이 포함됩니다.
Visual Basic에는 런타임 에 참조되지 않은 컨트롤을 Controls 컬렉션에 동적으로 추가하는 기능이 포함되어 있습니다. 이 항목에서는 디자인 타임에 컨트롤을 잘라내어 양식에 붙여넣는 방식으로 추가되는 참조 컨트롤만 참조합니다. 런타임 시 컨트롤 추가에 대한 자세한 내용은 "메서드 추가(컨트롤 컬렉션)" 및 "메서드 추가(라이센스 컬렉션)" 참조 항목을 참조하세요.
컨트롤 배열을 사용하는 이유
디자인 타임에 컨트롤 배열을 사용하여 컨트롤을 추가하면 동일한 유형의 여러 컨트롤을 양식에 직접 추가하는 것보다 리소스가 덜 소모됩니다. 컨트롤 배열은 여러 컨트롤이 코드를 공유하려는 경우에도 유용합니다. 예를 들어 세 개의 옵션 버튼이 포함된 컨트롤 배열을 만드는 경우 어떤 버튼을 클릭하든 관계없이 동일한 코드가 실행됩니다.
런타임에 컨트롤의 새 인스턴스를 만들려면 새 컨트롤이 컨트롤 배열의 멤버여야 합니다. 컨트롤 배열을 사용할 때 각각의 새 멤버는 배열의 공개 이벤트 프로시저를 상속합니다.
각 새 컨트롤은 배열용으로 작성된 이벤트 프로시저를 상속하기 때문에 컨트롤 배열 메커니즘을 사용하여 런타임에 새 컨트롤을 만드는 것은 불가능합니다. 예를 들어 양식에 여러 개의 텍스트 상자가 있고 각 텍스트 상자가 날짜 값을 허용하는 경우 모든 텍스트 상자가 동일한 유효성 검사 코드를 공유하도록 컨트롤 배열을 만들 수 있습니다.
샘플 애플리케이션: Calc.vbp
그림 7.2에 표시된 계산기 샘플 응용 프로그램(Samples!Alink(vbsamples) 디렉터리에 나열됨)에는 숫자 버튼과 작업 버튼이라는 두 개의 컨트롤 배열이 포함되어 있습니다.
예제에서는 object(index) 구문을 사용하여 각 컨트롤을 참조하는 방법을 확인하세요. 컨트롤을 생성할 때 인덱스 값을 지정합니다. 실제로 디자인 타임에 컨트롤에 대한 임의의 인덱스를 지정하면 컨트롤이 배열의 일부가 됩니다.
Index 속성은 컨트롤 배열의 요소를 구별합니다. 배열의 컨트롤이 이벤트를 인식하면 Visual Basic은 공용 이벤트 프로시저를 호출하고 매개 변수(Index 속성 값)를 전달하여 이벤트를 인식한 컨트롤을 식별합니다.
예를 들어 Number_Click 이벤트 프로시저의 첫 번째 코드 줄은 다음과 같습니다.
PRivateSubNumber_Click(IndexAsInteger)
Number(0)이 이벤트를 식별하면 VisualBasic은 0을 인덱스 매개변수로 전달하고, Number(1)이 이벤트를 식별하면 VisualBasic은 1을 인덱스 매개변수로 전달합니다. 인덱스 값과 달리 실행된 나머지 Number_Click 코드는 Number(0)부터 Number(9)까지 동일합니다.
디자인 타임에 컨트롤 배열 생성
디자인 타임에 컨트롤 배열을 만드는 방법에는 세 가지가 있습니다.
1. 여러 컨트롤에 동일한 이름을 지정합니다.
2. 기존 컨트롤을 복사하여 양식에 붙여넣습니다.
3. 컨트롤의 Index 속성을 Null이 아닌 값으로 설정합니다.
메뉴 컨트롤 배열은 메뉴 편집기에서 생성되어야 합니다. 이 작업에 대한 자세한 내용은 6장, "사용자 인터페이스 생성"의 "런타임에 메뉴 생성 및 수정"을 참조하십시오.
컨트롤 이름을 변경하여 컨트롤 배열 요소를 추가하려면:
1. 컨트롤 배열에 추가할 컨트롤(동일한 유형의 컨트롤이어야 함)을 그려 배열의 첫 번째 요소가 될 컨트롤을 결정합니다.
2. 컨트롤을 선택하고 이름 설정 값을 배열의 첫 번째 요소 이름 설정 값으로 변경합니다.
3. 배열의 컨트롤에 대한 기존 이름을 입력하면 Visual Basic은 컨트롤 배열을 만들 것인지 확인하는 대화 상자를 표시합니다. 이 시점에서 "확인"을 선택하여 작업을 확인합니다.
예를 들어 컨트롤 배열의 첫 번째 요소 이름이 cmdCtlArr인 경우 CommandButton을 선택하여 배열에 추가하고 이름을 cmdCtlArr로 설정하면 다음과 같은 메시지가 표시됩니다. 이미 존재합니다. 컨트롤 배열을 생성하시겠습니까?" 확인을 선택하여 작업을 확인합니다.
이 방법으로 추가된 컨트롤은 Name 속성과 컨트롤 유형만 공유하며, 다른 속성은 컨트롤이 원래 그려졌을 때와 동일한 값을 갖습니다.
기존 컨트롤을 복사하여 컨트롤 배열 요소를 추가하려면 다음을 수행하십시오.
1. 컨트롤 배열에 컨트롤을 그립니다.
2. 컨트롤에 포커스가 생기면 "편집" 메뉴에서 "복사" 명령을 선택합니다.
3. "편집" 메뉴에서 "붙여넣기" 명령을 선택하십시오. Visual Basic에서는 컨트롤 배열 생성을 확인할지 묻는 대화 상자를 표시합니다. 확인을 선택하여 작업을 확인합니다. 컨트롤에 할당된 인덱스 값은 1입니다. 그려진 첫 번째 컨트롤의 인덱스 값은 0입니다.
각각의 새 배열 요소의 인덱스 값은 컨트롤 배열에 추가된 순서와 동일합니다. 이와 같은 컨트롤을 추가하면 높이, 너비, 색상과 같은 대부분의 시각적 속성이 배열의 첫 번째 컨트롤에서 새 컨트롤로 복사됩니다.
런타임에 컨트롤 배열 추가
런타임 시 Load 및 Unload 문을 사용하여 컨트롤 배열에서 컨트롤을 추가하고 제거할 수 있습니다. 그러나 추가된 컨트롤은 기존 컨트롤 배열의 요소여야 합니다. 대부분의 경우 디자인 타임에 Index 속성이 0인 컨트롤을 만든 다음 런타임에 다음 구문을 사용해야 합니다.
컨트롤 배열의 새 요소를 로드할 때 대부분의 속성 설정은 아래 첨자가 가장 작은 배열의 기존 요소(이 경우 인덱스 0의 요소)에서 복사됩니다. Visible, Index 및 TabIndex 속성 설정은 컨트롤 배열의 새 요소에 자동으로 복사되지 않으므로 새로 추가된 컨트롤을 표시하려면 해당 Visible 속성을 True로 설정해야 합니다.
배열에 이미 존재하는 인덱스 값에 대해 Load 문을 사용하려고 하면 Visual Basic 에서 오류가 생성됩니다.
중요한 점은 Unload 문을 사용하여 Load 문에 의해 생성된 모든 컨트롤을 삭제할 수 있다는 것입니다 . 그러나 Unload는 컨트롤 배열의 일부인지 여부에 관계없이 디자인 타임에 생성된 컨트롤을 삭제할 수 없습니다.
제어 방식: 컨트롤 배열에 컨트롤 추가 및 제거
런타임에 컨트롤을 추가하고 제거하는 방법은 컨트롤이 옵션 버튼인 컨트롤 배열 예제에 설명되어 있습니다. 이 예에 따르면 사용자는 옵션 버튼을 추가하여 그림 상자의 배경색을 변경할 수 있습니다.
그림 7.3과 같이 폼을 시작한 다음 그림 상자, 레이블, 두 개의 옵션 단추 및 세 개의 명령 단추를 그립니다.
어레이 애플리케이션 이벤트 제어
다음으로 옵션 버튼과 명령 버튼에 대한 이벤트 프로시저를 추가해야 합니다. 양식 선언을 추가한 후 애플리케이션을 시작합니다.
DimMaxIdAsInteger
모든 옵션 버튼은 Click 이벤트 프로시저를 공유합니다.
PrivateSuboptButton_Click(IndexAsInteger)
picDisplay.BackColor=QBColor(인덱스 1)
EndSub
"추가" 명령 단추의 Click 이벤트 프로시저를 통해 새 옵션 단추를 추가합니다. 이 예제에서는 Load 문을 실행하기 전에 코드가 10개 이하의 옵션 단추가 로드되었는지 확인합니다. 컨트롤이 로드된 후 해당 Visible 속성을 True로 설정해야 합니다.
PrivateSubcmdAdd_Click()
IfMaxId=0ThenMaxId=1 '모든 옵션 버튼을 설정합니다.
IfMaxId>8ThenExitSub '10개의 버튼만 허용됩니다.
MaxId=MaxId 1 '버튼 수가 증가합니다.
LoadoptButton(MaxId) '새 버튼을 만듭니다.
optButton(0).SetFocus '버튼 옵션을 재설정합니다.
'새 버튼을 이전 버튼 아래에 배치합니다.
optButton(MaxId).Top=optButton(MaxId-1)._
상위 400위
optButton(MaxId).Visible=True '새 버튼을 표시합니다.
optButton(MaxId).Caption=옵션&MaxId 1
EndSub
삭제 명령 단추의 Click 이벤트 프로시저를 통해 옵션 단추를 삭제합니다.
PrivateSubcmdDelete_Click()
IfMaxId<=1ThenExitSub '처음 두 개의 버튼을 유지합니다.
UnloadoptButton(MaxId) '마지막 버튼을 삭제합니다.
MaxId=MaxId-1 '버튼 수가 감소합니다.
optButton(0).SetFocus '버튼 옵션을 재설정합니다.
EndSub
닫기 버튼의 Click 이벤트 프로시저를 통해 애플리케이션을 종료합니다.
PrivateSubcmdClose_Click()
언로드미
EndSub
->