AGB  ·  Datenschutz  ·  Impressum  







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

Collapsible Margins

Ein Thema von mael · begonnen am 2. Jul 2019 · letzter Beitrag vom 7. Jul 2019
Antwort Antwort
Benutzerbild von mael
mael

Registriert seit: 13. Jan 2005
391 Beiträge
 
Delphi XE3 Professional
 
#1

Collapsible Margins

  Alt 2. Jul 2019, 05:32
Hallo,

Es gibt seit einiger Zeit die Margins-Eigenschaft für jedes Steuerelement, aber zwei benachbarte Steuerelement werden ihre Margins nicht verschmelzen, sondern addieren.

Bei CSS gibt es collapsible margins, zumindest für vertikal angeordnete Block-Element.

Auf Delphi übertragen:

Nun möchte ich horizontal z.B. 3 Steuerelemente ausrichten die alle den gleichen Abstand zueinander haben. Dafür setze ich Margins.Left und Margins.Right auf jeweils 10 und aktiviere AlignWithMargins. Das funktioniert gut für die Ränder, also dort wo die Steuerelemente auf die Fensterränder treffen. Der Leerraum zwischen zwei benachbarten Steuerelementen (A und B) wird nun aber 20, da sich A.Margins.Right und B.Margins.Left addieren, anstatt zu 10 zu verschmelzen.

Man kann natürlich rumpfuschen, und nur Margins.Left auf 10 setzten (Margins.Right aber auf 0), und dann beim letzten Steuerelement in der Liste Margins.Right auf 10 setzen. Aber der Punkt ist dass die Ausrichtung automatisch funktionieren soll, auch wenn die Reihenfolge der Steuerelemente sich ändert.

Hat jemand einen Weg gefunden dass in der VCL zu erreichen?

Mein Ansatz war TMargins zu überschreiben (und dann den Steuerelementen zuzuweisen).

Aber wie findet man heraus was das benachbarte Steuerelement sein wird, während des Alignments?
HxD, schneller Hexeditor:
http://mh-nexus.de/hxd
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Collapsible Margins

  Alt 2. Jul 2019, 12:37
Hallo,

Es gibt seit einiger Zeit die Margins-Eigenschaft für jedes Steuerelement, aber zwei benachbarte Steuerelement werden ihre Margins nicht verschmelzen, sondern addieren.

Bei CSS gibt es collapsible margins, zumindest für vertikal angeordnete Block-Element.

Auf Delphi übertragen:

Nun möchte ich horizontal z.B. 3 Steuerelemente ausrichten die alle den gleichen Abstand zueinander haben. Dafür setze ich Margins.Left und Margins.Right auf jeweils 10 und aktiviere AlignWithMargins. Das funktioniert gut für die Ränder, also dort wo die Steuerelemente auf die Fensterränder treffen. Der Leerraum zwischen zwei benachbarten Steuerelementen (A und B) wird nun aber 20, da sich A.Margins.Right und B.Margins.Left addieren, anstatt zu 10 zu verschmelzen.

Man kann natürlich rumpfuschen, und nur Margins.Left auf 10 setzten (Margins.Right aber auf 0), und dann beim letzten Steuerelement in der Liste Margins.Right auf 10 setzen. Aber der Punkt ist dass die Ausrichtung automatisch funktionieren soll, auch wenn die Reihenfolge der Steuerelemente sich ändert.

Hat jemand einen Weg gefunden dass in der VCL zu erreichen?

Mein Ansatz war TMargins zu überschreiben (und dann den Steuerelementen zuzuweisen).

Aber wie findet man heraus was das benachbarte Steuerelement sein wird, während des Alignments?
Ich mach das so: Margins.Left = 5, Margins.Right = 5, Padding.Left und Padding.Right des Parents = 5. Wenn man es nur mit den Margins macht muss man das erste oder letzte Control gesondert behandeln, oder sich eine custom Parent (panel oder so) schnitzen, der das Alignment per Kode übernimmt. Für ein Control selbst sehe ich keine (einfache) Möglichkeit, herauszufinden, wo in der Positionierungssequenz es sich befindet.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Collapsible Margins

  Alt 4. Jul 2019, 08:10

