Positionierung von Controls( Anchor, Autosize etc)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Positionierung von Controls( Anchor, Autosize etc)

Beitrag von charlytango »

scheninbar bin ich trotz Lesen von Anchor-Docs et.al nicht in der Lage die Einstellungen zu finde die ich brauche
Screenshot 2021-04-27 181406.png
Screenshot 2021-04-27 181406.png (1.62 KiB) 1917 mal betrachtet
was muss ich einstellen damit das markierte Control sich so verhält dass es bis zur rechten Seite der parent-Komponente geht und sich automatisch bei Größenänderungen anpasst?

Mit Anchor scheint es nicht zu klappen -- ach ja, ich kann auch keinen Anchor-Editor verwenden weil die Controls zur Laufzeit erzeugt werden.

Muster: Project Options in der IDE

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von wp_xyz »

charlytango hat geschrieben:
Di 27. Apr 2021, 18:29
ach ja, ich kann auch keinen Anchor-Editor verwenden weil die Controls zur Laufzeit erzeugt werden.
Was zur Designzeit funktioniert, muss auch zur Laufzeit funktionieren!

Um den Anker-Editor zur Laufzeit nachzubauen, verwendest du die AnchorSide* Properties, wobei * für Left, Top, Right und Bottom steht, und jede AnchorSide zwei Unter-Properties Control und Side (das Control und die Seite, woran das zu verankernde Control hängt). Side hat die Werte asrTop, asrBottom und asrCenter, wobei diese - und das ist etwas unschön - auch für die horizontale Verankerung verwendet werden und dann für links-rechts-Mitte stehen: wenn du also etwas mit der rechten Seite eines anderen Controls verankern willst, musst du Side trotzdem auf asrBottom setzen, obwohl es sprachlich deutlich daneben ist.

Im folgenden Beispiel werden ein Label und ein TFileNameEdit zur Laufzeit erzeugt und horizontal passend nebeneinander positioniert, wobei sich bei Größenänderung des Formulars die Breite des FileNameEdit anpasst:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  lbl: TLabel;
  ed: TFilenameEdit;
begin
  lbl := TLabel.Create(self);
  lbl.Caption := 'File name:';
  lbl.BorderSpacing.Left := 6;
  lbl.AnchorSideLeft.Control := Self;
  lbl.Parent := self;

  ed := TFileNameEdit.Create(self);
  ed.Parent := self;

  ed.AnchorSideTop.Control := self;
  ed.AnchorSideRight.Control := self;
  ed.AnchorSideRight.Side := asrBottom;
  ed.AnchorSideLeft.Control := lbl;
  ed.AnchorSideLeft.Side := asrBottom;
  ed.Anchors := [akLeft, akRight, akTop];
  ed.BorderSpacing.Around := 6;

  lbl.AnchorSideTop.Control := ed;
  lbl.AnchorSideTop.Side := asrCenter;
end; 
Statt AnchorSideLeft kann man auch AnchorSide[akLeft] verwenden, usw.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von charlytango »

merci vielmals...das lässt meine grauen Zellen wieder mal rauchen ;)

Habs gerade getestet -- perfekt.
nun muss ich das noch in meinen Code bringen

danke nochmal

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von wp_xyz »

charlytango hat geschrieben:
Di 27. Apr 2021, 19:25
das lässt meine grauen Zellen wieder mal rauchen ;)
Hier noch etwas Zunder: https://wiki.freepascal.org/Anchor_Sides

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von charlytango »

wp_xyz hat geschrieben:
Di 27. Apr 2021, 19:48
Hier noch etwas Zunder: https://wiki.freepascal.org/Anchor_Sides
Hatte erst jetzt die Zeit mich damit zu beschäftigen. Doku scheint es da wenig dazu zu geben.
Hab https://www.youtube.com/watch?v=neigk9Pt21o gefunden und gesehen was geht, aber irgendwie stecke ich scheinbar in alten Mustern fest, ich hab nicht begriffen warum irgendwas geht oder nicht geht.
Die Anchor scheinen mächtig zu sein aber irgendwie kapiere ich es nicht :shock:

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von wp_xyz »

Schade, dass das Video ohne Ton ist, da wird eigentlich alles gezeigt...

angsam zum Mitschreiben:
  • Öffne den Anker-Editor und schiebe ihn zur Seite, dass er nicht stört aber immer sichbar bleibt.
  • Setze ein TLabel und ein TEdit aufs Forumular
  • Klicke das Label an
  • Wähle im Anker-Editor, Combobox in "Linke Verankerung", das Formular aus - das bedeutet: Die linke Seite des Labels wird mit dem Formular verankert.
  • Der Ankergeber (das Formular) hat drei Verankerungspunkte: links, Mitte, rechts, symbolisiert durch die drei Buttons unter der Combobox. Ist der linke Button geklickt, ist die linke Seite des Label mit den linken Rand des Formulars verbunden, genauso wie im Button-Icon dargestellt. Beim rechten Button ist der linke Rand des Labels (wegen "Linke Verankerung") mit dem rechten Rand des Formulars verbunden - nun landet das Label außerhalb des Formulars, was nicht gewünscht ist -- zurück auf den linken Button! Der mittlere Button fällt etwas aus der Reihe, er bedeutet immer "Zentrierung" - das Label wird komplett im Formular zentriert.
  • Nun zum Edit: Die linke Seite des Edit soll am rechten Rand des Labels anschließen.
  • Markiere das Edit
  • In der Combobox "Linke Verankerung" wähle das Label. Bei den Buttons darunter, nimm den rechten, denn der linke Rand des Edit soll am rechten Rand des Labels folgen.
  • Das Edit soll rechts bis zum Formular reichen. Bei markiertem Edit wähle in der Combobox "Rechte Verankerung" das Formular, und bei den Buttons darunter nimm den rechten, um den rechten Rand des Edit an den rechten Rand des Formulars zu heften.
  • Mit den BorderSpacing-Werten in der Mitte kann man die Abstände zwischen angrenzenden Controls regeln.
  • Analog geht man auch bei der vertikalen Positionierung vor.
  • Ziel soll sein, dass man kein Control mehr mit der Maus verschieben kann.
  • Wenn du jetzt das Formular auf "AutoSize=true" setzt, wird die Formulargröße zur Laufzeit dem durch Label und Edit vorgegebenen Platzbedarf angepasst. (Sind in diesem Schritt noch unverankerte Controls vorhanden, werden sie in die linke/obere Ecke verschoben, was mächtig für Chaos sorgt.)
  • Zusammengefasst: Je nachdem, welche Seite des Controls man verankern will, wählt man die "linke/rechte/obere/untere Verankerung". In der Combobox wählt man das Control, an dem, und mit den Buttons darunter, die Seite dieses Controls, an der verankert werden soll. Mit der Checkbox wird der Anker aktiviert.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von charlytango »

wp_xyz hat geschrieben:
Mo 10. Mai 2021, 11:46
Schade, dass das Video ohne Ton ist, da wird eigentlich alles gezeigt...
ooutch -- vielen Dank für deine Mühe, das hat mich dem Verständnis etwas näher gebracht -- von Perfektion noch keine Spur aber zumindest mal ein erstes Ergebnis. Nochmal Danke für die Ausführlichkeit.

Ich erzeuge nun die Controls wie geplant auf einer TScrollbox. Die widersetzt sich aber dem Anchor-Konzept bzw ignoriert es.
Die Controls werden sauber erzeugt und offensichtlich auch über den sichtbaren bereich hinaus (was ja der Sinn der TScrollbox zu sein scheint). Nur reagiert sie darauf nicht mit einem Scrollbalken rechts. Der flackert zwar, bleibt aber unsichtbar.

Hab ich da einfach das falsche Control mit dem ich arbeite, fehlt noch was in meinem Code oder stimmt was mit der TScrollbox nicht? grübel

Falls du magst: Beispiel liegt bei (der Button "Edit" erzeugt per Anchor positionierte Controls und reagiert auch auf den Layout-Radiobutton -- einfach mehrmals clicken und schon ist die Scrollbox voll)
Dateianhänge
project1.zip
dynamisch erzeugte Controls mit Positionierung mittes Anchor
(127.8 KiB) 72-mal heruntergeladen

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von wp_xyz »

Ich verstehe jetzt nicht, was du hier genau zeigen willst, aber es fällt mir auf dass in FormatControls kein vertikaler Anker aktiviert wird, dazu müsstest du auch akTop und/oder akBottom mit in die Anchors aufnehmen. Wenn du normalerweise ein Control aufs Formular klickst, sind akLeft und akTop gesetzt, d.h. der linke und obere Rand behält konstanten Abstand zur entsprechenden Seite des Formulars. Wenn du akTop weglässt, ändert sich bei einer Größenänderung des Formulars sowohl der Abstand nach unten als auch nach oben. Das kann man zwar für manche Effekte verwenden, aber normalerweise hat man eine oder beide Seiten mit festem Abstand zum Rand. Im Anker-Editor sind die Anchors die "Eingeschaltet"-Checkboxen. Sorry, ich bin darauf in meiner Beschreibung oben nicht deutlich genug eingegangen.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Positionierung von Controls( Anchor, Autosize etc)

Beitrag von charlytango »

wp_xyz hat geschrieben:
Mo 10. Mai 2021, 17:49
Ich verstehe jetzt nicht, was du hier genau zeigen willst, aber es fällt mir auf dass in FormatControls kein vertikaler Anker aktiviert wird,
ich wollte zeigen dass die TScrollbox nicht wie erwartet funktioniert.
Und mit deinem Einwand hast du auch gleich die Lösung serviert.
Wenn auch ein vertikaler Anker aktiviert wird, mag das die TScrollbox sehr und reagiert perfekt wie erwartet.
Danke, das war eine feine Lehrstunde ;)

Antworten