關於TStringGrid的SelectRow事件 |
答題得分者是:P.D.
|
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
各位先進,小弟使用TStringGrid,在已經點選並Focus的列上想再點選一次的時候,不知道要使用哪個事件。
OnSelChanged 只能發生在改變選擇列的時候,想再點選一次相同的列不會有作用。 OnSelectCell 當想重複再點選一次的時候,一樣沒有作用。 On-Click 則只會取得上一次的選擇列(Tstringgrid.Selected),並且會和上面的兩個事件相互干擾。 小弟笨拙,爬了很久的文還是找不出事件的用法,請先進能撥冗賜教,謝謝! 編輯記錄
pcernet 重新編輯於 2014-10-11 10:38:22, 註解 On-Click 會顯示成 forbidden‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我以delphi5實作, 發現 on select cell 可以做到你的要求啊,
如果 cell 設定為Editing=flase, 不論重覆點選幾次, 都會觸發, 但如果是具editing模式, 點選一次會進入到edit模式, 再點同樣的cell就不會觸發 [code delphi] type TForm1 = class(TForm) StringGrid1: TStringGrid; Label1: TLabel; procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure FormCreate(Sender: TObject); private { Private declarations } times: integer; nrow, ncol :integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if (nrow = arow) and (ncol = acol) then inc(times) else times:= 0; label1.Caption := 'arow:' inttostr(arow) ' acol:' inttostr(acol) ' press:' inttostr(times); nrow:= arow; ncol:= acol; end; procedure TForm1.FormCreate(Sender: TObject); begin times:= 0; end; [/code] ===================引 用 pcernet 文 章=================== 各位先進,小弟使用TStringGrid,在已經點選並Focus的列上想再點選一次的時候,不知道要使用哪個事件。 OnSelChanged 只能發生在改變選擇列的時候,想再點選一次相同的列不會有作用。 OnSelectCell 當想重複再點選一次的時候,一樣沒有作用。 On-Click 則只會取得上一次的選擇列(Tstringgrid.Selected),並且會和上面的兩個事件相互干擾。 小弟笨拙,爬了很久的文還是找不出事件的用法,請先進能撥冗賜教,謝謝! |
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
感謝P.D.的回覆,我的環境是XE7的firemonkey。
以前在使用XE前的版本貌似也沒有這個問題,所以才會發文在Firemonkey區,我沒有'用計次的方式測試,只是在事件觸發的時候showmessage一下,但確實是不行! 我不知道是不是跟設定有關係,Editing 也一直都是設 false ,在Windows OS下,也有 highlighting 的問題,當我觸發過OnSelectCell之後,即使沒有點擊任何的Cell,只是經過(mouseover), 也會觸發OnSelectCell事件,就是不知道這是Bug還是有其他的設定要處理! 請問Tstringgrid是否可以在已經selected的row上面點擊後再次獲得觸發,謝謝! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我個人建議, StsringGrid 要 debug 查看觸發, 不要使用showmessage, 因為這會導致 StringGrid Focus 移走而不準,
我提供的計次方式你可以參考泡製, 來確認重覆點選是否有觸發 grid 事件 另外, 你使用 xe7 是開啟 vcl form 還是 multidevice mode? ===================引 用 pcernet 文 章=================== 感謝P.D.的回覆,我的環境是XE7的firemonkey。 以前在使用XE前的版本貌似也沒有這個問題,所以才會發文在Firemonkey區,我沒有'用計次的方式測試,只是在事件觸發的時候showmessage一下,但確實是不行! 我不知道是不是跟設定有關係,Editing 也一直都是設 false ,在Windows OS下,也有 highlighting 的問題,當我觸發過OnSelectCell之後,即使沒有點擊任何的Cell,只是經過(mouseover), 也會觸發OnSelectCell事件,就是不知道這是Bug還是有其他的設定要處理! 請問Tstringgrid是否可以在已經selected的row上面點擊後再次獲得觸發,謝謝! |
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
這個問題引發我的興趣, 我稍微用 xe7 測了一下, 發現
如果使用 vcl form 方式是可以達到你的要求, 但如果是 nultideivce 正如同你說的一樣, 只會觸發一次, 但換個角度來看, 我們在使用 gird 的時候, 都希望如果點選在同一個cell 不要去觸發 onselectcell 兩次, 而你卻要去每次都要執行, 與一般習慣相反, 而我想, 原廠的設計(因為這些fm元件都是原廠自己做出來的), 或許是原廠覺得這樣才是對的, 所以同一個cell就不讓其重覆觸發, 我搞了一個方法, 或許可行, 你可以試試看 nrow, ncol : 表目前的 arow, acol mrow, mcol: 表上一次的 arow, acol 事件觸發在 on click上 由於 grid 的事件是 on selectcell 先於 on click [code delphi] private { Private declarations } times, nrow, ncol: integer; mrow, mcol: integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin ncol:= 0; nrow:= 0; mcol:= 0; mrow:= 0; end; procedure TForm1.StringGrid1Click(Sender: TObject); begin if (ncol=mcol) and (nrow=mrow) then inc(times) else begin mcol:= ncol; mrow:= nrow; times:= 0; end; label1.text:= 'nrow:' inttostr(nrow) ' ncol:' inttostr(ncol) ' times:' inttostr(times) #13 'mrow:' inttostr(mrow) ' mcol:' inttostr(mcol) end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; const ACol, ARow: Integer; var CanSelect: Boolean); begin if (ncol<>acol) then mcol:= ncol; if (nrow<>arow) then mrow:= nrow; ncol := acol; nrow := arow; end; [/code] |
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
真的很感謝您熱心測試,其實您使用On-click事件一定可以獲得每次的觸發,但重點不是點擊了幾次,
而是要取得點擊的row selected,事件的順序好像是selectcell和selchanged先,然後再on-click, 所以點擊(on-click)時取得的是selectcell之前的row selected,所以並不正確,這就是我的問題! P.S:真的很抱歉,小弟測試windows下沒這個問題,在Android實機測試,on-click後的row selected值確實不正確, 程式是做為語音播放之用,所以會重複按下同一列做為再播放一次,謝謝! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
有一點不明白, 你是要取得點擊前的row或者點擊後row?
我用times的目的不是要告訴你被點擊幾次, 重點是你要在同一個cell被點擊能運作你要的語音播放, 我猜你每一個cell要播放的語音可能是不同, 所以才會要用cell位置來判斷, 而上面的做法, 可以判斷出點擊前的row, col, 也可以取得之後的座標, 所以我想應該是能解決你的問題 ===================引 用 pcernet 文 章=================== 真的很感謝您熱心測試,其實您使用On-click事件一定可以獲得每次的觸發,但重點不是點擊了幾次, 而是要取得點擊的row selected,事件的順序好像是selectcell和selchanged先,然後再on-click, 所以點擊(on-click)時取得的是selectcell之前的row selected,所以並不正確,這就是我的問題! P.S:真的很抱歉,小弟測試windows下沒這個問題,在Android實機測試,on-click後的row selected值確實不正確, 程式是做為語音播放之用,所以會重複按下同一列做為再播放一次,謝謝! |
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
|
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |