Q&A

  • StringGrid에첵크박스 넣고 읽으려는데...
procedure TForm4.BitBtn2Click(Sender: TObject);
var y : integer;
begin
   for y := 1 to StringGrid1.RowCount - 1 do begin
      StringGrid1.Objects[1,y] := TcheckBox.Create(StringGrid1);
      with TCheckBox(StringGrid1.Objects[1,y]) do begin
         OnKeyUp := CheckBoxKeyUp;
         OnMouseUp := CheckBoxMouseUp;
         Parent := StringGrid1;
         BoundsRect := StringGrid1.CellRect(1, y);
         Width := StringGrid1.ColWidths[1];
         Height := StringGrid1.RowHeights[1];
         Caption := '첵크박스';
         Checked := false;
      end;
end;

현재 폼의 스트링그리드에 데이터가 20개쯤 보여집니다. 실제 DB에는 150건의 레코드가 있습니다.
데이터는 스트링그리드의 스크롤바로 잘 움직여 집니다.
위의 소스로 첵크박스를 생성합니다. 화면에 보여지는 20개의 첵크박스 를 첵크하고 첵크된 레코드를 읽으면
잘 보여집니다.
그러나 스크롤 바를 움직이면 첵크박스도 같이 따라 움직이지 않고 현재 화면에 꼼작 않고 있네요...
그때부터는 첵크의 의미가 없어집니다.
[질문] 어찌 해야 스크롤 바를 움직여서 첵크박스를 첵크해도 정확한 자기 레코드에 첵크하게 되는가요?
           질문이 잘 전달이 되었을 라나요?
1  COMMENTS
  • Profile
    홍성락 2003.01.18 06:58
    예전에 스트링그리드에 콤보박스 넣기를 올려보았는데요...
    테스트 해보니 체크박스도 같은거 같아요
    procedure TForm1.Button1Click(Sender: TObject);
    var y : integer;
    begin
       for y := 1 to StringGrid1.RowCount - 1 do begin
          StringGrid1.Cells[0,y] := inttostr(y);
          StringGrid1.Objects[1,y] := TcheckBox.Create(StringGrid1);
          with TCheckBox(StringGrid1.Objects[1,y]) do begin
             //OnKeyUp := CheckBoxKeyUp;
             OnMouseUp := CheckBoxMouseUp;
             Parent := StringGrid1;
             BoundsRect := StringGrid1.CellRect(1, y);
             Width := StringGrid1.ColWidths[1];
             Height := StringGrid1.RowHeights[1];
             Caption := '첵'+inttostr(y);
             Checked := false;
          end;
       end;
    end;


    procedure TForm1.CheckBoxMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        TCheckBox(Sender).Checked := not TCheckBox(Sender).Checked
    end;

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
        i : integer;
    begin
        for i := 1 to StringGrid1.RowCount-1 do begin
           if StringGrid1.objects[1,i] <> nil then begin
              Rect:=StringGrid1.cellrect(1,i);
              TCheckBox(StringGrid1.objects[1 ,i]).top  := Rect.Top;
              TCheckBox(StringGrid1.objects[1 ,i]).Left := Rect.Left;
              //TCheckBox(StringGrid1.objects[1 ,i]).BringToFront;
              if (Rect.Top<=0)then
                 TCheckBox(StringGrid1.objects[1 ,i]).Visible := False
              else begin
                 TCheckBox(StringGrid1.objects[1 ,i]).Visible := True;
              end;
              TCheckBox(StringGrid1.objects[1 ,i]).Refresh;
           end;
        end;
    end;
    hsr////////////////////////////////////////////////////////////