当前位置:主页>销售管理软件> 列表

关于TStringGrid中的拖放??? 找进销存管理系统设计

记账软件版1楼:   (1)我想在 TStringGrid 中拖动行,实现移动的目的。可是 TStringGrid 拖动一定要在第一列的固定列上操作才可以。。。而我想直接在数据显示区就可以实现行的拖动。。。
  (2)在 TStringGrid 中拖动触发了哪些事件?
  (3)在 TStringGrid 中怎么才能实现类似于 Excel 中的剪切,粘贴的功能?就是点击右键时怎样知道现在鼠标所处的行号?
  (4)还有什么第三方控件要实现拖动操作比较好的??我现在用的是XStringGrid。

不知哪位大虾有做过这个功能的。。。请说说。。。谢谢!在线等。。。。。

2楼: 各位大虾们,,,难道100分太少了吗?什么都没人看看呀?多多帮忙呀。。。谢谢! 如免费会员卡管理软件

3楼:   分数不够可以再加的呀。。。什么都没人说句?唉。。。。失望呀。。。

  这个问题我找了很多资料,还是没办法解决的。。。哪位高手帮帮忙吧。。。急着要用。。。。

4楼: 下面是拖拽例子

unit Unit1;

interface

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

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
{ Private declarations }
selrow,selcol:integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to stringgrid1.ColCount-1 do
for j:=0 to stringgrid1.RowCount-1 do
stringgrid1.Cells[i,j]:=inttostr(i*j);
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssleft in shift then
stringgrid1.BeginDrag(false);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
selcol:=acol;
selrow:=arow;
canselect:=true;
end;

procedure TForm1.StringGrid2DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
col,row:integer;
begin
if Sender.ClassType=TStringGrid then
begin
TStringGrid(Sender).MouseToCell(x,y,col,row);
TStringGrid(Sender).Cells[col,row]:=stringgrid1.Cells[selcol,selrow];
end;
end;

procedure TForm1.StringGrid2DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
//
end;

end.


拖动事件:你看凡是带有drop drag字样的事件都是
点击右键得到行号:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
col, //列号
row:integer; //行号


begin
if button=mbRight then
begin
TStringGrid(Sender).MouseToCell(x,y,col,row);
caption:=''列号:''+inttostr(col)+'' 行号:''+inttostr(row);
end;
end;

个人觉得stringgrid已经不错了。。。。。

5楼: 谢谢hs-kill。。。我去看看先。。。

6楼: to hs-kill:
  你的CODE我试了下。。好像不能拖动。。。是不是TStringGrid1的属性有什么设置?还有你所操作的是不是将StringGrid1中的一行拖动到StringGrid2中??我要的是在StringGrid1内部拖动的。。。还有多行拖动那怎么办?

if ssleft in shift then
stringgrid1.BeginDrag(false);
这一步实现的应该是拖动吧。。我试了在内部拖动和从StringGrid1中拖动一行数据到StringGrid2中还是没有应该。。。什么情况下才能触发StringGrid2DragDrop事件?

记账软件版7楼:   (1)我想在StringGrid1中按住鼠标左键拖动一行到另一行之前。。。有什么好的办法可以实现的??
  (2)能不能获取到我鼠标放开时所处的行的行号??

8楼:   各位大虾们帮帮忙吧。。。真的急着要用。。。什么都没人进来看看。。。

9楼: ?????我试了啊 什么都不用设置就可以拖动。。。。。。你的事件设置全了吗
我是把选择的单元格的内容拖到目标单元格

行的没有试

鼠标放开所处的行号,就把上面的那个获得行号的代码写到mouseup事件里就行了。。。晕 楼主有点举一反三的精神好不好。。。看看代码就能明白是什么意思 很简单的

下面是一个stringgrid内的拖动。。。。。

unit Unit1;

interface

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

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
{ Private declarations }
selrow,selcol:integer;
public