Man kann natürlich rumpfuschen, und nur Margins.Left auf 10 setzten (Margins.Right aber auf 0), und dann beim letzten Steuerelement in der Liste Margins.Right auf 10 setzen.
Und alle Steuerelemente in ein Panel packen mit Margins.Right := 10; ?

Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von mael
mael

Registriert seit: 13. Jan 2005
391 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Collapsible Margins

  Alt 6. Jul 2019, 16:14
Und alle Steuerelemente in ein Panel packen mit Margins.Right := 10; ?
Zum Beispiel. Aber der linke Abstand würde dann fehlen.

Für ein Control selbst sehe ich keine (einfache) Möglichkeit, herauszufinden, wo in der Positionierungssequenz es sich befindet.
Nach längerem Studium vom Delphi-Quelltext, ist mir aufgefallen dass alle Layout-Panel sich auf die CM_CONTROLLISTCHANGING Message verlassen und dann intern eine Liste verwalten.
Für ein Grid-Panel wäre dann z.B. die Zuordnung von Listen-Index zu Spalte/Zeile mit einer Art mod/div-Rechnung erledigt, als Pseudocode:
Code:
Row = Index div ColsPerRow;
Col = Index mod ColsPerRow;
Danke für die Antworten.

Ich habe mich entschieden in einem Descendant von TCustomControl das Layout zu übernehmen, analog zu TGridPanel und ähnlichen Steuerelementen.

Ist für meinem konkreten Fall wohl das Einfachste. Etwas schade dass die VCL das nicht einfacher macht. Aber WPF und CSS sind da auch umständlich, auch wenn es da zumindest "dirty hacks" gibt.
HxD, schneller Hexeditor:
http://mh-nexus.de/hxd

Geändert von mael ( 6. Jul 2019 um 16:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Collapsible Margins

  Alt 6. Jul 2019, 23:40
Peter hatte doch schon die Lösung beschrieben:
Margins.Left = 5, Margins.Right = 5, Padding.Left und Padding.Right des Parents = 5.
Damit haben die Controls einen Abstand von 10 zueinander und auch zu den Rändern. Notfalls kann man auch noch ein TPanel als Parent dazwischen legen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von mael
mael

Registriert seit: 13. Jan 2005
391 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Collapsible Margins

  Alt 7. Jul 2019, 18:30
Peter hatte doch schon die Lösung beschrieben:
Margins.Left = 5, Margins.Right = 5, Padding.Left und Padding.Right des Parents = 5.
Damit haben die Controls einen Abstand von 10 zueinander und auch zu den Rändern. Notfalls kann man auch noch ein TPanel als Parent dazwischen legen.
Das Problem ist dass ich für jedes Control die Abstände eigenständig ausdrücken will, und nicht den Parent einbeziehen will um Ausgleichsrechnungen manuell vorzunehmen, sonst muss ich wieder eine globale Routine schreiben die alles miteinander abgleicht.

Für das Beispiel würde es funktionieren, aber es sind nicht immer 10 Pixel zwischen allen Controls und dem Fensterrand. Es kann im allgemeinen Fall variieren, und dann muss man wieder wissen welches Control wohinkommt, damit man das Parent.Padding richtig anpasst. Man muss also immer abgleichen mit allen anderen Controls/Parent um zu sehen was man korrigieren muss.
HxD, schneller Hexeditor:
http://mh-nexus.de/hxd
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Collapsible Margins

  Alt 7. Jul 2019, 20:22
Ist XE3 deine aktuelle Delphi-Version?

In neueren gibt es das TRelativePanel mit ein paar interessanten Möglichkeiten zur Positionierung der Controls.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz