![]() |
TAlignLayout.Top die Reihenfolge stimmt nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich erstelle Rectangle und fülle sie mit einem Label. Beides soll in einer Srcollbox am oberen Rand angeordnet werden. Im Label steht nur eine laufende Nummer. Den Rectangle weise ich TAlignLayout.Top zu, aber sie stehen nicht in der Reihenfolge wie sie erstellt wurden (siehe Bild). Mit folgendem Code erstelle ich die Rectangle und ordne sie der Scrollbox zu:
Delphi-Quellcode:
Die neuen Rectangle werden alle nach dem ersten Rectangle angeordnet, leider nicht nach der zuletzt hinzugefügten.var Anzahl : Integer = 0; //globale Variable für die Nummerierung der Rectangle procedure TbfDeckblattForm.Button2Click(Sender: TObject); var rec : TRectangle; L : TLabel; begin ScrollBox1.BeginUpdate; rec := TRectangle.Create(bfDeckblattForm); ScrollBox1.AddObject(rec); rec.Parent := ScrollBox1; rec.Align := TAlignLayout.Top; L := TLabel.Create(rec); rec.AddObject(L); Anzahl := Anzahl + 1; l.Text := anzahl.ToString; l.Align:= TAlignLayout.Left; l.Margins.Left := 5; ScrollBox1.EndUpdate; end; Ich habe die Version Rio 10.3.2, Ich bin mir nicht sicher, aber bei der Vorgänger-Version Rio 10.3.1 ist mir dieses Verhalten nicht aufgefallen. Hat jemand eine Idee, was ich falsch mache? Gruß Pascal |
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
Probier mal die Eigenschaft Top passend zu setzen (also unter das zuletzt erstellte), bevor du das Align setzt.
Ich plage mich in der VCL und Panels grade mit was ähnlichem rum, und wenn ich die Position vorher passend setze, erhalte ich das gewünschte Ergebnis. |
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
Danke für Deine Antwort,
leider verstehe ich nicht, was Du mit Top passend setzen meinst. |
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
Zitat:
|
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
jetzt habe ich es verstanden, glaube ich jedenfalls, ich habe folgendes gemacht:
Delphi-Quellcode:
Zwei Zeilen habe ich eingezogen, aber mit dem gleichen Ergebnis. Wenn ich alle drei zusammen setze, also erst auf Bottom, dann auf None und zum Schluss auf Top, dann verweigert der Compiler offensichtlich seinen Dienst.
procedure TbfDeckblattForm.Button2Click(Sender: TObject);
var rec : TRectangle; L : TLabel; begin ScrollBox1.BeginUpdate; rec := TRectangle.Create(bfDeckblattForm); ScrollBox1.AddObject(rec); rec.Parent := ScrollBox1; [B]// rec.Align := TAlignLayout.Bottom; rec.Align := TAlignLayout.None;[/B] rec.Align := TAlignLayout.Top; Warum werden die markierten Zeilen nicht fett gedruckt? |
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
Äh, nein. Eher so:
Delphi-Quellcode:
ScrollBox1.BeginUpdate;
rec := TRectangle.Create(bfDeckblattForm); ScrollBox1.AddObject(rec); rec.Parent := ScrollBox1; // --------- rec.Top := 42; // oder was sehr, sehr hohes, // oder besser direkt der Wert, an dem es erscheinen sollte // ----------- rec.Align := TAlignLayout.Top; |
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
Hallo,
das mit dem Align war schon immer so ... Du musst alle Elemente unsichtbar machen. Und danach wieder alle in der richtigen Reihenfolge sichtbar machen. Die Erstell-Reihenfolge wurde noch nie berücksictigt. |
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo es funktioniert:
Delphi-Quellcode:
Ich habe den Position.y Wert hochgesetzt und es sieht so aus wie ich es gerne hätte (siehe Anhang).
ScrollBox1.BeginUpdate;
rec := TRectangle.Create(bfDeckblattForm); ScrollBox1.AddObject(rec); rec.Parent := ScrollBox1; // rec.Align := TAlignLayout.Bottom; rec.Align := TAlignLayout.None; rec.Position.Y := 1000; rec.Align := TAlignLayout.Top; Als nächstes werde ich den Tipp mit den visible := false ausprobieren. Danke für die Hilfe. Gruß Pascal |
AW: TAlignLayout.Top die Reihenfolge stimmt nicht
Also für die VCL hätte ich so etwas
Delphi-Quellcode:
Das müsste für FMX ähnlich funktionieren. Dort gibt es allerdings mehr Alignment-Arten die man berücksichtigen muss. Das Prinzip ist aber gleich.
unit AlignChildren.Vcl;
interface uses System.Types, Vcl.Controls; type WinControlHelper = class helper for TWinControl public procedure AlignChildren(ARecursive: Boolean = false); end; implementation { WinControlHelper } procedure WinControlHelper.AlignChildren(ARecursive: Boolean); var remainingArea: TRect; childControlIndex: Integer; currentControl: TControl; newTop, newLeft: Integer; reduce: Integer; begin remainingArea := Self.ClientRect; remainingArea.Inflate(-Padding.Left, -Padding.Top, -Padding.Right, -Padding.Bottom); for childControlIndex := 0 to Self.ControlCount - 1 do begin currentControl := Self.Controls[childControlIndex]; if not currentControl.Visible then Continue; newLeft := currentControl.Left; newTop := currentControl.Top; case currentControl.Align of alTop: begin newTop := remainingArea.Top; if currentControl.AlignWithMargins then Inc(newTop, -currentControl.Margins.Top); reduce := currentControl.Height; if currentControl.AlignWithMargins then Inc(reduce, currentControl.Margins.Top + currentControl.Margins.Bottom); remainingArea.Inflate(0, -reduce, 0, 0); end; alBottom: begin newTop := remainingArea.Bottom - currentControl.Height; if currentControl.AlignWithMargins then Inc(newTop, -currentControl.Margins.Bottom); reduce := currentControl.Height; if currentControl.AlignWithMargins then Inc(reduce, currentControl.Margins.Top + currentControl.Margins.Bottom); remainingArea.Inflate(0, 0, 0, -reduce); end; alLeft: begin newLeft := remainingArea.Left; if currentControl.AlignWithMargins then Inc(newLeft, -currentControl.Margins.Left); reduce := currentControl.Width; if currentControl.AlignWithMargins then Inc(reduce, currentControl.Margins.Left + currentControl.Margins.Right); remainingArea.Inflate(-reduce, 0, 0, 0); end; alRight: begin newLeft := remainingArea.Right - currentControl.Width; if currentControl.AlignWithMargins then Inc(newLeft, -currentControl.Margins.Right); reduce := currentControl.Width; if currentControl.AlignWithMargins then Inc(reduce, currentControl.Margins.Left + currentControl.Margins.Right); remainingArea.Inflate(0, 0, -reduce, 0); end; end; currentControl.Left := newLeft; currentControl.Top := newTop; if ARecursive and (currentControl is TWinControl) then TWinControl(currentControl).AlignChildren(ARecursive); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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