|
시간이 없어서 기본적인 처리만 간단히 보여드리자면..
1. 우선 RangeSelect 옵션을 끄시고..
2. SELECTED 라는 선택된 창인지의 여부를 검사하는 변수를 만들어 두신다음
3. OnDrawCell에서 이 것에 맞도록 그림을 칠하는 루틴을 추가합니다
지금은 클릭에서 XOR 형태로 선택을 하게 되었지만, 여기에 마우스 처리 부분까지
추가하신다면 원하시는 모양을 만들어내실 수 있지 않으실까 생각됩니다.
cuperido
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool **SELECTED;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
int itCount, itCol;
StringGrid1->Options = StringGrid1->Options >> goRangeSelect;
SELECTED = new bool *[StringGrid1->RowCount];
for(itCount = 0; itCount < StringGrid1->RowCount; itCount ++) {
SELECTED[itCount] = new bool[StringGrid1->ColCount];
for(itCol = 0; itCol < StringGrid1->ColCount; itCol ++)
SELECTED[itCount][itCol] = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
int itCount;
for(itCount = 0; itCount < StringGrid1->RowCount; itCount ++)
delete [] SELECTED[itCount];
delete [] SELECTED;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
if(State.Contains(gdFixed)) { // 내 포커스
StringGrid1->Canvas->Brush->Color = clBtnFace;
StringGrid1->Canvas->Font->Color = clWindowText;
StringGrid1->Canvas->FillRect(Rect);
Frame3D(StringGrid1->Canvas, Rect, clBtnHighlight, clBtnShadow, 1);
} else if(SELECTED[ARow][ACol]) { // 선택된 창들
StringGrid1->Canvas->Brush->Color = clHighlight;
StringGrid1->Canvas->Font->Color = clHighlightText;
StringGrid1->Canvas->FillRect(Rect);
} else {
StringGrid1->Canvas->Brush->Color = StringGrid1->Color;
StringGrid1->Canvas->Font->Color = StringGrid1->Font->Color;
StringGrid1->Canvas->FillRect(Rect);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect)
{
SELECTED[ARow][ACol] = !SELECTED[ARow][ACol];
}
//---------------------------------------------------------------------------
유영인 Cuperido 님이 쓰신 글 :
: 제가 확실히 이해했는지는 모르겠습니다만..
:
: 그리드를 새롭게 그리고 싶다고 가정하였을때..
: 저 같으면 이 같은 방법을 사용할 것 같습니다.
:
: 1. Option에서 goVertLine, goHorzLine을 꺼서 기본적인 그리드 선이 출력되지 않도록 하고
: 2. OnDrawCell에서 선을 다시 그리는 작업을 하되..
: 3. 계속 그리면 안되니깐 왼쪽 맨상단 그릴시에만 작업하도록
: 그리드의 프로퍼티의 LeftCol, TopRow을 참고해서 OnDrawCell의 인자인 Row, Col과 맞으면
: 그리도록 할 것 같습니다.
:
:
: 빌더초보 님이 쓰신 글 :
: : 구현하려 하는 업무를 고려해 볼 때 효율성 및 내공 증진(?)차원에서
: :
: : Panel과 Label을 사용하여 Component를 제작하는것보다 Grid를 상속받아 쓰는게 낫다고 생각하여 벌써 3일째 그리드만 파고 있는 빌더 초보입니다... RealGrid를 사용한다면 좀더 쉽게 해결할 수 있겠으나 예산상 문제 및 내공 증진의 차원에서 Grid를 직접 파는게 낫다고 생각하여 며칠째 델파이 Grids및 DBGrids 유닛과 전쟁중입니다...-_-
: :
: : 이런 질문은 델파이 게시판에 올리는게 더 적당할지도 모르겠지만 작업중인 Tool이 빌더라 이 게시판에
: : 올리는 것을 양해해 주시길 바랍니다.
: :
: : 지금 현재 방향은, CustomGrid를 상속받아 새로운 Grid형태의 컴포넌트를 구현하여 업무를 해결하려
: : 하는 것인데, 여기에는 그리드의 기본 기능 이외에 셀 병합/삭제 및 해당 셀 병합/삭제시 하나의 셀로 이벤
: : 트를 받게 하고, 그리드 선택시 단순히 Range Select가 아닌, 마치 HTML 표를 선택한 것과 같은 효과를 구현하려고 생각 중입니다. (즉 선택 영역이 직사각형이 아니고, 첫줄 선택 영역은 선택 시작 Cell부터 그줄 끝까지, 마지막줄 선택 영역은 그줄 처음부터 선택 끝 Cell까지, 나머지 영역은 RowSelect를 한 것과 같은 효과를 주려고 합니다...)
: :
: : 그리는 방법에 대한 알고리즘은 생각해 두었으나, 문제는 이것을 CustomGrid를 활용하여 어느 시점에, 어떤 Method를 사용하여 그려야 할지에 대한 방법을 아직 찾질 못하였다는 것입니다. 이것을 해결하기 위하여 델파이로 TCustomGrid의 VCL 소스를 열어 Options속성을 구현하는 Method인 SetOption부분을 참조하여 이를 override할 생각을 해 보았고, RangeSelect가 설정되었을 경우 어떤 식으로 설정하는지에 대한 부분은 보았으나 아쉽게도 TGridRect를 쓰는 관계로 사각형의 Range만을 지원하는 것을 확인했습니다.-_-
: :
: : 그래서 MultiSelect 기능이 지원되는 TDBGrid 소스까지 뒤져 보았으나 이놈은 DataSource라는 개념이 추가되어 분석이 더더욱 쉽지 않은 형편입니다. 대략 Bookmark를 활용하는 것까지는 확인하였으나 이것을 어느 시점에 그려주는지에 대한 부분은 아직 확인하지 못한 상태입니다. CustomGrid에서도 이 부분은 아직 찾지를 못했습니다... Grid를 그리는 부분에서 제가 미처 생각하지 못했던 부분이 있는 것 같습니다... 그동안 VCL로 UI관련 작업은 거의 안맡아 왔고 DB를 주로 쓰는 업무만 하다보니 UI관련 테크닉에 대한 내공의 부족을 절절히 느끼고 있습니다...ㅠㅠ
: :
: : 제가 지금 직면한 문제를 어떻게 해결해야 하는지(특히 Grid를 그려주는 부분이 어느 곳에 있는지만이라도...) 고수님들의 한수 가르침 부탁드립니다...
: :
|