Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.653 Beiträge
 
Delphi 12 Athens
 
#11

AW: [FMX] Control.Height nicht änderbar

  Alt Gestern, 15:11
So, hab es jetzt mal mit einer Enterprise und mit allen installierten Compilern probiert.

Im Android das SetHeight zu debuggen, kann ich ja vergessen. (der Android-Debugger ist unzumutbar unbenutzbar),
aber da es auch im FormDesigner auftritt, hatte ich gehofft die IDE (FormDesigner) selbst debuggen zu können, bzw. was passiert, wenn ich dort ein Height im Property-Editor zuweise.

Es betrifft jedenfalls alle mobilen Platformen (Android und iOS),
während Windows und macOS nicht betroffen sind (Anzeige-Stil im FormDesigner).

Leider ließ sich die FMX.Controls.pas nicht debuggen. (keine Haltepunkte und so)
Wollte bei TControl.SetHeight einsteigen, aber da ist nicht viel zu sehen.

Delphi-Quellcode:
procedure TControl.SetHeight(const Value: Single);
begin
  SetSize(FSize.Width, Value, False);
end;

procedure TControl.SetSize(const AWidth, AHeight: Single; const APlatformDefault: Boolean);
begin
  if DoSetSize(FSize, APlatformDefault, AWidth, AHeight, FLastWidth, FLastHeight) then
    HandleSizeChanged;
end;

function TControl.DoSetSize(const ASize: TControlSize; const NewPlatformDefault: Boolean;
  ANewWidth, ANewHeight: Single; var ALastWidth, ALastHeight: Single): Boolean;
var
  NewSize: TSizeF;
begin
  NewSize.Width := System.Math.Max(0, ANewWidth);
  NewSize.Height := System.Math.Max(0, ANewHeight);
  Result := not SameValue(NewSize.Width, ASize.Width, TEpsilon.Position) or
    not SameValue(NewSize.Height, ASize.Height, TEpsilon.Position);
  if Result then
    Repaint;
  ALastWidth := ASize.Width;
  ALastHeight := ASize.Height;
  ASize.SetSizeWithoutNotification(NewSize);
  ASize.SetPlatformDefaultWithoutNotification(NewPlatformDefault);
end;

procedure TControlSize.SetSizeWithoutNotification(const Value: TSizeF);
begin
  FSize.Width := Value.Width;
  FSize.Height := Value.Height;
  SetPlatformDefaultWithoutNotification(False);
end;

procedure TControlSize.SetPlatformDefaultWithoutNotification(const Value: Boolean);
begin
  FUsePlatformDefault := Value;
end;
Allerdings kann das jetzt auch mehrfach überschrieben sein
und irgendwie/irgendwo hängt sich dann noch das Styling mit rein
und ...

Beim Letzten geht es dann bissl rund
Delphi-Quellcode:
procedure TControl.HandleSizeChanged;
begin
  UpdateSmallSizeControl;
  if [csLoading, csReading] * ComponentState <> [csLoading, csReading] then
    Resize
  else
    Include(FDelayedEvents, TDelayedEvent.Resize);
  InternalSizeChanged;
  if not FAnchorMove then
  begin
    UpdateExplicitBounds;
    UpdateAnchorRules(True);
  end;
  if RotationAngle <> 0 then
    MatrixChanged(Self);
  if [csLoading, csReading] * ComponentState <> [csLoading, csReading] then
    DoResized
  else
    Include(FDelayedEvents, TDelayedEvent.Resized);
end;
Hach, was wäre das, wenn man sich da einfach mit'm Debugger reinhängen und schauen könnte, ab wann sich das plötzlich ändert ....
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 15:14 Uhr)
  Mit Zitat antworten Zitat