在DBGrid中进行拖放操作

gkf27618 2010-11-25 11:29:37
在DBGrid中进行拖放操作
学习如何使DBGrid组件能接受拖放操作
拖放操作能为用户对数据的操作提供便利,你能够让用户拖动当前的控件,或者让用户从一个控件到另一个控件拖动,或者拖放树视图的节点(做为一个例子)。
每个DELPHI控件提供一些 (OnDragOver, OnDragDrop)事件和属性使你在应用程序中能够进行拖放操作。
为了使一个控件开始拖动操作,你必须设置它的DragMode 属性为dmAutomatic或者设置为dmManual 并手动调用BeginDrag 方法,BeginDrag 开始了控件的拖动,当你开始了控件的拖动时,你必须使用一个控件做为落下的目标。
要使一个控件接受能一个对象的下放,你必须在两个事件中添加代码OnDragOver (通知这个控件能够接受一个下放的对象)和OnDragDrop (指定当用户放下一个对象时要干什么)。
在DELPHI数据库应用程序中,TDBGrid被使用在使用户能在一个表格中看到和编辑数据,用拖放的形式来操作将是干什么便利的,让我们来看一下如何为DBGrid添加拖动和放下的能力。
从DBGrid中拖动
例如,假如你已经有一个GBGrid并让它显示了数据库中的数据,如果你想让用户能够拖动当前的记录至一个TMemo 控件中,这里是你需要添加的代码。
1、处理 DBGrid的OnCellClick事件 (Name := 'DBGrid1')来开始拖动操作:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
DBGrid1.BeginDrag(true);
end;
2、指定Memo 控件 (Name := 'Memo1') 能够接受从DBGrid中来的数据,使用Memo控件的OnDragDrop 事件:
procedure TForm1.Memo1DragOver(
Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source IS TDBGrid;
end;
3、最后,处理Memo 控件的OnDragDrop 事件来对已被拖动的数据进行操作,我们将添加一些代码来使当前记录所有字段的值添加到Memo控件中:
procedure TForm1.Memo1DragDrop(
Sender, Source: TObject;
X, Y: Integer);
var i : integer;
begin
Memo1.Clear;
for i := 0 to -1 + DBGrid1.FieldCount do
begin
Memo1.Lines.Add(DBGrid1.Fields[i].AsString);
end;
end;

一旦你运行了应用程序,单击DBGrid中的一行(激活行/记录)然后在Memo控件里面单击:Memo将被当前被选择字段的值填充(拖动记录)。
拖动到DBGrid
从DBGrid中拖动记录是比较容易的,但是,拖动到DBGrid中却是一个有一点灵活性的任务。
假如你已以有一个LISTBOX并在其中添加了一个条目,并想让用户能够拖动一个条目到DBGrid中特定的单元格----改变指定字段的值,你如何才能在用户完成拖动操作时精确确定行和单元格呢??
在"accessing protected members of a component" 这篇文章上已经讨论过,对于DELPHI开发者来说,DELPHI组件的许多有用的属性和方法是不可见("protected") 的。
当一个用户完成拖动操作并放下一个值到DBGrid中单元格时,我们必须设定活动记录,设置当下的数据集为编辑模式,并对当前字段赋值。
当处理DBGrid拖动时需要下面的代码:
1、我们从一个ListBox控件的条目中拖动,因而处理DBGrid的OnDragOver 事件指定DBGrid只接受ListBox的条目。
procedure TForm1.DBGrid1DragOver(
Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source IS TListBox;
end;
2、比较灵活的部分是在处理DBGrid的OnDragDrop 事件中:
procedure TForm1.DBGrid1DragDrop(
Sender, Source: TObject; X, Y: Integer);
var
gc : TGridCoord;
s : string;
begin
gc := THackDBGrid(DBGrid1).MouseCoord(X,Y);
if (gc.X > 0) AND (gc.Y > 0) then
begin
if ListBox1.ItemIndex = -1 then Exit;
s := ListBox1.Items[ListBox1.ItemIndex];
with THackDBGrid(DBGrid1) do
begin
DataSource.DataSet.MoveBy (gc.Y - Row);
DataSource.DataSet.Edit;
Columns.Items[-1 + gc.X].Field.AsString := s;
end;
end;
end;

­
­
注意:我们首先运用"Protected hack"技术来使用被保护的MouseCoord 方法得到鼠标位置以存取DBGrid的行和列。这个技术在 Selecting and highlighting a row in a DBGrid - "OnMouseOverRow" 文章中以解释过。如果目标不是第一行(标题默认的地方)和第一列(行指示器默认的地方),我们使用MoveBy方法和行属性设置当前行,然后,使数据集进入编辑模式,最后,使用ListBox中被选择的项的值填充到目标字段上。
...全文
470 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
twfx1027 2013-03-14
  • 打赏
  • 举报
回复
按照LZ说的拖动DBGrid中的一条记录放到 Memo中后,如何在 DBGrid中删除此记录(数据库中不删除,只是让在DBGrid中显示的这条记录不显示了)?谢谢楼主
Oraclers 2010-11-26
  • 打赏
  • 举报
回复
......

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