FireMonkeyのマウス座標

解決


エイチ  2023-09-14 13:05:35  No: 151092

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


Moe  2023-09-14 22:17:41  No: 151094

私は次の様にしています。外していましたら、ごめんなさい。
フォーム起動時にフォームの幅を取得します。同時にスケールを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 09:41:20  No: 151095

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

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

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


mam  2023-09-15 09:44:34  No: 151096

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


mam  2023-09-15 09:46:13  No: 151097

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


エイチ  2023-09-15 12:05:20  No: 151099

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


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








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