삭제된 9장을 복원하는데 실패하고 다시 작성하기로 맘먹고 다시 적습니다 ㅜ.ㅜ
퀀텀 그리드에서 DB를 연결하지 않고 데이타를 출력하는 방법에는 Unbound Mode( 일반 String Grid 처럼 입력하는 방법 ) 와 Provider Mode( 사용자가 임의로 CustomerDataSource를 생성하여 구성하는 방법 )이 있습니다.
가장 많이 사용되는 방법은 Unbound Mode입니다. 하지만, 가끔은 Provider Mode로 작업을 해야 하는 경우가 있습니다.
UnBound Mode는 일반 StringGrid를 사용하는것과 같은 방식이라 보시면 됩니다. ( DataSource를 직접 연결하지 않고 사용하는 방법입니다. )
이번 9장의 1/2 에서는 Unbound Mode의 사용법에 대해 간단히 알아 보도록 하겠습니다.
이번 내용도 역시 본 제작자가 이동 또는 게시하지 않는 경우를 제외하고는 이곳 외에 다른 곳에서 볼 수 없습니다. 이를 어 길시 정말 법적 제제가 가해질 수 있습니다.
-. Unbound Mode로 Grid 표현하기.
퀀텀 그리드를 처음 올려놓으면 기본값이 DBTableView로 되어 있습니다.
그림에서처럼 DBTableView1을 삭제하고 TableView를 선택합니다.
만들어진 TableView는 DBTableView와 거의 같지만, DataController에 DataSource를 연결하는 부분이 없습니다.
직접 Coding상으로 컬럼을 만들거나 값일 넣어야 합니다.
간단한 예제를 하나 들어 보겠습니다.
TTable에 델파이 기본 데모중 하나인 DBDEMOS의 Animals.dbf의 내용을 넣는 예제 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
var iFieldCnt : Integer; I: Integer; fItems : TcxCustomGridTableItem; iRecCnt : Integer; begin // 테이블의 Field 수를 저장. iFieldCnt := Table1.FieldCount; Try cxGrid1TableView1.BeginUpdate; // 컬럼을 생성합니다. cxGrid1TableView1.ClearItems; for I := 0 to iFieldCnt - 1 do begin fItems := cxGrid1TableView1.CreateItem; // CreateColumn을 사용하셔도 됩니다. fItems.Name := cxGrid1TableView1.Name + Table1.Fields[i].FieldName; // 그래픽인경우 if Table1.Fields[i].DataType in [ftGraphic, ftBlob, ftTypedBinary ] Then begin fItems.PropertiesClass := TcxImageProperties; TcxImageProperties( fItems.Properties ).GraphicClass := TBitmap; end; fItems.Caption := Table1.Fields[i].FieldName; end; cxGrid1TableView1.DataController.RecordCount := 0; iRecCnt := cxGrid1TableView1.DataController.RecordCount; // 값을 넣는다. With Table1 do begin First; while not Eof do begin Inc( iRecCnt ); cxGrid1TableView1.DataController.RecordCount := iRecCnt; for I := 0 to iFieldCnt - 1 do cxGrid1TableView1.DataController.Values[ iRecCnt - 1 , i ] := Fields[i].Value; Next; end; // <-- While end; // <-- With Finally cxGrid1TableView1.EndUpdate; End; |
< 간단한 설명 >
cxGrid1TableView1.BeginUpdate와 EndUpdate가 있습니다.
이는 DisableControls나 EnableControl와 비슷한 내용입니다. BeginUpdate함수가 호출되면, cxGrid1TableView의 Display가 값이 변경될때마다 Update가 되지 않도록 Lock을 겁니다. EndUpdate는 Lock을 풀어 변경된 내용을 다시 화면에 그려주게 됩니다.
아시겠지만, 어떤 작업을 반복하여 데이타를 출력할때 대부분 화면에 내용을 그려주는데 CPU가 할애되어 많은 시간이 소요됩니다. 그래서, BeginUpdate와 EndUpdate는 화면에 그려주는 작업을 막아 빠른시간에 값을 할당하게 합니다.
ClearItems로 모든 Item( Column )을 지우고 CreateItem 또는 CreateColumn으로 컬럼을 생성합니다.
생성된 Column에 Caption과 기타 내용을 입력하고 조건에 맞는( 여기서는 Field의 DataType이 ftTypedBinary 인경우 Properies를 변경합니다. Object Inspector에서와 다르게 PropertiesClass를 이용하게 되는데, 이넘은 퀀텀에서 정의된 몇가지의 Properties의 내용을 설정합니다. 대부분 Object Inspect에서 보이는 내용뒤에 Properties가붙습니다. ( 예제 : TcxImageProperties, TcxComboBoxProperties등 처럼 Object Inspector에 보이는 문자 앞뒤에 Tcx와 Properties가 붙습니다. )
필드의 내용을 넣는 부분에서 cxGridTableView1.RecordCount가 퀀텀 그리드의 총 Record갯수가 됩니다.
그리드에 넣을 총량을 안다면, 굳이 cxGridTableView1.RecordCount를 매번 증가 시킬 필요가 없겠지요.
모른다면, While 문으로 돌면서 그냥을 설정하면 됩니다.
값은 cxGridTableView1.DataController.Values[ RecordIndex,ItemIndex ] 에 넣으면 됩니다.
여기서 중요한것은 RecordIndex입니다. 화면에 위치한 Row값이 100% RecordIndex와 동일하지는 않습니다. Fillter나 Sort와 같은 퀀텀 고유의 기능때문에 화면에 보여지는 값의 Row위치와 Record의 실제 위치가 동일하지않기 때문입니다.
따라서 cxGrid1TableView1.Controller.FocusedRowIndex는 화면에 보여지는 Row의 위치값이고..
cxGrid1TableView1.Controller.FocusedRecord.RecordIndex 이넘이 실제 선택된 Row의 실제 레코드 위치 입니다.
헷갈리지 않도록 아래 사용합니다. FocusedRecord를 사용해도 같은 결과 입니다.( DBTableView도 같습니다. )
cxGrid1TableView1.Controller.FocusedRow.RecordIndex <– 실제 레코드의 Index
-. Unbound Mode로 Master-Detail표현하기.
Master – Detail이란것이 주-종 관계를 나타나게 됩니다.
Bound( DB Grid )모드에서 Master-Detail을 사용할때 Detail Table View에서 DataController–>Master Table View를 연결하듯이 UnBound 모드에서도 같은 방식으로 데이타를 연결 합니다.
하지만, Unbound모드는 필드나 데이타가 정해 진것이 아니므로 Record에 Detail Table View를 Link 시키는 방법으로 구현되게 됩니다.
그림과 같이 Level을 구성하고 MasterTableView에 이미 데이타를 넣었다고 가정하겠습니다.
I: Integer;
ADetDataController: TcxCustomDataController;
…
with MasterTableView.DataController do
begin
BeginUpdate;
try
for I := 0 to RecordCount – 1 do
begin
ADetDataController :=
GetDetailDataController( 레코드 여기서는 I, MasterLevel 밑의 DetailLvel번호 여기서는 0 );
with ADetDataController do // 결국 이넘이 하위 Level의 0번째 DetailtableView가 됩니다.
begin
BeginUpdate;
요기서 열심히 값을 넣습니다.
넣은 값은 I 번째 레코드에 Link되므로 I번째 레코드의 Detail로만 표시 됩니다.
너무 쉽죠?
결국은 MasterTableView의 각각의 레코드에 하위 Detail레코드를 넣는다는 말이 됩니다.
알고 보면 간단한 내용입니다. 결국 저 빨강색 내용이 주가됩니다.
간단하게나마 UnBound 모드에 대해 알아 보았습니다.
다음은 Provider Mode에 대해 알아보도록 하겠습니다.
최신 댓글