StringGridにPopupActionBarの表示を行っているのですが、
Row=1のセルで最初に右クリックをし、そのままRow=2のセルに
右クリックをしたときポップアップの表示ができません。
もう一度Row=2のセルで右クリックすると、ポップアップが表示されます。
グリッドの位置の認識が出来てないのでしょうか?
もしくは、何か初期化が必要でしょうか?
ご存知の方がいらしたら、ご教授ください。
if (Button = mbRight) then
begin
MouseToCell(X,Y,intCol,intRow);
if intRow = 0 then
begin
Exit;
end;
pmnTComInfo.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
var
cp,sp :TPoint;
bRect :TRect;
begin
//スクリーンのカーソル座標を取得
GetCursorPos(cp);
//スクリーンの座標からクライアントの座標へ
sp := StringGrid1.ScreenToClient(cp);
//ColとRowを取得
StringGrid1.MouseToCell(sp.X,sp.Y,intCol,intRow);
if (intCol >= 0) and (intRow >= 0) and (Bottun = mbRigth) then
begin
if ・・・ tnen //ポップアップを表示するか否か判定
begin
//ポップアップ位置を指定のCellを基準に
bRect := StringGrid1.CellRect(intCol,intRow);
cp := StringGrid1.ClientToScreen(sp);
PopMenu.PopUp(cp.X+10,cp.Y+10); //ちょとずらして表示
外れてるかもしれませんが、如何でしょうか?
X,Y値ではなくカーソルの位置を取得し、それをGridの座標に変換
そして、ColとRow値を取得する。
これで上手くいった気がしましたが・・・
ちなみにコピペでないので綴りが違うかも
間が抜けてた
bRect := StringGrid1.CellRect(intCol,intRow);
sp.X := bRect.Left;
sp.Y := bRect.Top;
cp := StringGrid1.ClientToScreen(sp);
<m(__)m>
Syakeさん、ありがとうございます。
試してみたのですが、上手く行きませんでした。
Row=1のセルで最初に右クリックすると、ポップアップが表示され
その状態でRow=2のセルを右クリックしたのですが、表示されなかったです。
グリッドは選択された状態にはなっているのですが。。。
ちなみに、ポップアップのアイテムはプロパティでは登録せず、
プログラム内で動的に発生させてます。
設定している内容は、
PopMenu.Caption
PopMenu.Tag
PopMenu.OnClick
になります。
何か欠けているのはあるでしょか?
その現象は1回目がRow=1、2回目がRow=2の時だけで、それ以外のケースでは正しく動作するのでしょうか。
たとえばクリックするたびにポップアップが出る→消える→出る→消える……となっているだけ、というようなことはありませんか?
また、行の判定処理をはずしても現象は同じでしょうか? まずそのあたりを切り分けてみてください。
一応、OnMouseDownイベントを使っていると仮定して同じコードを試してみましたが
こちらでは正しく動いています(クリックするたびその場所にポップアップメニューが出ます)。
TPopupMenuであれば、クリックする度にその場所に表示されます。
しかし、PopupActionBarだと、右クリックを押すたびにポップアップが
出る→消える→出る→消えるを繰り返します。
TPopupMenuとPopupActionBarは同じ動きが出来ないのでしょうか?
ツイート | ![]() |