Q&A

  • 스트링 그리드 질문입니다.


스트링 그리드의 한 로우당 세개의 체크박스를 넣고

그중에 한 놈이 체크가 될 경우 나머지 두개의 체크를 없애주는 식의 작동을 합니다.

어렵게 어렵게 만들어 놨는데 새로운 문제가 생겼습니다.

TEST를 하기 위해 ROW를 30개 정도 넣어 봤는데..

스크롤이 생기면 문제가 발생합니다. T_T

cell(0,0)에 있는 체크박스 왼쪽에 이상한 유령 체크박스가 생깁니다.

스크롤을 아래로 내렸다 올리면 사라지긴 하는데 스크롤이 없을 땐 안생기다가

row가 많아져서 스크롤이 생기면 어김없이 등장하네요.  

게다가 스크롤이 왔다갔다 할 때마다 계속 번쩍거리면서 잔상이 남아

체크되지 않은 체크박스들이 체크된 것처럼 보이기도 하네요...

아주 미치겠습니다. T_T

밑에 소스 코드를 올렸고 그림은 제가 원하는 모양의 스트링 그리드...

압출 파일은 소스파일입니다. 귀찮으시더라고 보시고 해결할 방법을 아시는 분은

가르쳐 주세요... 부탁드립니다..


소스입니다.

---------------------------------------------------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormShow(Sender: TObject);
    procedure CheckBoxMouseUp(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: integer);
    procedure StringGridInCheckBoxCreate(sg :TStringGrid; Col, Row :Integer; pChecked :Boolean);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormShow(Sender: TObject);
var
  i, j : integer;
begin
With StringGrid1 Do Begin
  RowCount := 15;
  ColCount := 4;
  ColWidths[3] := 200;
  for i := 0 to ColCount-2 do begin
    for j := 0 to RowCount-1 do begin
      if i = 0 then
        StringGridInCheckBoxCreate(StringGrid1,i,j,True)
      ELSE
        StringGridInCheckBoxCreate(StringGrid1,i,j,false);
    end;
  end;
end;
end;

procedure TForm1.StringGridInCheckBoxCreate(sg :TStringGrid; Col, Row :Integer; pChecked :Boolean);

var
  LeftWidth, iCnt :Integer;
begin
  if not (sg.Objects[Col, Row] is TCheckBox) then
    sg.Objects[Col, Row] := TCheckBox.Create(sg);
  with TCheckBox(sg.Objects[Col, Row]) do
  begin
    OnMouseUp  := CheckBoxMouseUp;
    Parent     := sg;
    Checked    := pChecked;
    BoundsRect := sg.CellRect(Col, Row);
    Width      := 14;
    Height     := sg.RowHeights[Row];
    Hint       := inttostr(Row);
    showHint   := False;
  end;
end;

procedure TForm1.CheckBoxMouseUp(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: integer);
var
  i, Row: integer;
begin
with TCheckBox(Sender) do
  Row := StrToInt(Hint);
  for i := 0 to StringGrid1.ColCount-1 do begin
    if (StringGrid1.objects[i,Row] is TCheckBox) then
      TCheckBox(StringGrid1.objects[i,Row]).Checked := false;
  end;
  TCheckBox(Sender).Checked := true;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
    if (TStringGrid(Sender).Objects[ACol, ARow] is TCheckBox) then begin
       with TCheckBox(TStringGrid(Sender).Objects[ACol, ARow]) do begin
            top  := Rect.Top;
            Left := (Rect.Left+Rect.Right) Div 2 - 7;
       end;
       with TStringGrid(Sender) do begin
//            Canvas.Font := Font;
//            Canvas.TextRect(Rect, Rect.left+14,(Rect.Top+Rect.Bottom-Font.Size-2) div 2, TStringGrid(Sender).Cells[ACol,ARow] );
       end;
    end;
end;

end.
1  COMMENTS
  • Profile
    이중철 2003.04.30 11:24
    CheckBox Create 할때
    Visible 을 False 하고
    DrawCell할때 Visible을 True 하면 되긴되는데 쩝.
    전 스트링 그리드 안써서 잘 모르겠네요.