DBGrid 與鼠標操作 |
尚未結案
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
大家好!
我參考本站的文章做出DBGrid可以用鼠標的滾輪上下滾動上一筆下一筆資料,
當如果是單選的話沒有問題(即dgMultiSelect:=flase)
但是若為true多選的時候,會出現如下圖情況,
請問怎樣做可以讓光標只停留在用鼠標滾動最終的那筆資料呢?
謝謝!
function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; ... implementation {$R *.dfm} function TDBGrid.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;MousePos: TPoint): Boolean; begin if WheelDelta < 0 then datasource.DataSet.Next; if wheelDelta > 0 then DataSource.DataSet.Prior; end; |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
事實上DBGrid這樣的運作是很正確的。 若只能按Ctrl才能複選。
可用
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer);Override; procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); begin inherited MouseDown(Button,Shift,X, Y); if Not(ssCtrl in Shift) then SelectedRows.CurrentRowSelected := False; end;~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
謝wameng版主大人!
其實在我發表這個問題之後反復測試發現,正如版主所說出現上面的情況屬正常的.後來我也想過是否可以當按Shift與Ctrl鍵才能復選,那麼就OK了.
呵,沒想到今天很意外的看到我要的結果了.真是太好了!
我把Shift也加進去判斷.但是只能Shift+上,下光標鍵進行復選,
我以關鍵字'DBGrid shift 多選' 搜尋過本站的文章,雖然有關的這樣的主題不少但是好像都沒有明確的解答.不知wameng版主可否提供一個范例?不甚感激.
(這還是我來到ktop這麼久第一回到你所屬的地盤來光顧哦!請多多關照啦!) 特別要說的我有看到版主的發表時間"發表於 - >
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
我們可以利用 BookMark 特性,紀錄第一次按下的位置。
並且在第二次按下(必須按Shift鍵)時,將該範圍選取。
TDBGrid = Class(DBGrids.TDBGrid) Protected FirstBookmark: TBookmark; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; Public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; constructor TDBGrid.Create(AOwner: TComponent); begin inherited Create(AOwner); FirstBookmark := Nil; end; destructor TDBGrid.Destroy; begin DataLink.DataSet.FreeBookmark(FirstBookmark); inherited Destroy; end; procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); var Direction: Integer; OldBookMark :TBookmark; ShiftPressed :Boolean; begin ShiftPressed := (Button=mbLeft) and (ssShift in Shift); if ShiftPressed then Shift := [ssCtrl]; inherited MouseDown(Button,Shift,X, Y); if Not DataLink.Active then Exit; if ShiftPressed and (FirstBookmark<>Nil) then begin SelectedRows.Clear; DataLink.DataSet.DisableControls; try OldBookMark := Datalink.DataSet.GetBookmark; Try Direction := Datalink.DataSet.CompareBookmarks(FirstBookmark,OldBookMark); if Direction=0 then Exit; SelectedRows.CurrentRowSelected := True; Repeat Datalink.DataSet.MoveBy(Direction); SelectedRows.CurrentRowSelected := True; OldBookMark := Datalink.DataSet.GetBookmark; until Datalink.DataSet.CompareBookmarks(FirstBookmark,OldBookMark)=0; Finally Datalink.DataSet.FreeBookmark(OldBookMark); end; finally DataLink.DataSet.EnableControls; end; end else begin FirstBookmark := DataLink.DataSet.GetBookmark; if Not(ssCtrl in Shift) then SelectedRows.CurrentRowSelected := False ; end; end;我是用BookMark 模擬類似Windows 操作用Shift 連選項目。 呵呵!夜貓子...我是。 >(這還是我來到ktop這麼久第一回到你所屬的地盤來光顧哦!請多多關照啦!) 聽到這句話,趕緊認真一些。... 有空多多幫忙一些提問者。 參考。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/05/25 12:30:22 |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |