Q&A

  • 스트링 그리드와 디비그리드에 대한 차이점 질문
StringGrid와 DBGrid에 대한 질문입니다.

우선 스트링 그리드와  디비 그리드에 값을 넣습니다.

// 스트링 그리드
procedure TForm1.Button1Click(Sender: TObject);
var
    i , j : Integer;
begin
    for i := 1 to 4 do
        for j := 1 to 4 do
            StringGrid1.Cells[i,j] := 'test00';
end;

// 디비 그리드
procedure TForm1.Button2Click(Sender: TObject);
begin
    ADODataSet1.Open; // DataSource와 연결해둠.
end;

그리고 스트링 그리드에서 마우스 왼쪽버튼으로 드래그하면 값이 멀티 셀렉트가 됩니다.

하지만 디비그리드는 일일히 CTRL키와 마우스로 하나하나 눌러야 마우스 셀렉트가 됩니다.

제 질문은 이겁니다.
디비그리드도 마우스 드래그로 셀렉트 하려면 어떻게 해야 하는 건지여..



2  COMMENTS
  • Profile
    홍성락 2002.08.28 07:46
    hsr////////////////////////////////////////////////////
    유사하게 묘사한겁니다
    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids, DB, DBTables, ExtCtrls;

    type
      TForm1 = class(TForm)
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Table1: TTable;
        Database1: TDatabase;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure DBGrid1CellClick(Column: TColumn);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        DragSel, DrawOK : Boolean;
        X1,Y1,X2,Y2 : integer;
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
        GXY1, GXY2 : TGridCoord;
        inttemp : integer;
    begin
        if DrawOK then begin
           with TDBGrid(Sender) do begin
               GXY1 := MouseCoord(X1,Y1);
               GXY2 := MouseCoord(X2,Y2);
               if GXY1.X > GXY2.X then begin
                  inttemp := GXY1.X;
                  GXY1.X := GXY2.X;
                  GXY2.X := inttemp;
               end;
               if GXY1.Y > GXY2.Y then begin
                  inttemp := GXY1.Y;
                  GXY1.Y := GXY2.Y;
                  GXY2.Y := inttemp;
               end;

               if ((DataCol >= GXY1.X-1)and(DataCol < GXY2.X))
                  and ((MouseCoord(Rect.Left, Rect.Top).Y >= GXY1.Y)and(MouseCoord(Rect.Left, Rect.Top).Y <= GXY2.Y)) then begin
                  Canvas.Brush.Color := clActiveCaption;
                  Canvas.Font.Color  := clWhite;
                  Canvas.FillRect(Rect);
                  DefaultDrawColumnCell(Rect, DataCol, Column,[]);
               end;
            end;
        end;
    end;

    procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin

        if ssLeft in Shift then begin
           if DragSel = False then begin
              X1 := X;
              Y1 := Y;
           end;
           DragSel := True;
           DrawOK := True;
           X2 := X;
           Y2 := Y;
           DBGrid1.Repaint;
        end
        else DragSel := False;
    end;

    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
        if (DrawOK)and(DragSel = False) then begin
           DrawOK := False;
           DBGrid1.Repaint;
        end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
         //동적 알리아스 생성
         Database1.Params.Append('PATH='+ExtractFilePath(Application.ExeName));
         Database1.Params.Append('ENABLE BCD=FALSE');
         Database1.Params.Append('DEFAULT DRIVER=DBASE');
         Table1.DatabaseName := 'TempA';
         Table1.Active := True;
    end;

    end.
  • Profile
    델파이사랑 2002.08.30 19:30
    헉..답변이 늦었습니다.......정말 좋은 답변 감사 드립니다.......

    많이 배웁니다.....^^

    from....델파이사랑.......