Q&A

  • 스트링그리드의 DrawCell 이벤트...

---------------------------------------------------------------
| Project |실행관리 | ㅁALL  | ㅁ입력  ㅁ수정  ㅁ삭제  ㅁ조회
_______________________________________________________________
| Project |프로젝트 | ㅁALL  | ㅁ입력  ㅁ수정  ㅁ삭제  ㅁ조회
__________________________________________________________________
| Project |업무관리 | ㅁALL  | ㅁ입력  ㅁ입력마감  ㅁ삭제  ㅁ조회
__________________________________________________________________
             ....

             ....
위는 스트링그리드의 내용입니다.
아래 소스좀 고쳐주십시요 고수님들...

procedure TT703fm.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var i : integer;
    LeftPos : integer;
    Cellstr : string;
begin
   for i := 1 to StringGrid1.RowCount-1 do begin
      if StringGrid1.objects[2,i] <> nil then begin
         Rect:=StringGrid1.cellrect(2,i);
         TCheckBox(StringGrid1.objects[2 ,i]).top  := Rect.Top;
         TCheckBox(StringGrid1.objects[2 ,i]).Left := Rect.Left;        
         if (Rect.Top<=0)then
            TCheckBox(StringGrid1.objects[2 ,i]).Visible := False else
            TCheckBox(StringGrid1.objects[2 ,i]).Visible := True;
         TCheckBox(StringGrid1.objects[2 ,i]).Refresh;
      end;
   end;
   //위 소스는 첵크박스가 하나이니 잘 됩니다. 그런데로...

   //아래 소스로 각 로우의 ㅁ입력  ㅁ입력마감  ㅁ삭제  ㅁ조회 를 컨트롤
   //해야 하는데 안되네요... 어떻게 수정해야 하나요??????

   for i := 1 to StringGrid1.RowCount-1 do begin
      if StringGrid1.objects[3,i] <> nil then begin
         Rect:=StringGrid1.cellrect(3,i);
         TCheckBox(StringGrid1.objects[3 ,i]).top  := Rect.Top;
         TCheckBox(StringGrid1.objects[3 ,i]).Left := Rect.Left;
         //TCheckBox(StringGrid1.objects[3 ,i]).BringToFront;
         if (Rect.Top<=0)then
            TCheckBox(StringGrid1.objects[3 ,i]).Visible := False else
            TCheckBox(StringGrid1.objects[3 ,i]).Visible := True;
         TCheckBox(StringGrid1.objects[3 ,i]).Refresh;
      end;
   end;
end;
3  COMMENTS
  • Profile
    홍성락 2003.03.20 08:38
    hsr///////////////////////////////////////////////////////
    예전에 콤보박스는 아래처럼했으나 체크는 아래 예가 편합니다.
    위처럼하신다면,
    for문 앞에 if문 추가와 3대신 ACol로 바꿔보세요
    if (ACol>=2)and(ACol<=6) then begin
      for i := 1 to StringGrid1.RowCount-1 do begin
          if StringGrid1.objects[ACol,i] <> nil then begin
    ....

    아래처럼하셔도 됩니다.
    procedure TForm1.SGstockDrawCell(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;
           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;
  • Profile
    아폴론 2003.03.20 21:32
    홍성락님 감사합니다. 그러나 그 소스로 해결을 못했습니다.
    제가 워낙 부족하다보니.... 다시 함 봐주세요... 죄성합니다...
    ______________________________________________________________________________________________
    |Project |실행관리 | ㅁALL  |
    ----------------------------------------------------------------------------------------------
    |Project |프로젝트 | ㅁALL  | ㅁ입력  ㅁ수정  ㅁ삭제  ㅁ조회
    ----------------------------------------------------------------------------------------------
    |Project |업무관리 | ㅁALL  | ㅁ입력  ㅁ입력마감  ㅁ삭제  ㅁ조회 ㅁ직불마감 ㅁ전체입력 ㅁExcel
    ----------------------------------------------------------------------------------------------
    |Project |목표관리 | ㅁALL  | ㅁ입력  ㅁ수정  ㅁ삭제  ㅁ조회
    ----------------------------------------------------------------------------------------------
    |Project |견적관리 | ㅁALL  | ㅁ입력  
    ----------------------------------------------------------------------------------------------
    |Project |SQL조회  | ㅁALL  |
    ----------------------------------------------------------------------------------------------
                 ....

                 ....
    스트링그리드에 위처럼 첵크박스를 2번Col과 3번Col에 나타냈습니다.
    Row수가 많으면 스트링그리드 오른쪽에 스크롤바가 나타납니다.
    그러나 Row가 많은 순간 첵크박스의 위치는엉망이 됩니다.

       //아래 소스는 2번Col 의 ㅁALL을 컨트롤 하는 소스입니다. 잘 됩니다.
       for i := 1 to StringGrid1.RowCount-1 do begin
          if StringGrid1.objects[2,i] <> nil then begin
             Rect:=StringGrid1.cellrect(2,i);
             TCheckBox(StringGrid1.objects[2 ,i]).top  := Rect.Top;
             TCheckBox(StringGrid1.objects[2 ,i]).Left := Rect.Left + 3;        
             TCheckBox(StringGrid1.objects[2 ,i]).Refresh;
          end;
       end;

       //아래 소스는 3번Col의 모든 첵그박스(0~ 10개)를 컨트롤 하는 소스입니다.
       //DB의 레코드 수가 스트링그리드 내에 있으면 문제가 없습니다.
       //그러나 DB레코드 수가 스트링그리드를 넘어가 버리면 첵크박스가 컨트롤 되지안고
       //엉망이 됩니다.

       //고수님들 요아래소스좀 고쳐주십시요. 참 열받게 안되네요....쩝...

       for i := 1 to StringGrid1.RowCount-1 do begin
          if StringGrid1.objects[3,i] <> nil then begin
             Rect:=StringGrid1.cellrect(3,i);
             for j := 0 to 9 do begin  //첵크박스 만큼 루프를 돌린다
                try
                 TCheckBox(inttostr(j)).top  := Rect.Top;
                 TCheckBox(inttostr(j)).Left := Rect.Left;            
                 TCheckBox(inttostr(j)).Refresh;
                except  //첵크박스가 없으면 조용히 넘어간다

                end;
             end;
          end;
       end;
  • Profile
    홍성락 2003.03.21 01:07
    hsr/////////////////////////////////////////////////
    아래건 콤보박스 생성시 수직 스크롤 위주였는데요.
    찾아보시면 아래처럼 좋은 예가 나옵니다
    unit Unit1;

    interface

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

    type
      TForm1 = class(TForm)
        SGstock: TStringGrid;
        procedure SGstockDrawCell(Sender: TObject; ACol, ARow: Integer;
          Rect: TRect; State: TGridDrawState);
        procedure CheckBoxMouseUp(Sender: TObject; Button: TMouseButton;
                                  Shift: TShiftState; X, Y: integer);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }

        procedure StringGridInCheckBoxCreate(sg :TStringGrid; Col, Row :Integer; pChecked :Boolean);
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}
    procedure TForm1.FormShow(Sender: TObject);
    var
        i, j : integer;
        CheckBox_Col : set of 0..10;
    begin
        SGstock.Cells[0,0]   := '입고여부';
        SGstock.cells[1,0]   := '바코드';
        SGstock.cells[2,0]   := '부품상태';

        //체크박스 넣을 col번호 초기화
        CheckBox_Col := [1,2,4,5,6,7,8,9];

        for j := 1 to SGstock.RowCount-1 do begin
            for i := 1 to SGstock.ColCount-1 do begin
               sgstock.cells[i,j] := intToStr(i) + '/' + intToStr(j);
               if i in CheckBox_Col then
                  StringGridInCheckBoxCreate(SGstock,i,j,True);
            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];
      end;
    end;
    {==================================
      CheckBoxMouseUp Event Process
    ==================================}
    procedure TForm1.CheckBoxMouseUp(Sender: TObject; Button:
    TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      with TCheckBox(Sender) do
        Checked := not Checked;
    end;
    /////////////////////////////////////////////////////////////////////////////
    procedure TForm1.SGstockDrawCell(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;
           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.