이벤트 핸들러 로직을 공유하기

풀다운메뉴와 툴바의 메뉴는 형식이 다른 콘트롤이나, 동일한 기능을 하는 다른 콘트롤이다. 즉, 이 콘트롤들의 대표적인 이벤트인 클릭(click)을 통해서 동일한 일을 하게 된다. 이럴 때 클릭에 대한 이벤트를 공유한다. 과거 VB6에서는 콘트롤배열(control arrays)이란 개념으로 수행했으나, 이제는 컨트롤의 이벤트 메소드의 Handles문을 통하여 구현할 수 있다.

다음의 경우는 풀다운메뉴를 클릭했을 때(mnuWaldram.Click)와 툴바메뉴를 클릭했을 때(WaldramToolStripButton.Click)에 대한 이벤트 핸들러를 공유한 것이다.

설정내용을 외부에 저장하기

프로그램의 설정을 다음 번에도 사용하기 위해서는 프로그램 외부에 설정내용을 저장해야 한다. VB2005부터는 My.Settings라는 클래스를 통해서 설정내용을 저장할 수 있다.
프로젝트 디자이너에서 응용 프로그램 설정을 추가하려면
1. 솔루션 탐색기에서 프로젝트를 선택하고 프로젝트 메뉴에서 속성을 클릭합니다.
2. 설정 창을 선택합니다.
3. 설정 표의 빈 행을 클릭합니다.
4. 이름 열에 설정 이름을 입력합니다. 이름에는 공백을 사용할 수 없습니다.
5. 형식 드롭다운 목록에서 설정의 데이터 형식을 선택합니다.
6. 범위 드롭다운 목록에서 설정 범위를 선택합니다. 설정 범위는 응용 프로그램 또는 사용자가 될 수 있습니다.
7. 값 열에 설정의 기본값을 입력합니다. 값은 선택한 데이터 형식에 적합해야 합니다.

문자열 비교를 효과적으로 하기

문자열이 NULL인 경우를 판단해야 할 때가 많다. 특히 파일명을 입력받는 과정에서 아무값도 넘겨주지 않는 경우도 고려해야 한다.
일반적으로 문자열비교는 그 내용을 가지고 하지만, NULL인지 여부를 판단하는 경우에는 문자열의 길이로 판단하는 것이 훨씬 빠르다.

An Object Is a Bundle of Capabilities

Allen Holub says,

An object is defined by what it can do, not by how it does it.

Never ask an object for information that you need to do something; rather, ask the object that has the information to do the work for you.

[solarview’s comment]
객체에게 물어야 하는 것은 어떤 정보를 가졌느냐가 아니라, 오히려 뭘 해달라고 하는 것이다.
객체가 정보도 갖고, 행위도 갖고 있으나, 행위에 관심을 가지라는 뜻이다.
이것은 어쩌면 과거의 동일한 기능을 가진 함수들을 모아서 모듈화를 꿈꾸었던 것과 별반 다르지 않는듯 보이게 한다. (2/9/08)

폼에서 마우스 포인터 모양 바꾸기

오랜 시간이 걸리는 작업을 컴퓨터에게 시킬 경우, 대부분의 프로그램에서는 커서의 모양을 모래시계로 바꾸어 놓는다. 작업이 끝나면 원래의 커서 모양으로 환원시키는 것이 일반적이다.
그럼, 비베닷넷에서 어떻게 커서의 모양을 바꿀까?

폼내의 코드에 아래와 같은 코드를 넣으면 된다.

Twip 과 Pixel

Twip
– 화면 독립적인 단위(screen-independent unit). 모든 화면출력장치에서 화면 요소의 비율을 동일하게 한다.
– 1 twip은 1인치(inch)의 1/1440
– 1 twip = 1/20 pixels

Pixel
– 화면 종속적인 단위(screen-dependent unit)
– ‘picture element’의 약자
–  1
pixel은 화면에 표시되는 가장 작은 그래픽 측정 단위임.
– 1 pixel = 1/72 inch
– 1 pixel = 20 twips

Visual Basic 6.0의 기본 측정 단위는 twips
Visual Basic 2005의 기본 측정 단위는 pixels.

– Twip과 Pixel은 관계는 화면에 따라 다르다. 그래서 Screen.TwipsPerPixelX, Screen.TwipsPerPixelY를 이용해서그 값을 구한다.(VB 6.0)

DXF란

1) DXF는 Drawing Interchange Format 또는 Drawing Exchange Format의 약자로 AutoDesk사에서 개발한 CAD 호환용 파일 포맷이다.
2) ASCII 형식은, 다음과 같은 파일 구조로 되어 있다.

  • HEADER 섹션. 도면에 대한 일반
    정보가 들어 있다. 이 섹션은 AutoCAD 데이터베이스의 버전 번호와 여러 개의 시스템 변수로 구성된다. 각 매개변수는 변수 이름과
    연관된 값을 포함하고 있다.
  • CLASSES 섹션. 데이터베이스의 BLOCKS,
    ENTITIES 및 OBJECTS 섹션에 그의 복제가 나타나는 응용프로그램 정의 클래스에 대한 정보를 보유하고 있다. 클래스 정의는 클래스
    계층에 고정된다.
  • TABLES 섹션. 다음의 기호 테이블에
    대한 정의가 들어 있다.

APPID (응용프로그램 식별 테이블)

BLOCK_RECORD (블록 참조 테이블)

DIMSTYLE (치수 스타일 테이블)

LAYER (도면층 테이블)

LTYPE (선종류 테이블)

STYLE (텍스트 스타일 테이블)

UCS (사용자 좌표계 테이블)

VIEW (뷰 테이블)

VPORT (뷰포트 구성 테이블)

  • BLOCKS 섹션. 도면의 각 블록
    참조를 구성하는 블록 정의 및 도면요소가 들어 있다.
  • ENTITIES 섹션. 블록 참조(삽입
    도면요소)를 포함해 도면의 그래픽 객체(도면요소)가 들어 있다. ==> 프로그램을 작성할 때 제일 신경써야 하는 부분이다.
  • OBJECTS 섹션. 도면의 비그래픽 객체가 들어 있습니다.
    도면요소 또는 기호 테이블 레코드 또는 기호 테이블이 아닌 객체는 모두 이 섹션에 저장된다. OBJECTS 섹션에 표시되는 항목의 예로는
    다중선 스타일 및 그룹이 포함된 사전을 들 수 있다.
  • THUMBNAILIMAGE 섹션. 도면의 미리보기 이미지
    데이터가 들어 있다. 이 섹션은 선택 사항이다.

[VBA]PERT/CPM를 위한 엑셀 (Excel Spreadsheet for Critical Path Mathod)

간단한 작업 입력으로 PERT/CPM의 주요 계산을 수행하는 프로그램이다.

공장 또는 작업현장에 있어서의 원자재로부터 최종제품에 이르기까지의 자재,제품조립 및 종합 조립의 흐름을 순서 정연하게 능률적인 방법으로 계획하고 공정을 결정하고 예정을 세워 작업을 할당하고 감독하는 절차가 공정관리이다.

작업 흐름을 순서정연하게 하는 방법 중의 하나가 주공정법(critical path method)으로 본 프로그램은 주공정법을 수행할 수 있도록에 작성되었다.

작업명, 설명, 소요일수, 선행작업 등을 입력하여 공정시간과 여유시간을 계산하여 출력하고, 작업흐름을 한 눈에 볼 수 있도록 간트 도표를 출력한다.

엑셀 프로그램의 특징

1) 작업의 공정시간(EST, EFT, LST, LFT)을 계산한다.
2) 작업의 여유시간(TF, DF, FF)을 계산한다.
3) 작업의 주공정(Critical Path) 여부를 판단한다.
4) 작업의 바 차트를 그려준다.

프로그램의 구성
1) 사용설명서 시트 -> 사용을 위한 주의사항이 있음 (매크로 사용시 필독)
2) 입력 시트 -> 사용자가 직접 입력하는 부분과 계산 부분이 함께 있음
3) 바 차트 시트

프로그램 설명

사용자 삽입 이미지

Download file : CriticalPath.XLS

1) 입력시트에서 작업명, 설명, 소요일수, 선행작업 등을 입력한다.
– 작업명은 알파벳으로 한글자 이상 입력한다
– 설명에는 작업 내용을 기술한다.
– 선행작업이 둘 이상일 때는 쉼표로 구분한다.
2) 입력이 완료되면, 계산실행 단추를 누른다.
3) 공정시간과 여유시간을 계산하여 출력한다. 또한 간트도표를 별도의 시트에 출력한다.

