Почему доступ к элементам управления fmx "height" в "DoRealign" приводит к сбою конструктора Delphi? - PullRequest
0 голосов
/ 09 мая 2019

Написание собственного элемента управления ползунком в Firemonkey, который прекрасно работает во время выполнения, но часто приводит к сбою конструктора.Я отследил падение до доступа к элементам управления Height, вызванным из моего переопределенного «DoRealign».

Он не падает все время, и частое нажатие «ОК» позволит мне продолжить проектирование формы, но никогдавылетает во время выполнения.Моя единственная работа - просто выйти из этой процедуры при условии «csDesigning in ComponentState».Мне любопытно узнать, где я ошибаюсь с моим дизайном компонентов.

procedure TLFFader.DoRealign;
var
  vI, T: TFmxObject;
  NewSize: Single;
begin
  inherited;
  if not FDisableAlign then
  begin
    FDisableAlign := True;
    try
      T := FindStyleResource('vtrack');
      if Assigned(T) and (T is TControl) then
        TControl(T).Visible := True;
      if Assigned(T) and (T is TControl) and (Max > Min) then
      begin
        vI := FindStyleResource('vindicator');

        if Assigned(vI) and (vI is TControl) then
        begin
          NewSize := (TControl(T).Height -
                      TControl(T).Padding.top -
                      TControl(T).Padding.bottom -
                      TControl(vI).Margins.top -
                      TControl(vI).Margins.bottom) * FValueRange.RelativeValue;
          TControl(vI).Height := Round(NewSize);
          TControl(vI).Visible := TControl(vI).Height > 2;
        end;
      end;

      if assigned(FThumb) then
      begin
        FThumb.Width := Width;
        FThumb.Height := FThumbHeight;
        FThumb.Position.X := 0;
        FThumb.Position.Y := (Height - FThumbHeight) * (1-FValueRange.RelativeValue);
        FThumbText.Text := FPercentPrefix + IntToStr(Round(FValueRange.RelativeValue * 100))+'%';
      end;

    finally
      FDisableAlign := False;
    end;
  end;
end;
...