Q&A

  • 스트링그리드의 선택된 영역의 색깔을 바꿀려면?
안녕하세요.

델파이를 취미삼아 이것저것 만들고 있습니다.

스트링그리드를 한번 써보려고 하니까, 스트링그리드 자체로도 기능이 풍부하고 재미있네요.

문제는 하나의 폼에 달력과 스트링그리드, 그리고 나머지 콘트롤들을 올려놨는데요.

예를 들어 달력과 스트링그리드로만 말씀드리겠습니다.

달력이나 스트링그리드나 어느 하나의 자료는 선택되도록 되어 있는 것들인데요.

Samples 페이지에 있는 달력은 선택된 영역의 배경색이 파란색으로 바뀌고, 글자는 역상으로 자동으로바뀝니다.

그러나 스트링그리드에서 선택된 영역은 배경색만 파란색으로 바뀌고 글자형태는 여전히 그대로여서, 스트링그리드에서 달력으로 포커스를 옮기면 스트링그리드의 선택된 영역이 반전되면서(배경이 파란색으로 바뀌면서), 글자가 잘 보이질 않네요.



사실 제가 원하는 것은 스트링그리드에서 자료를 선택해도 그 선택된 영역은 선택되지 않은 영역과 동일한 형태로 유지할 수 있는 것을 원하거든요.

즉, 선택되나 안되나 똑같은 형태를 유지하는 것...



똑같은 형태를 유지하지 않더라도 스트링그리드가 포커스되지 않았을 때, 스트링그리드의 이전에 선택된 영역(파란색으로 바뀐 영역)의 배경색을 선택되지 않은 다른 영역의 색상으로 바꿀 수 있는 방법을 알고 싶습니다.



혹시 이와같이 조작할 수 있는 방법을 아시는 분은 도움을 주셨으면 합니다.



그럼 좋은시간들 되십시오.

2  COMMENTS
  • Profile
    홍성락 2001.09.12 07:36
    이길환 wrote:

    > 안녕하세요.

    > 델파이를 취미삼아 이것저것 만들고 있습니다.

    > 스트링그리드를 한번 써보려고 하니까, 스트링그리드 자체로도 기능이 풍부하고 재미있네요.

    > 문제는 하나의 폼에 달력과 스트링그리드, 그리고 나머지 콘트롤들을 올려놨는데요.

    > 예를 들어 달력과 스트링그리드로만 말씀드리겠습니다.

    > 달력이나 스트링그리드나 어느 하나의 자료는 선택되도록 되어 있는 것들인데요.

    > Samples 페이지에 있는 달력은 선택된 영역의 배경색이 파란색으로 바뀌고, 글자는 역상으로 자동으로바뀝니다.

    > 그러나 스트링그리드에서 선택된 영역은 배경색만 파란색으로 바뀌고 글자형태는 여전히 그대로여서, 스트링그리드에서 달력으로 포커스를 옮기면 스트링그리드의 선택된 영역이 반전되면서(배경이 파란색으로 바뀌면서), 글자가 잘 보이질 않네요.

    >

    > 사실 제가 원하는 것은 스트링그리드에서 자료를 선택해도 그 선택된 영역은 선택되지 않은 영역과 동일한 형태로 유지할 수 있는 것을 원하거든요.

    > 즉, 선택되나 안되나 똑같은 형태를 유지하는 것...

    >

    > 똑같은 형태를 유지하지 않더라도 스트링그리드가 포커스되지 않았을 때, 스트링그리드의 이전에 선택된 영역(파란색으로 바뀐 영역)의 배경색을 선택되지 않은 다른 영역의 색상으로 바꿀 수 있는 방법을 알고 싶습니다.

    >

    > 혹시 이와같이 조작할 수 있는 방법을 아시는 분은 도움을 주셨으면 합니다.

    >

    > 그럼 좋은시간들 되십시오.

    ///////////////////////////////////////////////////////////////////////////

    하시고자하는 방법을 제가 잘이해 했는지는 모르겠으나 아래것을 변형해서 해보세요.



    1. 마우스 위치에 따라 색바꾸기

    procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;

    X, Y: Integer);

    var

    CCol, CRow: Integer;

    Rect : TRect;

    begin

    with TStringGrid(Sender) do begin

    Refresh;

    MouseToCell(x,y,CCol, CRow);

    Rect := CellRect(CCol, CRow);

    if (CRow>=0)and(CCol>=0) then begin

    Canvas.Brush.Color := clRed;

    Canvas.FillRect(Rect);

    Canvas.Font.Color := clWhite;

    canvas.TextRect(Rect, Rect.Left + 3, Rect.Top + 3, cells[CCol, CRow]);

    //Rect.Left + 3, Rect.Top + 3이부분은 계산해서 수정하세요

    end;

    end;

    end;



    2.원하는 셀만 색바꾸기

    procedure TForm1.BitBtn1Click(Sender: TObject);

    var

    Rect : TRect;

    begin

    with StringGrid1 do begin

    Refresh;

    Rect := StringGrid1.CellRect(3, 3); //일단 [3,3]으로 설정했음

    Canvas.Brush.Color := clRed;

    Canvas.FillRect(Rect);

    Canvas.Font.Color := clWhite;

    canvas.TextRect(Rect, Rect.Left + 3, Rect.Top + 3, cells[3, 3]);

    //Rect.Left + 3, Rect.Top + 3이부분은 계산해서 수정하세요

    end;

    end;

  • Profile
    이길환 2001.09.12 16:42
    안녕하세요. 답변 감사드립니다.

    이것을 응용하여 다음과 같이 onDrawCell 이벤트에 추가형 해결했습니다.

    다시한번 감사드립니다.



    procedure TForm1.SGOutputDrawCell(Sender: TObject; ACol, ARow: Integer;

    Rect: TRect; State: TGridDrawState);

    var

    LeftPos: Integer;

    CellStr: string;

    begin

    with TStringGrid(Sender).Canvas do begin

    //각 셀을 중앙 정렬 -- 이 부분은 이곳의 팁모아(강의실?)에서 훔친 코드

    CellStr := TStringGrid(Sender).Cells[ACol, ARow];

    LeftPos := ((Rect.Right - Rect.Left - TextWidth(CellStr)) div 2) + Rect.Left;

    FillRect(Rect);



    //휴일이면 색상을 빨간색으로... 평일이면 검은색으로 ...

    if ACol in MyMonthSet then //이전에 계산된 1달 중 휴일에 속한 날짜이면...

    Font.Color := clRed

    else

    Font.Color := clBlack;



    //부서를 표시하는 글자를 진하게 표시

    if ACol = 0 then

    Font.Style := [fsBold]

    else

    Font.Style := [];

    TextOut(LeftPos, Rect.Top+2, CellStr);



    //이 부분이 선택된 셀의 색깔을 선택되지 않은 셀의 색깔과 동일하게 설정하기 위해

    //추가한 부분입니다.

    //gdSelected된 셀의 색깔을 나머지와 동일하게...

    if gdSelected in State then begin

    //원래 선택되지 않은 셀의 배경색이 clInfoBk이므로 이와 동일하게 설정

    Brush.Color := clInfoBk;

    TextRect(Rect, LeftPos, Rect.Top+2, SGOutput.Cells[ACol, ARow]);

    end;

    end; // of with TStringGrid(Sender).Canvas do begin

    end;