線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3761
推到 Plurk!
推到 Facebook!

關於TStringGrid的SelectRow事件

答題得分者是:P.D.
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-10-11 10:36:31 IP:59.120.xxx.xxx 未訂閱
 各位先進,小弟使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-10-11 22:56:17 IP:220.136.xxx.xxx 未訂閱
我以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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-10-12 09:07:11 IP:59.120.xxx.xxx 未訂閱
 感謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-10-12 12:46:36 IP:220.136.xxx.xxx 未訂閱
我個人建議, 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-10-12 16:13:26 IP:59.120.xxx.xxx 未訂閱
 再次感謝您的熱心,showmessage的確會有focus的問題,所以我重新加入了您的程式,
但無論點擊幾次times都不變,都顯示press:0,我是使用multidevice mode,Activate Win32,謝謝。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-10-12 19:09:17 IP:220.136.xxx.xxx 未訂閱
這個問題引發我的興趣, 我稍微用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-10-12 20:45:31 IP:59.120.xxx.xxx 未訂閱
真的很感謝您熱心測試,其實您使用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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-10-12 22:05:03 IP:220.136.xxx.xxx 未訂閱
有一點不明白, 你是要取得點擊前的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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2014-10-13 06:56:46 IP:59.120.xxx.xxx 未訂閱
再次謝謝您的熱心,同樣的程式在windows沒問題,但在Android卻有問題,
明明點的是這一列,On-click回傳回來的row selected卻是點擊之前的那一列
小弟找到一篇相同問題的發文
http://stackoverflow.com/questions/22975120/delphi-xe5-firemonkey-tstringgrid-onclick-event
我會再研究看看,謝謝您的啟發。
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2014-10-14 09:59:18 IP:59.120.xxx.xxx 未訂閱
做個註記:

小弟最後的解決方式就是
on-Click事件中
Tstringgrid(sender).SelectRow(-1);
但系統會指到第一列,所以只好犧牲第一列不用

然後在on-SelChanged事件中
if Tstringgrid(sender).Selected<1 then exit;

這樣基本上可以達成要求,不過就是太笨了,最好Canfocus:=false

再次感謝 P.D. 的熱心協助。

系統時間:2024-05-02 5:33:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!