|
셀 단위로 Edit를 금지하는 건 기본적으로 할 수 없는 걸로 알고 있습니다.
(틀렸다면 지적해주세요)
그래서 그 부분은 3번째나 4번째 셀에 들어왔을때, 2번째 셀을 검사해서
0값이라면 경고용으로 메세지 박스를 하나 띄우고 포커스를 2번째 셀로 보내버리는 편법
을 사용하면 될것 같구요.
색상 구별은 이렇게 해보시는건 어떨런지요.
우선 헤더 파일에
unsigned char sgflag[5][5];
이렇게 선언해 두구요. OnSetEditText 이벤트 함수에서요
void __fastcall TForm1::StringGrid1SetEditText(TObject *Sender, int ACol,
int ARow, const AnsiString Value)
{
if((ACol==1)&&(Trim(Value) == "0"))
{
sgflag[2][ARow] = 1;
sgflag[3][ARow] = 1;
}
else
{
sgflag[2][ARow] = 0;
sgflag[3][ARow] = 0;
}
StringGrid1->Repaint();
}
이렇게 하시고나서, OnDrawCell 이벤트 함수에서
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if(sgflag[ACol][ARow] == 1)
{
StringGrid1->Canvas->Brush->Color = clRed;
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->TextRect(Rect, Rect.Left+3,
Rect.Top+2, StringGrid1->Cells[ACol][ARow]);
}
else if((ACol!=0)&&(ARow!=0))
{
StringGrid1->Canvas->Brush->Color = clWhite; //기본 색상으로...
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->TextRect(Rect, Rect.Left+3,
Rect.Top+3, StringGrid1->Cells[ACol][ARow]);
}
}
이렇게 작성하면요, 어느정도 이선영님께서 원하시는 형태를 얻을 수 있을겁니다.
하지만 위와 같은 방식은 StringGrid가 커질수록 메모리 낭비가 심해진다는 단점이 있네요.
2개의 셀만 할거라면 그냥 sgflag[2] 로 선언해서 사용하는 게 나을 겁니다.
좋은 방법은 아니지만 한번 해보시면 다른 좋은 방법이 떠오르시겠죠..^^
카크였습니다.
김선영 님이 쓰신 글 :
: 저번 질문으로 많은 도움을 받았었습니다
: 다시 한번 감사드리구요
: 또 사용을 하다보니.
: 이것이 궁금하더라구요.
: 만약 6개의 셀이 있다면.
: 그중 2번째의 셀에다가 0의 값을 입력 했을경우.
: 3번째와 4번째 셀만 값을 입력할수 없게 하고 싶거든요.
: 또한 색상의 구별로 표시도 함께 하면서요
: 이런것은 어찌 구현을 해야하는지요
|