상세 컨텐츠

본문 제목

Flex Grid 컨트롤

프로그래밍/JAVA

by 라제폰 2009. 1. 23. 17:22

본문


FlexGrid 컨트롤 | My Job 2005/01/04 13:53
http://blog.naver.com/semy33/80009072664

출처 -- http://misdb.gsnu.ac.kr/%7Edyjeong/VB/ch14/ch14_2.htm

 

14.2  FlexGrid 컨트롤

1) FlexGrid 란

Microsoft FlexGrid(MSFlexGrid) 컨트롤을 사용하면 표 형식의 데이터를 표시하고 작동하는데 편리하다. 즉,. 문자열과 그림이 수록된 표를 유연성 있게 정렬, 병합 및 포맷할 수 있다.  FlexGrid가 아주 복잡한 것처럼 보이나, 덱스트 박스와 조합하면 엑셀처럼 표계산 응용 프로그램과 같이 사용할 수 있다.

FlexGrid에서는 눈금 하나 하나를 셀(Cell)이라고 한다. 또한 셀의 가로 정렬을 열(Col), 세로 정렬을 행(Row)라고 하며, FlexGrid에 표시된 모든 셀의 집합을 그리드(Grid)라고 한다.

wpe17.jpg (12463 bytes)

  2) FlexGrid 추가

FlexGrid는 ActiveX 컨트롤로 지원되고  있다. Visual Basic에서 FlexGrid를 이용하기 위해서는

  1. [프로젝트]메뉴의 [구성요소...]를 선택하고 <구성요소> 대화상자가 나타나게 한다.
  2. <구성요소> 대화상자의 <컨트롤> 탭 버튼을 클릭한다.
  3. Microsoft FlexGrid Control 6.0을 체크하고 <확인> 버턴을 클릭한다.

wpe13.jpg (37961 bytes)

응용 프로그램에서 프로젝트에 MSFlxGrd.ocx 파일이 추가된다. 이 파일을 프로젝트에 자동으로 포함시키려면 Autoload 파일에 넣으면 됩니다. 응용 프로그램을 배포할 때 사용자의 Microsoft Windows System 디렉터리에 MSFlxGrd.ocx 파일을 설치해야 합니다.

  3) FlexGrid의 기본설정

FlexGrid를 이용하려면 최초에 셀의 수를 지정해야만 한다. 셀의 수를 지정하기 위해서는 다음의  4개의 속성을 이용한다.

  • Cols 속성 : MSFlexGrid에 있는 열의 전체 개수를 반환하거나 설정합니다.
  • Rows 속성 : MSFlexGrid에 있는 행의 전체 개수를 반환하거나 설정합니다.
  • FixedCols 속성 : MSFlexGrid 내에 있는 고정 열의 전체 개수를 반환하거나 설정합니다.
  • FixedRows 속성 : MSHFlexGrid 내에 있는 고정 행의 전체 개수를 반환하거나 설정합니다.

예를 들면 고정행/고정열을 각각 1개씩 갖고, 행과 열의 수가 각각 10개, 6개인 데이터를 취급하는 FlexGrid를 만들기 위해서는 다음과   같이 설정한다.

MSFlexGrid1.FixedRows = 1

MSFlexGrid1.FixedCols = 1

MSFlexGrid1.Rows = 11

MSFlexGrid1.Cols = 7

Rows와 Cols 속성값은 실제로 데이터가 나타나는 행과 열의 수에다 고정행 및 고정열의 수를 더한다.

4) 셀에 데이터 설정

(1) 셀과 범위의 선택

FlexGrid에서는 셀에 대해 무엇인가를 조작하는 경우, Active Cell을 지정하는 일이 많다. Active Cell이란 현재 주목하고 있는 셀로 Row 속성과 Col 속성으로 지정한다.

  • Row 속성 : Active Cell의 행 번호를 취득/설정한다.

  • Col 속성 :  Active Cell의 열 번호를 취득/설정한다.

행과 열 번호는 0에서 시작한다. 예를 들어 행의 총수(Rows)가 4일 때, 행(Row)의 값은 0 ~ 3 값을 가질 수 있다.

또한 그리드 상에서 셀의 범위를 지정한 할 수 있다. 이를 위해서는 RowSel 속성과 ColSel 속성을 이용한다.

  • RowSel 속성 :  Active Cell 범위의 시작점 또는 끝점의 행번호를 취득/설정한다.

  • ColSel 속성 :  Active Cell 범위의 시작점 또는 끝점의 열번호를 취득/설정한다.

