お世話になります。
ポップアップメニューの表示有無を取得する方法はないでしょうか?
具体的な処理は地図をクリックした位置にマークを表示し、ポップアップが
消えたらマークを消したいのです。
ポップアップメニュー項目をクリックした時は良いのですが、メニュー外を
クリックしてメニューが消えた時の処理に困っています。
方法を御存知の方が居られましたら、宜しくお願いします。
鳴かせて見せようホトトギス♪ (秀吉)
※PopupMenuコンポに OnDestroyイベント追加
type
TPopupMenuEx = class(TPopupMenu)
private
FOnDestroy: TNotifyEvent;
published
property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TPopupMenuEx.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
AutoPopup := False;
FOnDestroy := nil;
end;
destructor TPopupMenuEx.Destroy;
begin
Inherited Destroy;
if Assigned(FOnDestroy) then FOnDestroy(Self);
end;
// OnDestroyイベントはんどら
procedure TForm1.PopupMenuExDestroy(Sender: TObject);
begin
// マークを消す
end;
procedure TForm1.ほにゃ(...; X,Y: Integer);
begin
...
with TPopupMenuEx.Create(Self) do try
OnPopup := PopupMenuExPopup;
OnDestroy := PopupMenuExDestroy;
... //メニュー項目作成、追加
with ClientToScreen(Point(X,Y)) do
Popup(X, Y);
finally
Free;
end;
...
end;
鳴かずんば ...さん、有り難うございました。
表示状態を取得できるプロパティでもあれば良いなと思っていたのですが、
拡張PopupMenuを作成し、OnDestroyイベントを作成するとは確かに力業です。
提供して頂いたコードでサンプルを作成し、デバッグ中に気づいたのですが、
実は非常に簡単に自分の質問内容を解決する方法が解りました。
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pp: TPoint;
begin
if (Button in [mbRight]) then begin {右クリック時}
Form1.Caption := 'PopupMenu表示';
pp := PaintBox1.ClientToScreen( Point(X,Y) );
PopupMenu1.Popup( pp.x, pp.y );
Form1.Caption := 'PopupMenu消去';
end;
end;
上記の様にPopupメソッドの後にPopupMenu消去時の処理を行えば良かった様です。
PopupメソッドはShowメソッドの様な動作かと思っていたのですが、ShowModalと
同じ動作だったのですね。
ツイート | ![]() |