TStringGridをクリックせずに、別処理にて
TStringGridのClickイベントを発生させる方法はありますか?
SG1:TStringGrid;
SG1.Row=1;
SG1_Click(sender);
としてみましたが、Clickイベントの中でRowを見ると-1となって
うまくいきません。
以上です。
Rowが変更された時点でOnClickイベントが発生するはずです。
もちろん、Row=1のとき、Row:=1にしてもイベントは発生しません。
ソースを正確に提示すれば、問題点がわかると思います。
にしのさんありがとう御座います。
しかし、Rowに行番号を入れた時点で、EInvalidGridOperationの例外が
発生し、"グリッドインデックスが範囲を超えています"となります。
Rowには、0以上の値を設定していますが、例外時のRowを見ると、-1と
なっています。
行っているのは、PageControlを2頁用意し、それぞれにStringGridを
置いています。
頁の切替え時、PageControlのChangeイベント内で、1頁目のStringGridで
選択した行の値(2頁目StringGridの検索キーとなる項目)を取得し、
2頁目のStringGridを検索して該当行番号を求め、2頁目のStringGridの
Rowに行番号を設定しています。
検索結果は0以上の値がとれていますが、Rowに設定した時点で例外となって
しまいます。
説明不足かも知れませんが、現象わかりますか?
以上です。
2頁目のStringGridに設定したRow値が
2頁目のStringGridのRowCount以上なのでは?
指定したRowは、本当に存在する行でしょうか。
0ベースですので、3行あったら3を入れれば例外が発生しますよ。
みなさんありがとう御座います。
指定Rowは、存在しますし、RowCount以上の値も設定していませんので
問題無いと思います。
以下ロジックです。
with StringGrid1 do begin
For w_i:=1 To RowCount do begin
if Cells[0, w_i] = 'aaa' then begin
StringGrid1.Row:=w_i;
Exit;
end;
end;
end;
以上です。
> For w_i:=1 To RowCount do begin
> if Cells[0,w_i] = 'aaa' then begin
> StringGrid1.Row:=w_i;
w_iがRowCountと等しくなってしまう可能性がありますよね。
For w_i:=1 To RowCount-1 do begin
ではないでしょうか?
そうですね。すいません。
でも、データを10行作成して、3行目が検索結果となるように
テストしていますので、やはりRowCountを超えてはいません。
Clickイベントが発生するとき、そのコンポーネントが表示されていますか?
PageControlなどで後ろに隠れているとき、エラーになったような気がします。
# 未確認です
Rowを設定する前に、PageControlのページを変更してみてください。
にしのさん、通りすがりさんありがとう御座いました。
StringGridのRowに該当行番号を設定する処理には、問題ありませんでしたが、
初期表示時にStringGridの1セルが選択色になってしまうのを回避する為に、
下記のようなクリアー処理を入れていました。
これが原因で、その後StringGridのRowに値を設定しても、Row=-1の例外と
なっていました。
本当にありがとう御座いました。
var
w_Rect: TGridRect;
begin
w_Rect.Left := -1;
w_Rect.Right := -1;
w_Rect.Top := -1;
w_Rect.Bottom := -1;
with StringGrid1 do begin
Selection := w_Rect;
Refresh();
end;
end;
以上です。
ツイート | ![]() |