예를 들어 MSFlexGrid1의 2행 3열에서 6행 5열의 셀 범위를 지정하는 경우는 다음과 같다.

MSFlexGrid1.Row = 1
MSFlexGrid1.Col = 3
MSFlexGrid1.RowSel = 5
MSFlexGrid1.ColSel = 4

wpe18.jpg (13033 bytes)

 

(2) Active Cell에 데이터 넣기

Text 속성을 설정하면 Active Cell에 문자열을 표시할 수 있다.

  • Text 속성 : Active Cell에 표시된 문자열을 설정/취득한다.

다음은 현재 셀에 "Here"을 넣고 셋째 행의 셋째 셀을 활성 셀로 변경하여 "There"을 넣는 예제입니다. <F5>키를 누른 다음 모눈을 누르면 프로그램이 실행됩니다.

Private Sub Form1_Load () MSFlexGrid1.Rows =8 MSFlexGrid1.Cols =5 End Sub 
Private Sub MSHFlexGrid1_Click () 
' 현재 셀에 텍스트를 놓습니다. MSFlexGrid1.Text ="Here" ' 세번째 행과 열에 텍스트를 놓습니다. MSFlexGrid1.Col =2 MSFlexGrid1.Row =2 MSFlexGrid1.Text ="There" End Sub 

(3) 배열을 이용한 방법

앞의 방법에서는 Active Cell을 선택한 후에, 셀에 문자열을 설정하였으나, TextArray() 속성이나, TextMatrix() 속성을 이용하여 보다 간단히 문자열을 표시할 수 있다.

  • TextArray() 속성 : 그리드 각각의 셀에 대응한 배열이다. 인덱스에는 왼쪽 위의 셀을 0, 그 오른쪽 옆을 1로 하는 일련 번호를 지정한다.
  • TextMatrix() 속성 : 그리드 각각의 셀에 대응한 배열이다. 인덱스에는 행번호, 열번호를 순서대로 지정한다.

TextArray() 속성과 TextMatrix() 속성은 인덱스를 지정하는 방법이 다르다. TextArray() 속성이 왼쪽 위의 셀을 0으로 하는 일련번호로 셀을 지정하는 것에 대하여,  TextMatrix() 는 행번호/열번호의 두 개로 셀을 지정한다.

다음 예제는 TextMatrix() 속성을 이용하여 각 셀에 행이름과 열이름을 설정하는 코드이다.

Private Sub Form_Load()
  With MSFlexGrid1
    For r = 1 To .Rows - 1
        For c = 1 To .Cols - 1
        .TextMatrix(r, c) = r & "행" & c & "열"
    Next
        Next
  End With
End Sub

wpe19.jpg (20510 bytes)

 

(4) 행의 추가와 삭제

그리드에서 새로운 데이터를 추가하는 경우, 보통은

  1. 그리드의 크기를 크게한다.
  2. 그리드에 데이터를 설정한다.

라고 하는 두 개의 조작을 해야 한다. 그러나 행 단위 데이터를 추가하는 경우에는 AddItem 메서드를 이용하며, 반대로 삭제할 경우 RemoveItem 메서드를 이용할 수 있다.

  • AddItem 메서드 : 그리드의 열에 데이터를 추가한다.

구문 : AddItem <문자열> [, <행 번호>]

<행 번호>로 지정된 위치에 새로운 행을 추가하고, <문자열>에서 지정된 데이터를 설정한다. <문자열>에 탭 내장상수(vbTab)를 넣으면, 여러 열에 데이터를 설정할 수 있다. <행 번호>를 생략하면 그리드의 최후에 데이터를 추가하다.

  • RemoveItem 메서드 : <행 번호>로 지정된 위치이 행을 삭제한다.

구문 : RemoveItem  <행 번호>

다음 예는 여러 열에 데이터를 설정하는 코드이다.

MSFlexGrid1.AddItem vbTab & "서울시" & vbTab & "서초구" & vbTab & "방배동" & vbTab & "방배로"

5) 셀의 크기 변경

셀에 긴 문자열을 표시하는 경우 데이터가 모두 보이지 않는 경우가 있다. 이 경우 문자를 모두 표시하려면 셀의 크기를 변경해야만 한다.