참고한 논문에서는 엑셀의 내장 함수를 이용하여 계산하였으나,
본 엑셀은 내부적으로 비주얼베이직(Visual Basic)을 이용하였다.

If you want to read an english post, please click here.

비주얼베이직(VB)에서 마우스 스크롤이 되는 방법

비주얼 베이직 6.0에서 작업을 하다보면 뜻밖에도 이런 것이 안 되다니 하고 느끼는 것이 있다. 바로 마우스의 휠이 먹히지 않는다는 것이다. 마우스로 화면을 스크롤할 수 없다는 것은 정말이지 뜻밖의 복병이다. 윈도우에서 아무런 문제 없이 사용하던 것이 비주얼베이직에만 오면 딱 그 기능이 멎어버린다. (놀라운 MS사의 센스가 아닐 수 없다!)

이 문제를 해결하려고 하면 아래의 파일을 내려받아서 설치하면 간단하게 해결된다.(왜 이것은 VB6에 기본적으로 포함하지 않는 것도 이상하다. 더군다나 패치에서도 해결할 노력이 없다. SP6까지 오면서 개선된 것이 없다. 다행히도 VB.NET에서는 된다.)

1. 아래의 파일을 내려받는다.
(http://download.microsoft.com/download/e/f/b/efb39198-7c59-4ace-a5c4-8f0f88e00d34/vb6mousewheel.exe)

2. 내려 받은 실행 파일을 클릭하여 실행시킨다.
3. 압축을 풀 폴더를 임의로 선택한다. (단, 위치는 기억한다. 그리고 설치 폴더를 지우면 안 된다.)
4. 다음과 같이 명령어를 입력하여 등록한다.
regsvr32 <압축을 푼 폴더>\VB6IDEMouseWheelAddin.dll
등록되었다는 메시지가 나오면  OK버튼을 클릭한다.
5. Visual Basic 6.0를 실행한다.
6. 메뉴에서 ‘추가기능(Add-Ins)’->추가기능관리자(Add-in Manager)를 선택한다.
7. ‘사용가능한 추가기능’목록 중에서 ‘MouseWheel Fix’를 선택한다.
8. ‘로드 동작’에서 ‘로드/언로드’항목과 ‘시작할 때 로드’항목을 체크(선택)한다.
9. ‘확인’ 버튼을 눌러서 종료한다.

동적 메모리 할당 ReDim에 관하여

처리해야 할 정보의 양에 맞게 변수를 선언하는 것이 프로그래밍의 기본이다.
그러나, 프로그램을 작성하다보면 처리해야 할 정보의 양이 고정되어 있지 않고 상황에 따라 변하는 경우를 자주 만나게 된다. 그렇다면 정보량이 변하는 경우는 어떻게 변수를 선언하고 관리할 것인가?
비주얼베이직에서는 정보량 변화를 수용하기 위하여 변수 크기에 대하여 동적으로 할당할 수 있는 장치를 마련하였다. 그것이 바로 ReDim이다.

그 사용법을 보면 다음과 같다.
1) 최초 변수를 선언할 때, 그 크기를 비워둔다.

보통 배열을 선언할 때, 그 크기를 “1 To 10″과 같이 그 크기를 명시하지만, 여기서는 크기를 비워두는 것이 핵심이다.

2) 상황에 따라 배열의 크기를 설정한다.

상황에 따라 10개가 필요하면 10을 100개가 필요하면 100을, 아니면 특정 변수만큼 필요하면 해당 변수(여기서는 NumberOfData)를 넣어서 그 크기만큼 변수를 만들 수 있다.

이 방법을 사용하는 데 있어서 유의할 것도 있다.
1) 프로그램의 속도가 느려진다.
특히 ReDim을 루프와 같이 반복 계산되는 곳에 두면 프로그램의 속도는 눈에 띄게 느리게 될 것이다. 따라서, 변수의 양이 루프 밖에서도 알 수 있다면 꼭 밖에 두는 것이 현명한 처사이다.

2) 다차원배열의 동적할당
다차원 배열의 동적할당에 있어서는 맨마지막 차원에 대해서만 적용된 것을 명심하자.