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키와 마우스로 하나하나 눌러야 마우스 셀렉트가 됩니다.
제 질문은 이겁니다.
디비그리드도 마우스 드래그로 셀렉트 하려면 어떻게 해야 하는 건지여..
유사하게 묘사한겁니다
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.