(1) 마우스에 의한 셀이 크기변경

FlexGrid는 AllowUserResizing 속성을 사용하여  셀의 크기를 사용자가 마우스로 변경하는 기능을 지원한다.

AllowUserResizing 속성의 설정값은 다음과 같다.

상수 설명
flexResizeNone 0 없음(기본값). 마우스로 크기를 조정할 수 없습니다.
FlexResizeColumns 1 열. 마우스로 열 크기를 재조정할 수 있습니다.
FlexResizeRows 2 행. 마우스로 행 크기를 재조정할 수 있습니다.
FlexResizeBoth 3 모두. 마우스로 행과 열 크기를 재조정할 수 있습니다.


(2) 코드에서 셀의 크기 변경

코드에서 셀의 크기를 변경하려면 RowHeight()와 ColWidth() 두 개의 속성을 이용한다.

  • RowHeight() 속성 : 셀의 높이를 설정한다.
  • ColWidth() 속성 : 셀의 너비를 설정한다.

    RowHeight() 속성과 ColWidth() 속성은 원래 배열로 되어 있고, 인덱스에는 각각의 셀의 열 번호, 셀의 행 번호를 지정한다.

다음 예제는 폼 로드시 랜덤하게 각 셀에 문자열을 설정한 후 그리드에 표시되어 있는 문자가 모두 나타나도록  셀의 너비를 조정하는 프로그램이다.

Private Sub Form_Load()
    Randomize
    With MSFlexGrid1
        For c = 1 To .Cols - 1
            For r = 1 To .Rows - 1
                .TextMatrix(r, c) = Left("ABCDEFGHIJKLMNO", Rnd(1) * 15 + 1)
            Next
        Next
    End With
End Sub

<조정전의 그림>

wpe1E.jpg (25533 bytes)

Private Sub Command2_Click()
     With MSFlexGrid1
        Me.Font = .Font
        For c = 1 To .Cols - 1
            For r = 1 To .Rows - 1
                sw = Me.TextWidth(.TextMatrix(r, c))
                If sw > MaxW Then
                    MaxW = sw
                End If
            Next
            .ColWidth(c) = MaxW + 90
        Next
    End With

End Sub

<조정후의 그림>

wpe1F.jpg (23477 bytes)

6) 셀의 병합

MergeCells 속성은 같은 내용을 가진 셀들을 여러 행이나 열에 걸쳐 단일 셀로 묶을지 여부를 결정하는 값을 반환하거나 설정합니다.

MergeCells 속성값의 설정은 다음과 같습니다.

상수 설명
flexMergeNever 0 병합 안함. 동일한 내용을 가진 셀들을 그룹화하지 않습니다. 기본값입니다.
flexMergeFree 1 자유. 동일한 내용을 가진 셀들을 항상 병합합니다.
flexMergeRestrictRows 2 행 제한. 행 내에서 동일한 내용을 갖는 인접 셀(현재 셀의 왼쪽에 있는)들만 병합합니다.
flexMergeRestrictColumns 3 열 제한. 열 내에서 동일한 내용을 갖는 인접 셀(현재 셀의 위에 있는)들만 병합합니다.
flexMergeRestrictBoth 4 모두 제한. 행 또는 열 내에서 동일한 내용을 갖는 인접 셀(현재 셀의 왼쪽 또는 위에 있는)들만 병합합니다.


셀 병합 기능을 사용하면 데이터를 명확하고 간결하게 표시할 수 있다.

MSFlexGrid의 셀 병합 기능을 사용하려면

  • MergeCells을 0 이외의 값으로 설정합니다.
  • MergeRow와 MergeCol 배열 속성을 True로 설정하여 행과 열이 병합되도록 한다.

셀 병합 기능을 사용할 경우 MSFlexGrid는 동일한 내용을 가진 셀들을 병합합니다. 셀의 내용이 변경될 때마다 병합은 자동으로 업데이트됩니다.

MergeCells이 0(병합 안함) 이외의 값으로 설정될 경우 선택 부분의 반전이 자동으로 해제된다. 이것은 다시 그리기를 빠르게 하기 위하여 그리고 병합된 셀이 선택 범위에 있을 경우 예상치 않은 결과를 초래할 수 있기 때문에 해제된다.

 

관련글 더보기