У меня проблема с простотой в Delphi 10.1 с Firemonkey. При создании нового компонента (на основе TLayout, где находятся некоторые еще компоненты, такие как TDateEdits) Я хотел создать свойствоDelphi 10.1 Firemonkey - значения свойств при разработке компонентов
property EditDate_Position:TPosition read FDateEdits_Position write FDateEdits_PositionSet stored True;
где я объявил FDateEdits_Position как TPosition и FDateEdits_PositionSet является Функция 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-файле я вижу правильные значения.
Так что я должен делать? Я заметил, что это значение находится в начальной точке, когда выполняется конструктор, но через некоторое время после него (проверяется с помощью TTimer с интервалом = 1) - он принимает правильные значения.
Переопределение Процедура AfterConstruction не устраняет эту проблему, и мне нужно что-то с пуском (момент создания) с соответствующими значениями. И еще: не все имеет такое поведение. Я вижу, что свойства типа Boolean аналогичны типу TPosition, но свойство TBitmap работает правильно ...
Я думаю, что это результат TPosition.Create (PointF), но как создать это без установки этих значений по умолчанию во время выполнения?
procedure TTest.FDateEdits_PositionSet(Value:TPosition);
begin
FDateEdits_Position:=Value;
FDateEdits_Resize;
end;
FDateEdits_Resize перемещает некоторые компоненты (Self).
Существует код образца (но не то же самое, это упрощенно):
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 с интервалом. Тогда это значение правильно. Похоже, что после создания в Designtime RunTime создается снова - с заводскими настройками, но после построения значения отображаются из файла fmx (или что-то подобное) ... – Wojtek