{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to stringgrid1.ColCount-1 do
for j:=0 to stringgrid1.RowCount-1 do
stringgrid1.Cells[i,j]:=inttostr(i*j);
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssleft in shift then
stringgrid1.BeginDrag(false);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
selcol:=acol;
selrow:=arow;
canselect:=true;
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
col,row:integer;
begin
if Sender.ClassType=TStringGrid then
begin
TStringGrid(Sender).MouseToCell(x,y,col,row);
TStringGrid(Sender).Cells[col,row]:=TStringGrid(Source).Cells[selcol,selrow];
end;


end;

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
//
end;

end.

10楼: to hs-kill: 谢谢。。。
  像你所说的“鼠标放开所处的行号”,我是想在StringGrid1中按下鼠标左键,直到目标行上才放开。。。我就是把StringGrid1MouseDown的放到StringGrid1MouseUp中。可是就是获取不到行号的呀。。。对了。。我的StringGrid1属性是设置每次点击是选择一整行的。。。

11楼:   那选择多行时候的拖动呢?有什么好的方法?是任意的多行不一定是连续的。。。

12楼: to hs-kill:

像你上面的操作。..StringGrid1,StringGrid2的属性是不是都是默认的??都没有修改过是不是?有没有改过StringGrid1.Optionsr 的属性?? 如免费公司记账软件

13楼: 恩。。。。一次选择一整行也可以获得行号啊。。。我刚试完的。。
是按右键获取啊。。。。。如果你想按左键获取就把mbRight改成mbLeft

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
col, //列号
row:integer; //行号
begin
if button=mbRight then
begin
TStringGrid(Sender).MouseToCell(x,y,col,row);
caption:=''列号:''+inttostr(col)+'' 行号:''+inttostr(row);
end;
end;

记账软件版14楼: to hs-kill:
  呵呵。。。可能是我的表达不是很清楚吧。。。我想达到的目的是在StringGrid按住左键不放。。。就是开始拖动了所选取的行。。。到一个“目的行”上放开左键完成行的拖动。。。因为要把数据插到“目的行”的前面(或是后面),所以我要知道刚才左键放开时所处的行号。。。。。。。。。不知道这样表达你能否理解我说的?:)
  对了。。。你说上面的可以实现行的拖动。。。有没有改到了StringGrid.Options的属性?我什么试了还是不行。。。???唉。。。为什么呀?

15楼: stringgrid1的属性都是默认的,即使把Optionsr里的gorowselect属性设为true也一样有效
至于多行。。。。你选了多行后拖放到哪??自身吗?那多行拖放结束后如何排列?


这个是选一行拖动与另一行数据交换的:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
selrow,selcol:integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to stringgrid1.ColCount-1 do
for j:=0 to stringgrid1.RowCount-1 do


stringgrid1.Cells[i,j]:=inttostr(i*j);
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssleft in shift then
stringgrid1.BeginDrag(false);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
selcol:=acol;
selrow:=arow;
canselect:=true;
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
col,row:integer;
tmprow:tstrings;
begin
tmprow:=tstringlist.Create;
StringGrid1.MouseToCell(x,y,col,row);
tmprow.Text:=StringGrid1.Rows[row].Text;
StringGrid1.Rows[row]:=StringGrid1.Rows[selrow];
StringGrid1.Rows[selrow].Text:=tmprow.Text;
tmprow.Free;
end;

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
//
end;

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
var
col, //列号
row:integer; //行号
begin
if button=mbRight then
begin
TStringGrid(Sender).MouseToCell(x,y,col,row);
caption:=''列号:''+inttostr(col)+'' 行号:''+inttostr(row);
end;
end;

end.

16楼: 哦哦 ~~~~~~~呵呵 插到那行后面啊。。。我是交换2行的数据。。。恩。。。再看看

我的默认属性除了改为选择一行以外其他都没变

17楼: to hs-kill:
  谢谢。。。我问了好多次都没人理我。。。谢谢你帮我看了这么久。。真的谢谢。。

  对了。。你上面的我试了是可以移动。。不过好像不太对。。你说是交换那两行的数据也不是的呀。。。比如说我把第一行拖动到第二行。。你实现出来的是将第一个单元格的数据COPY到第二行对应该的单元格的。。没有实现两行数据的交换,也没有一整行的COPY,只是对左键所选的那个单元格的操作。。。呵呵。。。我是想拖动的时候就实现两行数据的交换(要一整行的交换。。而不是所选中那行中的某个单元格)。。。总的行数没有增加的。。。

18楼: 呵呵 也许今天大家比较忙吧。。。我是刚闲下来
你试试下面的,操作为选择一行,然后拖动,松手后选择的那行移动到松手时所处行的位置,其余行位置自动调整:


不过只能是选1行。。。如果多行是不行的,要自己维护选择列表而且位置也不好算。。。

如果要交换2行数据,把DragDrop事件里的代码换成这个:
var
col,row:integer;
tmprow:tstrings;
begin
tmprow:=tstringlist.Create;
StringGrid1.MouseToCell(x,y,col,row);
tmprow.Text:=StringGrid1.Rows[row].Text;
StringGrid1.Rows[row]:=StringGrid1.Rows[selrow];
StringGrid1.Rows[selrow].Text:=tmprow.Text;
tmprow.Free;
end;

