AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[FMX] Control.Height nicht änderbar

Ein Thema von himitsu · begonnen am 28. Aug 2025 · letzter Beitrag vom 29. Aug 2025
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.655 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
Benutzerbild von himitsu
himitsu

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

AW: [FMX] Control.Height nicht änderbar

  Alt Gestern, 18:19
Hab's geschafft die IDE zu debuggen.
ein eigenes Package, mit abgeleitetem FMX-TEdit und SetHeight überschrieben, mit einem DebugBreak. (im Windows die IDE gedebugt, während der Formdesigner auf Stil=Android stand)

Hier ist der Schuldige, für die feste Höhe.
Delphi-Quellcode:
procedure TControl.SetSize(const AWidth, AHeight: Single; const APlatformDefault: Boolean);
begin
  if DoSetSize(FSize, APlatformDefault, AWidth, AHeight, FLastWidth, FLastHeight) then

function TPresentedControl.DoSetSize(const ASize: TControlSize; const NewPlatformDefault: Boolean;
  ANewWidth, ANewHeight: Single; var ALastWidth, ALastHeight: Single): Boolean;
var
  NewSize: TSizeF;
  OldSize: TSizeF;
begin
  if HasPresentationProxy then
  begin
    NewSize := TSizeF.Create(System.Math.Max(0, ANewWidth), System.Math.Max(0, ANewHeight));
    NewSize := RecommendSize(NewSize);

function TPresentedControl.RecommendSize(const AWishedSize: TSizeF): TSizeF;
begin
  Result := AWishedSize;
  if HasPresentationProxy then
    PresentationProxy.SendMessageWithResult<TSizeF>(PM_GET_RECOMMEND_SIZE, Result);

procedure TStyledPresentation.PMGetRecommendSize(var AMessage: TDispatchMessageWithValue<TSizeF>);
var
  Size: TSizeF;
begin
  if AdjustType in [TAdjustType.FixedSize, TAdjustType.FixedWidth] then
    Size.Width := AdjustSizeValue.Width
  else
    Size.Width := AMessage.Value.Width;

  if AdjustType in [TAdjustType.FixedSize, TAdjustType.FixedHeight] then <<<<<<<<<<<<
    Size.Height := AdjustSizeValue.Height <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  else
    Size.Height := AMessage.Value.Height;
Zu dem Zeitpunkt isses ein TFixedStyledEdit.

Scheinbar wird der Style und AdjustType erst später zugewiesen, noch nicht beim, bzw. kurz nach dem Laden der Form,
drum war es zum Zeitpunkt meines ShowMessage im Android wohl noch 0 (None),
aber grade eben, im SetHeight war es 3 (FixedHeight).


Irgendwas löst ein TStyledControl.ApplyStyle und TStyledControl.AdjustFixedSize aus, was im ChooseAdjustType zum FixedHeight führt.

Delphi-Quellcode:
procedure TStyledControl.AdjustFixedSize(const ReferenceControl: TControl);
var
  Link: TControl;
  LAdjustType: TAdjustType;
  LAdjustSizeValue: TSizeF;
begin
  if ReferenceControl <> Self then
    Link := ReferenceControl
  else
    Link := ResourceControl;

  if (Link <> nil) and not Link.FixedSize.IsZero then
  begin
    LAdjustSizeValue := Link.FixedSize;
    SetAdjustSizeValue(LAdjustSizeValue);

    LAdjustType := ChooseAdjustType(Link.FixedSize);
    if LAdjustType <> TAdjustType.None then
    begin
      SetAdjustType(LAdjustType);
      AdjustSize;
    end;
  end
  else
    SetAdjustType(TAdjustType.None);
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: [FMX] Control.Height nicht änderbar

  Alt Gestern, 20:11
PS: Den Designer bringt man leider nicht so dazu, es zu vergessen (abgesehn, dass 0 eh nicht neu in der DFM gespeichert und somit immer wieder vergessen wird)

aber zur Laufzeit
  • entweder manuell in die DFM geschrieben
    Delphi-Quellcode:
    object Edit1: TEdit
      ...
      FixedHeight = 0
      Size.Height = 15.000000000000000000
  • oder ins OnCreate der Form
    Delphi-Quellcode:
    Edit1.FixedSize := TSize.Create(0, 0);
    Edit1.Size.Height := 12;
Aber wirlich schön sind diese Lösungen auch nicht.


Ich konnte aber noch nicht rausfinden, wo dieses FixedHeight her kommt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.803 Beiträge
 
Delphi 12 Athens
 
#14

AW: [FMX] Control.Height nicht änderbar

  Alt Gestern, 22:23
Hast du das XmlDoc zu ChooseAdjustType gesehen?
Zitat:
Select fixed size adjust type based on FixedSize in ResourceLink
Die Einstellung wird offenbar aus dem aktuellen Style genommen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz