FireMonkeyのマウス座標

解決


エイチ  2023-09-14 04:05:35  No: 151092  IP: [192.*.*.*]

Delphi11.3Entを使用してFireMonkeyアプリを作成しています。
開閉するサイドメニューを作成したいので、TRectAngleを左に配置し、その上にTSpeedButtonを配置し、両オブジェクトのOnMouseLeaveイベントでサイドメニューの幅を調整しようとしています。
しかし、これですと、次のメニューボタンへマウスカーソルを移動した時もこのイベントが走るため、サイドメニューが畳まれてしまいます。
これを抑制するために、マウスの座標を捉えたいのですが、TScaledLayoutを採用しているためやフォームのサイズを自由に調整できるためか、マウス座標の値が少し違う気がします。
アプリケーション上のマウス座標を取得する良い方法がありましたら、教えて頂けませんか?

編集 削除
Moe  2023-09-14 13:17:41  No: 151094  IP: [192.*.*.*]

私は次の様にしています。外していましたら、ごめんなさい。
フォーム起動時にフォームの幅を取得します。同時にスケールを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;
外していたらすみません。また、もっと簡単な方法がきっとあるかと思います。

編集 削除
mam  2023-09-15 00:41:20  No: 151095  IP: [192.*.*.*]

外していたらすいません、
TScaledLayoutには、OriginalWidthとWidth、OriginalHeightとHeigjtプロパティがあったと思いますので、
ScaledLayout1.OriginalWidth/Width

ScaledLayout1.OriginalHeigjt/Height
で縦横それぞれのの拡大縮小比率が出せたような気がします。

TScaledLayoutが入れ子になっていると、ややこしくなりますが、、、また、正しく動かないかもですが。試していなくてすいません。

編集 削除
mam  2023-09-15 00:44:34  No: 151096  IP: [192.*.*.*]

早速間違えてました。以下かもです。
ScaledLayout1.OriginalWidth/ScaledLayout1.Width
ScaledLayout1.OriginalHeigjt/ScaledLayout1.Height

編集 削除
mam  2023-09-15 00:46:13  No: 151097  IP: [192.*.*.*]

また、間違えました。誠にすいません。
ScaledLayout1.OriginalWidth/ScaledLayout1.Width
ScaledLayout1.OriginalHeight/ScaledLayout1.Height

編集 削除
エイチ  2023-09-15 03:05:20  No: 151099  IP: [192.*.*.*]

Moeさん、manさん、有難うございます。
どちらも思い通りの事が実現出来ました。
感謝感謝です。

編集 削除