mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 16:59:09 +02:00
LCL, implemented extended selection in dbgrid with multiselect option
git-svn-id: trunk@15713 -
This commit is contained in:
parent
1546f3eee9
commit
772684f5d0
@ -303,6 +303,8 @@ type
|
|||||||
FCheckedBitmap, FUnCheckedBitmap, FGrayedBitmap: TBitmap;
|
FCheckedBitmap, FUnCheckedBitmap, FGrayedBitmap: TBitmap;
|
||||||
FSelectedRows: TBookmarkList;
|
FSelectedRows: TBookmarkList;
|
||||||
FOnPrepareCanvas: TPrepareDbGridCanvasEvent;
|
FOnPrepareCanvas: TPrepareDbGridCanvasEvent;
|
||||||
|
FKeyBookmark: TBookmarkStr;
|
||||||
|
FKeySign: Integer;
|
||||||
procedure EmptyGrid;
|
procedure EmptyGrid;
|
||||||
function GetCurrentColumn: TColumn;
|
function GetCurrentColumn: TColumn;
|
||||||
function GetCurrentField: TField;
|
function GetCurrentField: TField;
|
||||||
@ -355,6 +357,7 @@ type
|
|||||||
procedure GetScrollbarParams(out aRange, aPage, aPos: Integer);
|
procedure GetScrollbarParams(out aRange, aPage, aPos: Integer);
|
||||||
procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
|
procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
|
||||||
function LoadResBitmapImage(const ResName: string): TBitmap;
|
function LoadResBitmapImage(const ResName: string): TBitmap;
|
||||||
|
procedure ClearSelection(selCurrent:boolean=false);
|
||||||
protected
|
protected
|
||||||
procedure AddAutomaticColumns;
|
procedure AddAutomaticColumns;
|
||||||
procedure BeforeMoveSelection(const DCol,DRow: Integer); override;
|
procedure BeforeMoveSelection(const DCol,DRow: Integer); override;
|
||||||
@ -966,8 +969,10 @@ begin
|
|||||||
|
|
||||||
inherited Options := OldOptions;
|
inherited Options := OldOptions;
|
||||||
|
|
||||||
if MultiSel and not (dgMultiSelect in FOptions) then
|
if MultiSel and not (dgMultiSelect in FOptions) then begin
|
||||||
FSelectedRows.Clear;
|
FSelectedRows.Clear;
|
||||||
|
FKeyBookmark:='';
|
||||||
|
end;
|
||||||
|
|
||||||
EndLayout;
|
EndLayout;
|
||||||
end;
|
end;
|
||||||
@ -1686,6 +1691,43 @@ var
|
|||||||
FDatalink.Dataset.Insert;
|
FDatalink.Dataset.Insert;
|
||||||
{$IfDef dbgGrid}DebugLn('KeyDown.doInsert FIN');{$Endif}
|
{$IfDef dbgGrid}DebugLn('KeyDown.doInsert FIN');{$Endif}
|
||||||
end;
|
end;
|
||||||
|
procedure SelectNext(const AStart,ADown:Boolean);
|
||||||
|
var
|
||||||
|
N: Integer;
|
||||||
|
CurBookmark: TBookmarkStr;
|
||||||
|
begin
|
||||||
|
if (ssShift in Shift) then begin
|
||||||
|
|
||||||
|
CurBookmark := FDatalink.DataSet.Bookmark;
|
||||||
|
if FKeyBookmark='' then
|
||||||
|
FKeyBookmark:=CurBookmark;
|
||||||
|
|
||||||
|
if (FKeyBookmark=CurBookmark) then begin
|
||||||
|
if AStart then begin
|
||||||
|
SelectRecord(true);
|
||||||
|
if ADown then
|
||||||
|
FKeySign := 1
|
||||||
|
else
|
||||||
|
FKeySign := -1;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
FKeySign := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
n := 4*Ord(FKeySign>=0) + 2*Ord(ADown) + 1*Ord(AStart);
|
||||||
|
case n of
|
||||||
|
0,6,8..11:
|
||||||
|
begin
|
||||||
|
SelectRecord(True);
|
||||||
|
end;
|
||||||
|
3,5:
|
||||||
|
begin
|
||||||
|
SelectRecord(False);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
ClearSelection(true);
|
||||||
|
end;
|
||||||
function doVKDown: boolean;
|
function doVKDown: boolean;
|
||||||
begin
|
begin
|
||||||
{$ifdef dbgGrid}DebugLn('DoVKDown INIT');{$endif}
|
{$ifdef dbgGrid}DebugLn('DoVKDown INIT');{$endif}
|
||||||
@ -1699,10 +1741,12 @@ var
|
|||||||
end;
|
end;
|
||||||
end else begin
|
end else begin
|
||||||
result:=false;
|
result:=false;
|
||||||
|
SelectNext(true,true);
|
||||||
doMoveBy(1);
|
doMoveBy(1);
|
||||||
if GridCanModify and FDataLink.EOF then begin
|
if GridCanModify and FDataLink.EOF then
|
||||||
doAppend;
|
doAppend
|
||||||
end;
|
else
|
||||||
|
SelectNext(false,true);
|
||||||
end;
|
end;
|
||||||
{$ifdef dbgGrid}DebugLn('DoVKDown FIN');{$endif}
|
{$ifdef dbgGrid}DebugLn('DoVKDown FIN');{$endif}
|
||||||
end;
|
end;
|
||||||
@ -1711,8 +1755,11 @@ var
|
|||||||
{$ifdef dbgGrid}DebugLn('DoVKUP INIT');{$endif}
|
{$ifdef dbgGrid}DebugLn('DoVKUP INIT');{$endif}
|
||||||
if InsertCancelable then
|
if InsertCancelable then
|
||||||
doCancel
|
doCancel
|
||||||
else
|
else begin
|
||||||
|
SelectNext(true, false);
|
||||||
doMoveBy(-1);
|
doMoveBy(-1);
|
||||||
|
SelectNext(false, false);
|
||||||
|
end;
|
||||||
result := FDatalink.DataSet.BOF;
|
result := FDatalink.DataSet.BOF;
|
||||||
{$ifdef dbgGrid}DebugLn('DoVKUP FIN');{$endif}
|
{$ifdef dbgGrid}DebugLn('DoVKUP FIN');{$endif}
|
||||||
end;
|
end;
|
||||||
@ -1799,6 +1846,7 @@ begin
|
|||||||
doOnKeyDown;
|
doOnKeyDown;
|
||||||
if Key<>0 then begin
|
if Key<>0 then begin
|
||||||
doMoveBy( VisibleRowCount );
|
doMoveBy( VisibleRowCount );
|
||||||
|
ClearSelection(true);
|
||||||
Key := 0;
|
Key := 0;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1808,6 +1856,7 @@ begin
|
|||||||
doOnKeyDown;
|
doOnKeyDown;
|
||||||
if Key<>0 then begin
|
if Key<>0 then begin
|
||||||
doMoveBy( -VisibleRowCount );
|
doMoveBy( -VisibleRowCount );
|
||||||
|
ClearSelection(true);
|
||||||
key := 0;
|
key := 0;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1846,6 +1895,7 @@ begin
|
|||||||
FDataLink.DataSet.First
|
FDataLink.DataSet.First
|
||||||
else
|
else
|
||||||
MoveNextSelectable(False, FixedCols, Row);
|
MoveNextSelectable(False, FixedCols, Row);
|
||||||
|
ClearSelection(true);
|
||||||
Key:=0;
|
Key:=0;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1860,6 +1910,7 @@ begin
|
|||||||
FDatalink.DataSet.Last
|
FDatalink.DataSet.Last
|
||||||
else
|
else
|
||||||
MoveNextSelectable(False, ColCount-1, Row);
|
MoveNextSelectable(False, ColCount-1, Row);
|
||||||
|
ClearSelection(true);
|
||||||
Key:=0;
|
Key:=0;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1949,13 +2000,20 @@ begin
|
|||||||
doInherited;
|
doInherited;
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
|
|
||||||
|
FKeyBookmark:=''; // force new keyboard selection start
|
||||||
|
|
||||||
P:=MouseToCell(Point(X,Y));
|
P:=MouseToCell(Point(X,Y));
|
||||||
if P.Y=Row then begin
|
if P.Y=Row then begin
|
||||||
//doAcceptValue;
|
//doAcceptValue;
|
||||||
|
|
||||||
if ssCtrl in Shift then
|
if ssCtrl in Shift then
|
||||||
ToggleSelectedRow
|
ToggleSelectedRow
|
||||||
else
|
else begin
|
||||||
|
ClearSelection(true);
|
||||||
doInherited;
|
doInherited;
|
||||||
|
end;
|
||||||
|
|
||||||
end else begin
|
end else begin
|
||||||
doMouseDown;
|
doMouseDown;
|
||||||
if ValidDataSet then begin
|
if ValidDataSet then begin
|
||||||
@ -1965,8 +2023,10 @@ begin
|
|||||||
end;
|
end;
|
||||||
if ssCtrl in Shift then
|
if ssCtrl in Shift then
|
||||||
ToggleSelectedRow
|
ToggleSelectedRow
|
||||||
else
|
else begin
|
||||||
|
ClearSelection(true);
|
||||||
doMoveToColumn;
|
doMoveToColumn;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -2721,6 +2781,17 @@ begin
|
|||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomDBGrid.ClearSelection(selCurrent:boolean=false);
|
||||||
|
begin
|
||||||
|
if (dgMultiSelect in Options) then begin
|
||||||
|
if SelectedRows.Count>0 then
|
||||||
|
SelectedRows.Clear;
|
||||||
|
if SelCurrent then
|
||||||
|
SelectRecord(true);
|
||||||
|
end;
|
||||||
|
FKeyBookmark:='';
|
||||||
|
end;
|
||||||
|
|
||||||
destructor TCustomDBGrid.Destroy;
|
destructor TCustomDBGrid.Destroy;
|
||||||
begin
|
begin
|
||||||
FUncheckedBitmap.Free;
|
FUncheckedBitmap.Free;
|
||||||
|
Loading…
Reference in New Issue
Block a user