参见例子: … private Sel : Boolean ;//判断是否处于选择状态 BookMark : TBookMark ;//记录先前的位置 … procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var SelNo:integer ;//记录当前位置 begin if ( Button = mbLeft ) then if sel = false then//非选择状态,记录当前位置 begin BookMark := Table1.GetBook ; Sel := true ; exit ; end else //选择状态 if Shift = [ssShift] then begin //遍历所有从先前位置开始到当前位置之间的记录并标记 SelNo := DBGrid1.DataSource.DataSet.RecNo ; DBGrid1.DataSource.DataSet.DisableControls ; DBGrid1.DataSource.DataSet.GotoBook(BookMark); DBGrid1.SelectedRows.CurrentRowSelected := true ; if SelNo<DBGrid1.DataSource.DataSet.RecNo then while SelNo<DBGrid1.DataSource.DataSet.RecNo do begin DBGrid1.SelectedRows.CurrentRowSelected := true ; DBGrid1.DataSource.DataSet.Prior ; end else while SelNo > DBGrid1.DataSource.DataSet.RecNo do begin DBGrid1.SelectedRows.CurrentRowSelected := true ; DBGrid1.DataSource.DataSet.Next ; end; DBGrid1.DataSource.DataSet.EnableControls ; Sel := false ; end ; end; 虽然效果不十分理想,但足以完成要求。
贴中讲过,但这种多选只能用按住Ctrl后一次次进行多选.而我的问题是
我虽比较菜,也不至于连常识都不懂!
在一时也很难找到现成控件情况下,我准备修改源码
刚刚把c:\Program files\Borland\CBuilder\Source\Vcl\dbcgrids.pas打出-----
19页A4纸,共1180行-------头疼欲裂------
那位大侠能在从何入手,在何方位努力,应雕琢那段指点一二-------
本菜鸟将感恩不尽!!!
不过通过钩子来做是否可行?请给出示例!!!
不过你可以试试在DBGrid得OnMouseMove事件中加入(DBGrid1 as TCustomGrid).MouseCoord(X,Y),其返回的MouseCoord.Y值表示鼠标所在的行,不只有没有用?
有些我在贴中说明过的情况就不再在此重复了
大家知道,将Lookup字段的ButtonStyle属性设为cbsAuto,就可以在单元格上
出现一个下拉按钮,可以拉出供选取的字段值(如果不是Lookup字段,还可在
Picklist中设置一些供下拉的选值,并且ButtonStyle若为cbsEllipsis将以省略
号按钮代替下拉按钮)。
但是查找字段的Cell是绝对修改不了的,只能通过下拉列表选上去!
可是我们经理下死令了——必须能够键入值,并达到如下的效果:
其实是Access中的效果——
下拉按钮的效用当然要保留,另外还必须能键入字串,
并响应出FindNearest式的查找效果——
具体举例:假如此Lookup字段名为Name,其值来源于另一个表,
首先要能键入值,比如我只键入了try三个字母,会自动从查找的源表找出
相近的值显示在单元格上:trybird,其中bird被抹黑选中,当我接着键入
w字后,又会找出相近的值:tryworm,其orm中被抹黑选中,依此类推,就这样……唉,菜鸟到死思方尽,虫子成堆累不甘!另外,要提醒各位大侠的是此贴并非50分,而是双50——100分
因为我在C++ Builder中也挂了一模一样的一贴,
愿象lin一样的热心大侠,一式两份地来响应
只要热心相帮并对俺解决问题有助的大侠,菜鸟都会铭记和感谢的!
得分到是次要,此问题来自实际需求,解决了相信对大家都有会有所助益!
不论什么情况,菜鸟在此都愿将最终的结果无保留地与大家共析!!!
问题尚未解决,同志仍须努力!
问题解决之后,把方案放出来大家共享一下如何,我是不是有点自私呀。哈哈
…
private
Sel : Boolean ;//判断是否处于选择状态
BookMark : TBookMark ;//记录先前的位置
…
procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var SelNo:integer ;//记录当前位置
begin
if ( Button = mbLeft ) then
if sel = false then//非选择状态,记录当前位置
begin
BookMark := Table1.GetBook ;
Sel := true ;
exit ;
end
else //选择状态
if Shift = [ssShift] then
begin
//遍历所有从先前位置开始到当前位置之间的记录并标记
SelNo := DBGrid1.DataSource.DataSet.RecNo ;
DBGrid1.DataSource.DataSet.DisableControls ;
DBGrid1.DataSource.DataSet.GotoBook(BookMark);
DBGrid1.SelectedRows.CurrentRowSelected := true ; if SelNo<DBGrid1.DataSource.DataSet.RecNo then
while SelNo<DBGrid1.DataSource.DataSet.RecNo do
begin
DBGrid1.SelectedRows.CurrentRowSelected := true ;
DBGrid1.DataSource.DataSet.Prior ;
end
else
while SelNo > DBGrid1.DataSource.DataSet.RecNo do
begin
DBGrid1.SelectedRows.CurrentRowSelected := true ;
DBGrid1.DataSource.DataSet.Next ;
end;
DBGrid1.DataSource.DataSet.EnableControls ;
Sel := false ;
end ;
end;
虽然效果不十分理想,但足以完成要求。