DBGRID怎么实现分块多选啊?(100分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
按鼠标倒可以实现,但按键盘就不行了。:(
如,有1--5条记录,要选中1、2、4。
要自己重新开发多选功能。我现在已经能够画出多选的画面了,但是如何把选中的记录
放到TBOOKMARKLIST 里去呢?请教
 
没人??
 
我觉得应该用DBGrid.SelectedRows.CurrentRowSelected。
比如用空格键模拟鼠标点击,在DBGrid的OnKeyDown里:
if (Key = VK_SPACE) and (DBGrid1.DataSource.DataSet.State = dsBrowse) then begin
DBGrid1.SelectedRows.CurrentRowSelected :=
not DBGrid1.SelectedRows.CurrentRowSelected;
Key := 0;
end;
但这样有一个问题:如果DBGrid的Options里包含gdRowSelect或gdMultiSelect,
那么当按键使活动记录发生转移时(即按了上下键或翻页键),
DBGrid的SelectedRows会被清掉,所以必须参照一下源码把这些键也截下来自己处理。
如果不包括,则虽然可以保持住SelectedRows,但界面上是否选中的提示就没有了。
不过你说你“已经能够画出多选的画面了”,我想做出一个提示应该不难吧。
 
我想用代码把我已画好的记录,填加到那个Tbookmarklist里
 
用一个循环就行啊。
你肯定已经记下了选中记录的位置,在一个循环中依次把当前记录定位到各个选中的记录上,
然后来一句DBGrid1.SelectedRows.CurrentRowSelected := True;就可以了。
 
我就是想知道如何把选中的记录,用自己写程序的方式,写到TBOOKMARKLIST里呀
 
呵呵,那就得看你是怎么保存选中的记录的啦。

如果你的保存方式不太适合定位的话,那就用GetBookMark结合TList选一个记一个,
因为GetBookMark得到的是一个指针,所以可以很方便地用一个全局的TList来保存这些指针,
然后用TList可以遍历所有的BookMark,再用GotoBookMark也可以实现定位。

再不然自定义一个结构,TList用来保存一个该结构的指针数组,而结构里包含BookMark,
这样还可以记录较多的信息。所以不一定非要用TBookMarkList的。
 
先画出来再加进去,有点本末倒置吧?
最简单的办法是:把dbgrids.pas存到本地目录,自己修改相关部分,就一切OK了。

不要说我这是歪招:
首先,如果delphi新版本出来了,你现在的方法也未必就能用;
其次,我说的修改非常容易,就一条语句,即使新版的delphi出来了,
找到相应地方再修改一下,仍然很容易,比你现在这样劳神费力应该还是好的多的。
 
温老大怎么不说详细点?
 
呵呵,不是不说详细,而是等你的回应,如果你根本不考虑这种方法,我说详细干什么呢?

在dbgrids.pas中找到:
procedure ClearSelection;
begin
if (dgMultiSelect in Options) then
begin
// FBookmarks.Clear;
FSelecting := False;
end;
end;
象上面这样把那句话注释掉,这时候用键盘(shift+箭头)选中的行已经不会
因为纪录的移动而被清除选择了,革命已经成功了99%。

剩下的就是自己程序的事情,比如在dbgrid的onkeypress中:

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#32 then
with dbgrid1.SelectedRows do
CurrentRowSelected:=not CurrentRowSelected;
end;

就可以实现空格键选中/取消选中,等等...
而且这样不影响其他功能,只要用鼠标移动,一切又都还原了。
 
多人接受答案了。
 
后退
顶部