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 前罗维德 //换句话说,我们首先检查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

多选栅格的默认选择行为是Ctrl-Click,而不是Shift-Click。使用它不需要任何特定的鼠标单击处理程序


要实现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;