TStringGridのClickイベントを発生させるには?

解決


なべなべ  2003-12-11 04:09:21  No: 6033

TStringGridをクリックせずに、別処理にて
TStringGridのClickイベントを発生させる方法はありますか?

SG1:TStringGrid;
SG1.Row=1;
SG1_Click(sender);
としてみましたが、Clickイベントの中でRowを見ると-1となって
うまくいきません。

以上です。


にしの  2003-12-11 07:40:47  No: 6034

Rowが変更された時点でOnClickイベントが発生するはずです。
もちろん、Row=1のとき、Row:=1にしてもイベントは発生しません。
ソースを正確に提示すれば、問題点がわかると思います。


なべなべ  2003-12-11 22:28:51  No: 6035

にしのさんありがとう御座います。

しかし、Rowに行番号を入れた時点で、EInvalidGridOperationの例外が
発生し、"グリッドインデックスが範囲を超えています"となります。
Rowには、0以上の値を設定していますが、例外時のRowを見ると、-1と
なっています。

行っているのは、PageControlを2頁用意し、それぞれにStringGridを
置いています。
頁の切替え時、PageControlのChangeイベント内で、1頁目のStringGridで
選択した行の値(2頁目StringGridの検索キーとなる項目)を取得し、
2頁目のStringGridを検索して該当行番号を求め、2頁目のStringGridの
Rowに行番号を設定しています。
検索結果は0以上の値がとれていますが、Rowに設定した時点で例外となって
しまいます。

説明不足かも知れませんが、現象わかりますか?

以上です。


通りすがり  2003-12-11 22:44:30  No: 6036

2頁目のStringGridに設定したRow値が
2頁目のStringGridのRowCount以上なのでは?


にしの  2003-12-11 22:44:52  No: 6037

指定したRowは、本当に存在する行でしょうか。
0ベースですので、3行あったら3を入れれば例外が発生しますよ。


なべなべ  2003-12-12 02:23:14  No: 6038

みなさんありがとう御座います。

指定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;

以上です。


通りすがり  2003-12-12 02:48:12  No: 6039

>  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
ではないでしょうか?


なべなべ  2003-12-12 06:06:03  No: 6040

そうですね。すいません。
でも、データを10行作成して、3行目が検索結果となるように
テストしていますので、やはりRowCountを超えてはいません。


にしの  2003-12-12 06:46:05  No: 6041

Clickイベントが発生するとき、そのコンポーネントが表示されていますか?
PageControlなどで後ろに隠れているとき、エラーになったような気がします。
# 未確認です
Rowを設定する前に、PageControlのページを変更してみてください。


なべなべ  2003-12-17 23:29:32  No: 6042

にしのさん、通りすがりさんありがとう御座いました。

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;

以上です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加