//----------------------------------------------------------------------

unit Unit1;

interface

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

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
selrow,selcol:integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to stringgrid1.ColCount-1 do
for j:=0 to stringgrid1.RowCount-1 do
stringgrid1.Cells[i,j]:=inttostr(i*j);
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssleft in shift then
stringgrid1.BeginDrag(false);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
selcol:=acol;
selrow:=arow;
canselect:=true;
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
col,row,i:integer;
tmprow:tstrings;
begin
tmprow:=tstringlist.Create;
StringGrid1.MouseToCell(x,y,col,row);
tmprow.Text:=StringGrid1.Rows[selrow].Text;
if row>selrow then
for i:=selrow to row-1 do
StringGrid1.Rows[i]:=StringGrid1.Rows[i+1]
else if row for i:=selrow downto row+1 do
StringGrid1.Rows[i]:=StringGrid1.Rows[i-1];
StringGrid1.Rows[row].Text:=tmprow.Text;
tmprow.Free;
end;

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
//
end;

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
col, //列号
row:integer; //行号
begin
if button=mbRight then
begin
TStringGrid(Sender).MouseToCell(x,y,col,row);
caption:=''列号:''+inttostr(col)+'' 行号:''+inttostr(row);

end;
end;

end.

19楼: to hs-kill:

  谢谢。。。

20楼: 有没有哪位高手知道支持多行拖动的呀?不一定是连续的多行。。。

记账软件版21楼: to hs-kill:
能否帮我看看怎么样实现多行拖动?

22楼: 呵呵 还没搞定啊。。。。。

你想想 比如你选了1、3、5行,然后拖动到第2行的位置

那现在的1、3、5行的数据放在哪? 应该是2下面接着就是1、3、5 然后5的后面才是4、6、7、8、9? 如进销存管理系统设计

23楼: 多行拖动其实不难,就是维护个选择行的列表而已,关键是你拖动到另一个位置时,你那几个不连续的多行是按什么样的位置关系插入到新位置的?

24楼: to hs-kill:

1,2,3,4,5,6,7,8。。。如果我选1,3,5行,拖动到第2行,那么我想得到的结果是2,1,3,5,4,6,7,8,我自己今天也有去试了一下。。好像效果不是很理想。。唉。真是郁闷呀。。用StringGrid做配套工具也一年多了。。可是还是做得不是很理想。。。最近又要负责一个项目,搞得忙得要死。。。前辈是做什么的呀?我是做嵌入式系统开发的。。就是做机顶盒(卫星接收机)的。。用Delphi只是做一些配套的工具而已。。。懂得不多,,请多多请教。。。万分感谢!!!!!!!

25楼: 恩。。。。我去做个看看。。。。



今天龙族第一天正式运行。。。。呵呵 去玩游戏了。。。。

我是什么都做。。。。拿来什么项目就做什么。。。。

26楼: 哎。。。麻烦,刚想起来stringgrid不支持选择不连续的行,所以只好自己画了
按住ctrl选择不连续的行
写的有点乱,关键部分我加注释了。。如果看不懂再问吧。。。
如果你觉得stringgrid实现这个功能麻烦的话,不如换成listview,那个东西好控制


unit Unit1;

interface

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

type
tstrgridrow=record
rowtext:string;
select:boolean;
end;
pstrgridrow=^tstrgridrow;

TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
{ Private declarations }
selcount:integer; //被选择的行数
procedure StrGridSelRow(Row:integer;Select:boolean); //设置一行的选择状态
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StrGridSelRow(Row:integer;Select:boolean);
begin
if select then
begin
if not boolean(stringgrid1.Objects[0,row]) then
inc(selcount);
stringgrid1.Objects[0,row]:=tobject(1);
end
else
begin
if boolean(stringgrid1.Objects[0,row]) then
dec(selcount);
stringgrid1.Objects[0,row]:=tobject(0);
end;
stringgrid1.Refresh;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
begin
stringgrid1.RowCount:=20;
stringgrid1.DefaultDrawing:=false;
for i:=1 to stringgrid1.ColCount do
for j:=1 to stringgrid1.RowCount do
begin
stringgrid1.Cells[i-1,j-1]:=inttostr(j);
stringgrid1.Objects[i-1,j-1]:=tobject(false);
end;
selcount:=0;
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if (ssleft in shift) and (selcount>0) then
stringgrid1.BeginDrag(false);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
i:integer;
begin
if getkeystate(VK_CONTROL)<0 then
//如果按住ctrl,则当前行在选择/未选择之间切换
StrGridSelRow(arow,not boolean(stringgrid1.Objects[0,arow]))
else
//如果未按住ctrl,如果该行未被选择则变为选择
//为了避免选择多行后,按住一行已被选择的拖动又会变成只选择该行的情况
if not boolean(stringgrid1.Objects[0,arow]) then
for i:=0 to stringgrid1.RowCount-1 do


StrGridSelRow(i,i=arow);
canselect:=false;
self.Caption:=''选择了:''+inttostr(selcount)+'' 行'';
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
col,oldrow,i,tx,ty,newrow:integer;
tmprow:tstrings;
strs1,strs2:array of string; //str1保存被选择行的内容
//str2保存未被选择行的内容
begin
StringGrid1.MouseToCell(x,y,col,oldrow);
if boolean(stringgrid1.Objects[0,oldrow]) then
begin
showmessage(''请拖拽到一个未被选择的行'');
exit;
end
else
begin
newrow:=oldrow;
setlength(strs1,selcount);
setlength(strs2,stringgrid1.RowCount-selcount);
tx:=0;
ty:=0;
for i:=0 to stringgrid1.RowCount-1 do
begin
if boolean(stringgrid1.Objects[0,i]) then
begin
strs1[tx]:=stringgrid1.Rows[i].Text;
inc(tx);
end
else
begin
strs2[ty]:=stringgrid1.Rows[i].Text;
inc(ty);
if oldrow=i then
newrow:=ty; //获得移动后被选择的行所在的新行数
end;
end;
tx:=0;
selcount:=0;
for i:=0 to newrow-1 do //插入被选择的行以前的行的内容
begin
stringgrid1.Rows[tx].Text:=strs2[i];
stringgrid1.Objects[0,tx]:=tobject(false);
inc(tx);
end;
for i:=0 to length(strs1)-1 do //插入被选择行的内容
begin
stringgrid1.Rows[tx].Text:=strs1[i];
stringgrid1.Objects[0,tx]:=tobject(false);
StrGridSelRow(tx,true);
inc(tx);
end;
for i:=newrow to length(strs2)-1 do //插入被选择的行以后的行的内容
begin
stringgrid1.Rows[tx].Text:=strs2[i];
stringgrid1.Objects[0,tx]:=tobject(false);
inc(tx);
end;
end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with tstringgrid(sender) do
begin
if boolean(Objects[0,arow]) then
begin
Canvas.Brush.Color:=clHighlight;
Canvas.Font.Color:=clHighlightText;
end
else
begin
Canvas.Brush.Color:=clWindow;
Canvas.Font.Color:=clWindowText;
end;
Canvas.TextRect(rect,rect.Left+2,rect.Top+2,Cells[acol,arow]);
end;
end;

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
// 这里必须有
end;

end.

27楼: to hs-kill:
我想知道当我把 StringGrid 的属性设置为可以选择多行,当我拉动 mouse 选中多行时我如何得知道是哪几行被选中的?或是如何获取StringGrid中一行的选中状态?

记账软件版28楼: stringgrid有个Selection的方法
返回值是个Tgridrect类型的变量
由于stringgrid本身只支持连续行的选择,所以
Selection.left就是你选择行的起始列号,top是起始行号
right是结束列号,bottom是结束行号

29楼: to hs-kill:
真的非常感谢你。。。花了你这么宝贵的时间来为我解答。。。谢谢!我去调调看。。。

30楼: to hs-kill:
  不好意思。。。又要打扰你了。。
  StringGridDragDrop()是什么时候才会触发的?我也有写StringGridDragOver()事件的呀,为什么我在拖动的时候都没有触发StringGridDragDrop()事件?

31楼: -_-!

DragDrop是在成为拖动状态后松手时触发的啊。。。。你什么属性都不用改,只要有DragOver事件就能产生拖动状态啊。。

你开个新工程,里面扔个stringgrid,什么属性都不改,然后只写下面3个事件,看看会不会触发

procedure TForm1.stringgrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssleft in shift then
stringgrid1.BeginDrag(false);
end;

procedure TForm1.stringgrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
showmessage(''1'');
end;

procedure TForm1.stringgrid1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
//
end;

32楼: to hs-kill:
  谢谢。终于调试完了。。。我没有加“stringgrid1.BeginDrag(false);”...真的很不好意思。。。打扰了你这么久。。。谢谢。。。我QQ是:5563102,希望你能赏光加入。。。

33楼: 接受答案了.

34楼: 呵呵 最近无聊 就上来转喽~~~顺便赚点分[:D]谈不上什么打扰 互相帮忙嘛~