喫茶XRAYトップページ


[11213] 最近ハマった出来事(TRectangle等のAlignプロパティ)返信 削除
2017/6/10 (土) 23:16:55 Konnoya
こんばんは!
FireMonkeyで試行錯誤状態の私がハマった出来事を書きます。
マヌケな話です(汗

TLayout に 複数の TRectangle を 左寄せ で追加してたのですが、
IDE上で1つずつ Align = Left などと設定を行う事で、
操作した順番に左寄せで並ぶのですが、
コード上から動的生成を行って同様のAlignプロパティを設定しても
生成した順番に並ばない!?

【FMXコード】
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects,
  System.UIConsts, FMX.Layouts;

type
  TForm1 = class( TForm )
    procedure FormCreate     ( Sender : TObject );
    procedure CreateRectangle( Color : Integer; Align : TAlignLayout );
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate( Sender : TObject );

begin
  // Rectangleを左寄せで5個追加
  CreateRectangle( claBlue  , TAlignLayout.Left );    // 青
  CreateRectangle( claRed   , TAlignLayout.Left );    // 赤
  CreateRectangle( claGreen , TAlignLayout.Left );    // 緑
  CreateRectangle( claYellow, TAlignLayout.Left );    // 黄
  CreateRectangle( claPurple, TAlignLayout.Left );    // 紫
end;

procedure TForm1.CreateRectangle( Color : Integer; Align : TAlignLayout );

var
  RectAngle : TRectangle;

begin
  RectAngle             := TRectAngle.Create( Self );
  RectAngle.Parent      := Self;
  RectAngle.Fill.Color  := Color;
  RectAngle.Width       := 100;
  RectAngle.Align       := TAlignLayout.Left;
  RectAngle.Visible     := TRUE;
end;

end.

生成して並べた順番は、青、赤、緑、黄、紫のはずですが、
なぜか下の画像の様になります。

これを正しい順序に行うには、Positionプロパティの座標が鍵でした。
Alignプロパティを設定する前に、
TTAlignLayout.Left なら、右方向の位置に、
TAlignLayout.Top なら、下方向の位置に設定しておく事で解決できました。

【FMXコード】
  RectAngle             := TRectAngle.Create( Self );
  RectAngle.Parent      := Self;
  RectAngle.Fill.Color  := Color;
  RectAngle.Width       := 100;
  RectAngle.Position.X  := Integer( Align = TAlignLayout.Left ) * Self.Width;
  RectAngle.Position.Y  := Integer( Align = TAlignLayout.Top  ) * Self.Height;
  RectAngle.Align       := TAlignLayout.Left;
  RectAngle.Visible     := TRUE;

※ Mr.XRAY様、投稿番号11212は、途中で送信してしまいました。
  削除をお願いします。m(_ _)m



INCM/CMT
Cyclamen v3.82