dgMultiSelect只对ctrl起作用,shift要自己写:DBGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ll_CurrentRow,ll_i:integer; if_exit:boolean; begin if not (dgMultiSelect in DBGrid1.Options) then exit; if DBGrid1.DataSource=nil then exit; if DBGrid1.DataSource.DataSet=nil then exit; ll_CurrentRow:=DBGrid1.DataSource.DataSet.RecNo; if_exit:=false;
// DBGrid1.DataSource.DataSet.AutoRefresh:=false; if Shift=[ssShift] then begin DBGrid1.DataSource.DataSet.MoveBy(db1_selectedrow-ll_currentrow); while not if_exit do begin DBGrid1.SelectedRows.CurrentRowSelected:=true; //根据情况判断当前记录前移还是后移 if ll_currentrow<db1_selectedrow then DBGrid1.DataSource.DataSet.Prior else if ll_currentrow>db1_selectedrow then DBGrid1.DataSource.DataSet.Next; //判断是否选择完毕 if ll_currentrow<db1_selectedrow then begin if DBGrid1.DataSource.DataSet.RecNo<=ll_currentrow then if_exit:=true else if_exit:=false; end else if ll_currentrow>db1_selectedrow then begin if DBGrid1.DataSource.DataSet.RecNo>=ll_currentrow then if_exit:=true else if_exit:=false; end; end; end; //记录当前的行号 //db1_selectedrow在单元中声明 db1_selectedrow:=ll_currentrow; end;
Shift: TShiftState; X, Y: Integer);
var
ll_CurrentRow,ll_i:integer;
if_exit:boolean;
begin
if not (dgMultiSelect in DBGrid1.Options) then exit;
if DBGrid1.DataSource=nil then exit;
if DBGrid1.DataSource.DataSet=nil then exit; ll_CurrentRow:=DBGrid1.DataSource.DataSet.RecNo;
if_exit:=false;
// DBGrid1.DataSource.DataSet.AutoRefresh:=false;
if Shift=[ssShift] then
begin
DBGrid1.DataSource.DataSet.MoveBy(db1_selectedrow-ll_currentrow);
while not if_exit do
begin
DBGrid1.SelectedRows.CurrentRowSelected:=true; //根据情况判断当前记录前移还是后移
if ll_currentrow<db1_selectedrow then
DBGrid1.DataSource.DataSet.Prior
else if ll_currentrow>db1_selectedrow then
DBGrid1.DataSource.DataSet.Next;
//判断是否选择完毕
if ll_currentrow<db1_selectedrow then
begin
if DBGrid1.DataSource.DataSet.RecNo<=ll_currentrow then
if_exit:=true
else
if_exit:=false;
end
else if ll_currentrow>db1_selectedrow then
begin
if DBGrid1.DataSource.DataSet.RecNo>=ll_currentrow then
if_exit:=true
else
if_exit:=false;
end;
end;
end; //记录当前的行号 //db1_selectedrow在单元中声明
db1_selectedrow:=ll_currentrow;
end;