Delphi 前罗维德 //换句话说,我们首先检查Shift单击是否在上面的一行*上* //前一行 CDS1.下一步; 虽然未找到Previous而不是CDS1.Eof,但请务必开始 如果CDS1.FieldByName('ID').AsInteger=PreviousRowID,则开始 FoundPrevious:=真; //我们找到了具有PreviousRowID的行,现在让网格添加它,然后 //所有行返回到我们开始的位置,在SelectedRows列表中 而不是CDS1.Bof和(CDS1.FieldByName('ID').AsInteger CurrentRowID)开始 DBGrid1.SelectedRows.CurrentRowSelected:=真; CDS1.先前; 结束; 结束 其他的 CDS1.下一步; 结束; 如果未找到,则开始 //如果我们到了这里,Shift Click肯定在下一排 //网格比以前的当前网格大 虽然未找到上一个,但未找到CDS1.Bof开始 如果CDS1.FieldByName('ID').AsInteger=PreviousRowID,则开始 FoundPrevious:=真; //我们找到了具有PreviousRowID的行,现在让网格添加它,然后 //所有行返回到我们开始的位置,在SelectedRows列表中 而不是CDS1.Eof和(CDS1.FieldByName('ID').AsInteger CurrentRowID)开始 DBGrid1.SelectedRows.CurrentRowSelected:=真; CDS1.下一步; 结束; 结束 其他的 CDS1.先前; 结束; 结束; 最后 CDS1.GotoBookmark(BM); 免费书签(BM); CDS1.EnableControls; SettingBookmarkRange:=False; 结束; 结束; 过程TForm1.DBGrid1MouseUp(发送方:ToObject;按钮:TMouseButton;Shift: t移位状态;X,Y:整数); 开始 标题:=IntToStr(CDS1.Fields[0].Value); 如果是轮班制,那么 SetBookMarkRange; 结束;
多选栅格的默认选择行为是Ctrl-Click,而不是Shift-Click。使用它不需要任何特定的鼠标单击处理程序Delphi 前罗维德 //换句话说,我们首先检查Shift单击是否在上面的一行*上* //前一行 CDS1.下一步; 虽然未找到Previous而不是CDS1.Eof,但请务必开始 如果CDS1.FieldByName('ID').AsInteger=PreviousRowID,则开始 FoundPrevious:=真; //我们找到了具有PreviousRowID的行,现在让网格添加它,然后 //所有行返回到我们开始的位置,在SelectedRows列表中 而不是CDS1.Bof和(CDS1.FieldByName('ID').AsInteger CurrentRowID)开始 DBGrid1.SelectedRows.CurrentRowSelected:=真; CDS1.先前; 结束; 结束 其他的 CDS1.下一步; 结束; 如果未找到,则开始 //如果我们到了这里,Shift Click肯定在下一排 //网格比以前的当前网格大 虽然未找到上一个,但未找到CDS1.Bof开始 如果CDS1.FieldByName('ID').AsInteger=PreviousRowID,则开始 FoundPrevious:=真; //我们找到了具有PreviousRowID的行,现在让网格添加它,然后 //所有行返回到我们开始的位置,在SelectedRows列表中 而不是CDS1.Eof和(CDS1.FieldByName('ID').AsInteger CurrentRowID)开始 DBGrid1.SelectedRows.CurrentRowSelected:=真; CDS1.下一步; 结束; 结束 其他的 CDS1.先前; 结束; 结束; 最后 CDS1.GotoBookmark(BM); 免费书签(BM); CDS1.EnableControls; SettingBookmarkRange:=False; 结束; 结束; 过程TForm1.DBGrid1MouseUp(发送方:ToObject;按钮:TMouseButton;Shift: t移位状态;X,Y:整数); 开始 标题:=IntToStr(CDS1.Fields[0].Value); 如果是轮班制,那么 SetBookMarkRange; 结束;,delphi,delphi-7,dbgrid,tdbgrid,Delphi,Delphi 7,Dbgrid,Tdbgrid,多选栅格的默认选择行为是Ctrl-Click,而不是Shift-Click。使用它不需要任何特定的鼠标单击处理程序 要实现Shift-Click,您必须否决/实现网格的鼠标单击处理程序。多选网格的默认选择行为是Ctrl-Click,而不是Shift-Click。使用它不需要任何特定的鼠标单击处理程序 要实现Shift-Click,您必须否决/实现网格的鼠标单击处理程序。我为TDBGrid类使用了一个插入器。它与Ctrl+Shift键配合使用: type TDBGrid = class(Vcl
要实现Shift-Click,您必须否决/实现网格的鼠标单击处理程序。多选网格的默认选择行为是Ctrl-Click,而不是Shift-Click。使用它不需要任何特定的鼠标单击处理程序
要实现Shift-Click,您必须否决/实现网格的鼠标单击处理程序。我为
TDBGrid类使用了一个插入器。它与Ctrl+Shift键配合使用:
type
TDBGrid = class(Vcl.DBGrids.TDBGrid)
private
procedure SelectRange;
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
end;
{...}
implementation
{...}
procedure TDBGrid.SelectRange;
var
CurrentBookMark, CursorBookMark, FirstBookMark, LastBookMark: TBookmark;
Dir: integer;
begin
if SelectedRows.Count <= 1 then
exit;
DataSource.DataSet.DisableControls;
try
FirstBookMark := SelectedRows.Items[0];
LastBookMark := SelectedRows.Items[SelectedRows.Count - 1];
SelectedRows.Clear;
CurrentBookMark := DataSource.DataSet.GetBookmark;
Dir := DataSource.DataSet.CompareBookmarks(FirstBookMark, CurrentBookMark);
if Dir = 0 then
Dir := DataSource.DataSet.CompareBookmarks(LastBookMark, CurrentBookMark);
if Dir > 0 then
DataSource.DataSet.GotoBookmark(LastBookMark)
else if Dir < 0 then
DataSource.DataSet.GotoBookmark(FirstBookMark)
else
Exit;
while not DataSource.DataSet.eof do
begin
CursorBookMark := DataSource.DataSet.GetBookmark;
SelectedRows.CurrentRowSelected := true;
if DataSource.DataSet.CompareBookmarks(CurrentBookMark, CursorBookMark) = 0 then
begin
DataSource.DataSet.FreeBookMark(CursorBookMark);
break;
end;
DataSource.DataSet.FreeBookMark(CursorBookMark);
if Dir < 0 then
DataSource.DataSet.Next
else
DataSource.DataSet.Prior;
end;
DataSource.DataSet.FreeBookMark(CurrentBookMark);
finally
DataSource.DataSet.EnableControls;
end;
end;
{ TDBGrid }
procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
if Shift = [ssCtrl, ssShift, ssLeft] then
SelectRange;
end;
类型
TDBGrid=class(Vcl.DBGrids.TDBGrid)
私有的
程序选择范围;
受保护的
过程鼠标向下移动(按钮:TMouseButton;Shift:tShift状态;X:整数;Y:整数);推翻
结束;
{...}
实施
{...}
程序TDBGrid.SelectRange;
变量
CurrentBookMark、CursorBookMark、FirstBookMark、LastBookMark:TBookmark;
Dir:整数;
开始
如果选择了rows.Count 0,则
DataSource.DataSet.GotoBookmark(LastBookMark)
否则,如果Dir<0,则
DataSource.DataSet.GotoBookmark(FirstBookMark)
其他的
出口
而不是DataSource.DataSet.eof do
开始
CursorBookMark:=DataSource.DataSet.GetBookmark;
SelectedRows.CurrentRowSelected:=true;
如果DataSource.DataSet.CompareBookmarks(CurrentBookMark、CursorBookMark)=0,则
开始
DataSource.DataSet.FreeBookMark(CursorBookMark);
打破
结束;
DataSource.DataSet.FreeBookMark(CursorBookMark);
如果Dir<0,则
DataSource.DataSet.Next
其他的
DataSource.DataSet.Prior;
结束;
DataSource.DataSet.FreeBookMark(CurrentBookMark);
最后
DataSource.DataSet.EnableControls;
结束;
结束;
{TDBGrid}
过程TDBGrid.MouseDown(按钮:TMouseButton;移位:TShiftState;X,Y:整数);
开始
继承;
如果Shift=[ssCtrl,ssShift,ssLeft],则
选择范围;
结束;
我为TDBGrid类使用了一个插入器。它与Ctrl+Shift键配合使用:
type
TDBGrid = class(Vcl.DBGrids.TDBGrid)
private
procedure SelectRange;
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
end;
{...}
implementation
{...}
procedure TDBGrid.SelectRange;
var
CurrentBookMark, CursorBookMark, FirstBookMark, LastBookMark: TBookmark;
Dir: integer;
begin
if SelectedRows.Count <= 1 then
exit;
DataSource.DataSet.DisableControls;
try
FirstBookMark := SelectedRows.Items[0];
LastBookMark := SelectedRows.Items[SelectedRows.Count - 1];
SelectedRows.Clear;
CurrentBookMark := DataSource.DataSet.GetBookmark;
Dir := DataSource.DataSet.CompareBookmarks(FirstBookMark, CurrentBookMark);
if Dir = 0 then
Dir := DataSource.DataSet.CompareBookmarks(LastBookMark, CurrentBookMark);
if Dir > 0 then
DataSource.DataSet.GotoBookmark(LastBookMark)
else if Dir < 0 then
DataSource.DataSet.GotoBookmark(FirstBookMark)
else
Exit;
while not DataSource.DataSet.eof do
begin
CursorBookMark := DataSource.DataSet.GetBookmark;
SelectedRows.CurrentRowSelected := true;
if DataSource.DataSet.CompareBookmarks(CurrentBookMark, CursorBookMark) = 0 then
begin
DataSource.DataSet.FreeBookMark(CursorBookMark);
break;
end;
DataSource.DataSet.FreeBookMark(CursorBookMark);
if Dir < 0 then
DataSource.DataSet.Next
else
DataSource.DataSet.Prior;
end;
DataSource.DataSet.FreeBookMark(CurrentBookMark);
finally
DataSource.DataSet.EnableControls;
end;
end;
{ TDBGrid }
procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
if Shift = [ssCtrl, ssShift, ssLeft] then
SelectRange;
end;
类型
TDBGrid=class(Vcl.DBGrids.TDBGrid)
私有的
程序选择范围;
受保护的
过程鼠标向下移动(按钮:TMouseButton;Shift:tShift状态;X:整数;Y:整数);推翻
结束;
{...}
实施
{...}
程序TDBGrid.SelectRange;
变量
CurrentBookMark、CursorBookMark、FirstBookMark、LastBookMark:TBookmark;
Dir:整数;
开始
如果选择了rows.Count 0,则
DataSource.DataSet.GotoBookmark(LastBookMark)
否则,如果Dir<0,则
DataSource.DataSet.GotoBookmark(FirstBookMark)
其他的
出口
而不是DataSource.DataSet.eof do
开始
CursorBookMark:=DataSource.DataSet.GetBookmark;
SelectedRows.CurrentRowSelected:=true;
如果DataSource.DataSet.CompareBookmarks(CurrentBookMark、CursorBookMark)=0,则
开始
DataSource.DataSet.FreeBookMark(CursorBookMark);
打破
结束;
DataSource.DataSet.FreeBookMark(CursorBookMark);
如果Dir<0,则
DataSource.DataSet.Next
其他的
DataSource.DataSet.Prior;
结束;
DataSource.DataSet.FreeBookMark(CurrentBookMark);
最后
DataSource.DataSet.EnableControls;
结束;
结束;
{TDBGrid}
过程TDBGrid.MouseDown(按钮:TMouseButton;移位:TShiftState;X,Y:整数);
开始
继承;
如果Shift=[ssCtrl,ssShift,ssLeft],则
选择范围;
结束;
感谢您提供上述代码。但我不明白使用CDS1AfterScroll()的目的是什么。是否可以检查鼠标点击来设置上一个和下一个选择?我在回答和评论中解释了这一点。当发生Shift单击时,要将选择扩展到发生单击的行,需要在单击之前知道哪一行(数据集)是当前行。这就是余弦的作用。“是否可以通过检查鼠标单击来设置上一个…?”呃,我不会这样做,因为它假设上一个选择是使用鼠标完成的,而它可能是通过键盘或数据集的其他导航完成的。如果您有一周的空闲时间,请尝试自己实施;=)谢谢你的帮助
type
TDBGrid = class(Vcl.DBGrids.TDBGrid)
private
procedure SelectRange;
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
end;
{...}
implementation
{...}
procedure TDBGrid.SelectRange;
var
CurrentBookMark, CursorBookMark, FirstBookMark, LastBookMark: TBookmark;
Dir: integer;
begin
if SelectedRows.Count <= 1 then
exit;
DataSource.DataSet.DisableControls;
try
FirstBookMark := SelectedRows.Items[0];
LastBookMark := SelectedRows.Items[SelectedRows.Count - 1];
SelectedRows.Clear;
CurrentBookMark := DataSource.DataSet.GetBookmark;
Dir := DataSource.DataSet.CompareBookmarks(FirstBookMark, CurrentBookMark);
if Dir = 0 then
Dir := DataSource.DataSet.CompareBookmarks(LastBookMark, CurrentBookMark);
if Dir > 0 then
DataSource.DataSet.GotoBookmark(LastBookMark)
else if Dir < 0 then
DataSource.DataSet.GotoBookmark(FirstBookMark)
else
Exit;
while not DataSource.DataSet.eof do
begin
CursorBookMark := DataSource.DataSet.GetBookmark;
SelectedRows.CurrentRowSelected := true;
if DataSource.DataSet.CompareBookmarks(CurrentBookMark, CursorBookMark) = 0 then
begin
DataSource.DataSet.FreeBookMark(CursorBookMark);
break;
end;
DataSource.DataSet.FreeBookMark(CursorBookMark);
if Dir < 0 then
DataSource.DataSet.Next
else
DataSource.DataSet.Prior;
end;
DataSource.DataSet.FreeBookMark(CurrentBookMark);
finally
DataSource.DataSet.EnableControls;
end;
end;
{ TDBGrid }
procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
if Shift = [ssCtrl, ssShift, ssLeft] then
SelectRange;
end;