Delphi 10.1のFiremonkeyで問題が発生しました。 私は FDateEdits_PositionとしてTPosition、及び FDateEdits_PositionSetが宣言されたプロパティDelphi 10.1 Firemonkey - コンポーネント構築時のプロパティ値
property EditDate_Position:TPosition read FDateEdits_Position write FDateEdits_PositionSet stored True;
を作成したい(一部はTDateEditsような別の構成要素であるTLayout、に基づいて)新しいコンポーネントを作成します関数FDateEdits_PositionSet(値:TPosition)。
成分の主コンストラクタは、コードから成る:
PointF.X:=10;
PointF.Y:=30;
FDateEdits_Position:=TPosition.Create(PointF);
だからオブジェクトインスペクタにEditDate_Positionこのプロパティがあり、私はこの値を変更することができます。しかし、なぜ - コンパイルして実行した後、この値はConstructorのように値にリセットされますか? 私が実行しているときにこれらの行を除外するために
If (csDesigning in ComponentState) then
begin
PointF.X:=10;
PointF.Y:=30;
FDateEdits_Position:=TPosition.Create(PointF);
end;
を使用しようとしましたが、プログラムがクラッシュ( FDateEditsが作成されません)。私はObject Inspectorを見ました - 値は正しくあり、それ以上です - .fmxファイルには適切な値があります。
どうすればいいですか?私はこの値がコンストラクタが実行されているときに開始点にあることに気づきましたが、少し後に(間隔= 1のTTimerでチェックされています)、適切な値をとります。
AfterConstructionプロシージャをオーバーライドするとこの問題は解決されず、適切な値で起動(作成時)する必要があります。その他:すべてがこの動作をしているわけではありません - ブール型のプロパティタイプはTPositionと似ていますが、TBitmapプロパティが正常に動作していることがわかります...
TPosition.Create )が、実行時にこれらのデフォルト値を設定せずにこれを作成する方法はありますか?
procedure TTest.FDateEdits_PositionSet(Value:TPosition);
begin
FDateEdits_Position:=Value;
FDateEdits_Resize;
end;
(SELF)のいくつかのコンポーネントを移動 FDateEdits_Resize。
サンプルコードがあります(が、同じではない、それが簡略化されています):
unit Layout1;
interface
uses
System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts,
FMX.StdCtrls, System.Types;
type
TLayout1 = class(TLayout)
private
{ Private declarations }
FBtn:TButton;
FPosition:TPosition;
procedure FPositionSet(Value:TPosition);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property BtnPosition:TPosition read FPosition write FPositionSet;
end;
procedure Register;
implementation
constructor TLayout1.Create(AOwner:TComponent);
var
PointF:TPointF;
begin
inherited Create(AOwner);
FBtn:=TButton.Create(Self);
FBtn.Parent:=Self;
FBtn.Stored:=False;
FBtn.Text:='Text';
PointF.X:=10;
PointF.Y:=10;
FPosition:=TPosition.Create(PointF);
FBtn.Position.Assign(FPosition);
end;
destructor TLayout1.Destroy;
begin
If FPosition<>nil then FPosition.Free;
If FBtn<>nil then FBtn.Free;
inherited;
end;
procedure TLayout1.FPositionSet(Value:TPosition);
begin
FPosition.Assign(Value);
FBtn.Position.Assign(Value);
end;
procedure Register;
begin
RegisterComponents('Samples', [TLayout1]);
end;
end.
しかし、私は気づいたことだけで任意の結果を持っていない
Layout11.BtnPosition.X:=50;
を呼び出し、ブレークラインコード内で動作しません(しかし、コンストラクタセクションの作品で...)
ポスト – Wojtek
の最後に追加がまだ動作しません。 TTimerにIntervalを追加する場合にのみ動作します。そして、この値は適切です。 Designtimeで作成した後、ランタイムが再度作成されているようですが、工場設定では、値はfmxファイル(または同様のもの)からマップされます。 – Wojtek