스트링 그리드의 한 로우당 세개의 체크박스를 넣고
그중에 한 놈이 체크가 될 경우 나머지 두개의 체크를 없애주는 식의 작동을 합니다.
어렵게 어렵게 만들어 놨는데 새로운 문제가 생겼습니다.
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.
Visible 을 False 하고
DrawCell할때 Visible을 True 하면 되긴되는데 쩝.
전 스트링 그리드 안써서 잘 모르겠네요.