Delphi11.3Entを使用してFireMonkeyアプリを作成しています。
開閉するサイドメニューを作成したいので、TRectAngleを左に配置し、その上にTSpeedButtonを配置し、両オブジェクトのOnMouseLeaveイベントでサイドメニューの幅を調整しようとしています。
しかし、これですと、次のメニューボタンへマウスカーソルを移動した時もこのイベントが走るため、サイドメニューが畳まれてしまいます。
これを抑制するために、マウスの座標を捉えたいのですが、TScaledLayoutを採用しているためやフォームのサイズを自由に調整できるためか、マウス座標の値が少し違う気がします。
アプリケーション上のマウス座標を取得する良い方法がありましたら、教えて頂けませんか?
私は次の様にしています。外していましたら、ごめんなさい。
フォーム起動時にフォームの幅を取得します。同時にスケールを1としておきます。
FStartWidth := Self.Width;
FScale := 1;
もしフォームがリサイズされた場合はスケールを再計算します。
FResizedWidth := Self.Width;
FScale := FResizedWidth / FStartWidth;
procedure TForm1.Rectangle1.OnMouseLeave(Sender: TObject);
var
posMouse: TPointF;
aplPos: Single;
sclPos: Single;
begin
posMouse := Screen.MousePos; // マウスの座標を取得
aplPos := posMouse.X - Self.Left; // アプリ上の座標を求めているつもりです
sclPos: aplPos / FScale; // スケールを考慮したX座標
// X座標が規定値を超えた場合の処理
if sclPos > 100 then
Rectangle.Width := 0;
end;
外していたらすみません。また、もっと簡単な方法がきっとあるかと思います。
外していたらすいません、
TScaledLayoutには、OriginalWidthとWidth、OriginalHeightとHeigjtプロパティがあったと思いますので、
ScaledLayout1.OriginalWidth/Width
と
ScaledLayout1.OriginalHeigjt/Height
で縦横それぞれのの拡大縮小比率が出せたような気がします。
TScaledLayoutが入れ子になっていると、ややこしくなりますが、、、また、正しく動かないかもですが。試していなくてすいません。
早速間違えてました。以下かもです。
ScaledLayout1.OriginalWidth/ScaledLayout1.Width
ScaledLayout1.OriginalHeigjt/ScaledLayout1.Height
また、間違えました。誠にすいません。
ScaledLayout1.OriginalWidth/ScaledLayout1.Width
ScaledLayout1.OriginalHeight/ScaledLayout1.Height
Moeさん、manさん、有難うございます。
どちらも思い通りの事が実現出来ました。
感謝感謝です。
ツイート | ![]() |