AGB  ·  Datenschutz  ·  Impressum  







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

Panel Zentrieren...

Ein Thema von Delbor · begonnen am 2. Mai 2021 · letzter Beitrag vom 5. Mai 2021
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Panel Zentrieren...

  Alt 4. Mai 2021, 13:51
Hi zusammen
Zuerst mal recht vielen Dank für eure vielen Antworten!
Andere spezille Ausrichtungkomponenten hast du auch mal ausprobiert?

Suche mal in der Komponenten nach Dingen mit "Panel" im Namen.
TGridPanel, TFlowPanel, TRelativePanel, ...
Ja,danke. Habe ich, bis auf TRelativpanel: Letzteres hab ich mir nur mal die Demo angesehen, während ich nach einer solchen suchte:TGridpanel, und von TFlowPanel habe ich auch eine Demo durchgearbeitet. Vielleicht mit gewissen Nuancen hab ich überall das selbe Problem: alle kleben standardmässig immer in Left.
Bei TGridpanel habe ich keinen Wert für den Abstand zischen zwei Controls gefunden, bei TFlowpanel ist es wohl mehr oder weniger dasselbe.

Wäre das eine Möglichkeit?
Delphi-Quellcode:
...
  case AMonth of
    1.. 6: FParentCtrl := PnlSixMonts1;
    7..12: FParentCtrl := PnlSixMonts2;
  end;
  FParentCtrl.Padding.Left := GetParentControlPostion(FParentCtrl);
...
Hab ich bereits so umgesetzt, steht so korrigiert aber nicht in der bereitgestellten *.pas. Was da (auch bei mir) noch fehlt: FParentCtrl hat von 1..6 einen andern Wert als von 7...12, wird also die ersten 6 mal überschrieben.

Bei solchen komplexeren Positionierungen würde ich das lieber selbst berechnen, also keine Aligns, Paddings und Margins benutzen.
Das wird insgesamt schneller sein und Du hast keine unübersichtlichen gegenseitigen Beeinflussungen.
Du kannst gezielt gewünschte Abstände einberechnen und die z.B. auch verringern, falls der Platz etwas knapper wird.
Auch das Zentrieren horizontal und vertikal ist kein Problem.

Natürlich musst Du dafür eine Funktion schreiben, aber das ist ein einmaliger Aufwand.
Aufrufen musst Du sie einmal bei der Initialisierung und dann im OnResize.

Dann hast Du alles selbst in der Hand und musst nicht mit Überraschungen der VCL umgehen.[/QUOTE]


Grundsätzlich stimme ich dir zu. Eine Besonderheit von Align ist zB., dass sich eine Komponente, die alLeft ausgrichtet werden soll, vor eine alLeft ausgerichtete Komponente schiebt. Bei mir kann das dann plötzlich heissen, dass der Februar vor dem Januar kommt...
Aber da sind auch die Werte, die ich zur Laufzeit ermittle und die den sichtbaren Panels total wiedersprechen.
Im "untersten" Frame, dem FDayNumberFrame, sind keinerlei Margins oder Paddings gesetzt: das Ding muss mit absolut minimalem Platz auskommen.
Ansonsten müsste ich mir das nochmal genau vornehmen...

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: Panel Zentrieren...

  Alt 4. Mai 2021, 14:05
Wenn ich was links anordnen will, aber nicht ganz links, sondern rechts neben dem letzten ganz links, helfe ich mir in der Art:
Delphi-Quellcode:
Panel.Align := alRight; // Schiebt erstmal nach ganz rechts.
Panel.Align := alLeft; // Schiebt nun nicht nach ganz links, sondern rechts neben das "letzte" der links angeordeneten Elemente.

// oder:
Panel.Align := alLeft; // Schiebt nach ganz links.
Panel.Left := Parent.Width; // Verschiebt nach vielzuweit rechts, da aber Align = alLeft ist, wird daraus rechts neben dem "Letzten" links.

// oder:
Panel.Left := MaxInt; // Verschiebt nach vielzuweit rechts, da aber Align = alLeft ist, wird daraus rechts neben dem "Letzten" links.
Panel.Align := alLeft; // Schiebt nach ganz links. neben dem "Letzten" links.

// oder:
// In umgekehrter Reihenfolge einfügen.
// Zuerst das, was im Ergebnis am weitesten rechts sein soll.
// Dann das davor
// und dann das davor
// ...
// Hieße bei Dir also einfügen von
// Juni
// Mai
// April
// März
// Februar
// Januar
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Panel Zentrieren...

  Alt 4. Mai 2021, 15:31
Ja, beim GritPanel selber gibt es leider keinen Wert für den Zellenabstand.

Wenn die enthaltenen Komponenten kleiner als eine Zelle sind (nicht mit alClient eingepasst), dann zentrieren sie sich selbst.

Aber man könnte auch mit alClient und den Margins (AlighWithMargins=True nicht vergessen), an jeder Komponente, einen Abstand einstellen.
Entweder jeweils ein halber Abstand (lins X/2 und rechts X/2) an jeder Komponente oder blos einseitig an den Nachbarkomponenten (z.B. links X und rechts 0)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Mai 2021 um 15:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Panel Zentrieren...

  Alt 4. Mai 2021, 14:19
Eine Besonderheit von Align ist zB., dass sich eine Komponente, die alLeft ausgrichtet werden soll, vor eine alLeft ausgerichtete Komponente schiebt.
Da hilft ein einfacher Trick:
Element1.Left := 0;
Element2.Left := 1;
Element3.Left := 2;
usw usf.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Panel Zentrieren...

  Alt 4. Mai 2021, 16:13
Hi himitsu
Aber man könnte auch mit alClient und den Margins (AlighWithMargins=True nicht vergessen), an jeder Komponente, einen Abstand einstellen.
Entweder jeweils ein halber Abstand (lins X/2 und rechts X/2) an jeder Komponente oder blos einseitig an den Nachbarkomponenten (z.B. links X und rechts 0)
Soviel ich mich an meine Versuche mit dem Gridpanel zurückerinnere, hatte ich lange Zeit Paddingwerte vergeben, und diese Werte beeinflussten nicht nur den inneren Rand, sondern auch die Zwischenräume.
Ich muss mir das nochmal ansehen, aber wenn ichs richtig in Erinnerung habe: ohne Paddingwerte waren die Zwischenräume nur noch wenige Pixel, während die Aussenabstände innen (normalerweise das Padding) nicht null, aber auch nicht wirklich vorhanden zu sein schienen.
Wegen der fehlenden Werte der Zwischenräume konnte ich auch keine Aussenabstände errechnen, beziehungsweise das Gridpanel auf seinem Parent nicht einmitten.
Auch hier gilt: sobald ich das Gridpanel versuchte, einzumitten ((parent.width - Gridpanel.width) div 2)überlappte es links. Auch hier war offensichtich der Parent "kürzer" als das Gridpanel.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Panel Zentrieren...

  Alt 4. Mai 2021, 16:33
Vielleicht arbeitest Du manchmal noch fälschlicher Weise mit Width statt ClientWidth und kommst aus solchen Gründen nicht ganz zurecht...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Panel Zentrieren...

  Alt 4. Mai 2021, 20:06
Hi Stahli

Ein ShowMessage:
Zitat:
[Window Title]
Terminkalenderproject

[Content]
FDayNumberFrame.Width := 260
AParentCtrl.Width := 1314
AParentCtrl.ClientWidth := 1314
Widthtotal := 1560
FDayNumberFrame.Width := 260
GetParentControlPostion := -246

[OK]
und wie es zustande kommt:

Delphi-Quellcode:
function TPnlCalendarFrame.GetParentControlPostion(AParentCtrl : TPanel): integer;
  var Widthtotal : Word;
begin
  Widthtotal := (6 * FDayNumberFrame.Width);
  Result := (AParentCtrl.ClientWidth - Widthtotal);
  ShowMessage('FDayNumberFrame.Width := ' + InttoStr(FDayNumberFrame.Width) + slinebreak+
              'AParentCtrl.Width := ' + InttoStr(AParentCtrl.Width) + slinebreak+
              'AParentCtrl.ClientWidth := ' + InttoStr(AParentCtrl.ClientWidth) + slinebreak+
              'Widthtotal := ' + InttoStr(Widthtotal) + slinebreak+
              'FDayNumberFrame.Width := ' + InttoStr(FDayNumberFrame.Width) + slinebreak+
              'GetParentControlPostion := ' + InttoStr(Result));
end;
Hochinteressant dabei: Zeile2 und 3 aus der ShowMessage-Anweisung.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Panel Zentrieren...

  Alt 5. Mai 2021, 14:30
Hii zusammen

Ich glaube, ich habe den übeltäter gefunden der Basisframe...
Aber erstmal beim Create der Mainform:
Delphi-Quellcode:
procedure Ta.FormCreate(Sender: TObject);
   var i: integer; LEnvirontVariable: String;
begin
  Self.PnlCalendarFrame1.PnlCalendarPosition;
  Self.PnlCalendarFrame1.PnlSixMonths1Position;
  Self.PnlCalendarFrame1.PnlSixMonths2Position;
  Self.PnlCalendarFrame1.ChooseMonths;
end;
Da geschieht noch mehr, was aber mit dem aktuellen Thema nichts zu tun hat. In jedem Fall handelt essich um Test mit jeweilseigenen Objekten.
Weiter gehts mit den aufgerufenen Methoden:

Delphi-Quellcode:
procedure TPnlCalendarFrame.PnlCalendarPosition;
begin
  PnlCalendarPos.Left := 0;
  Top :=0;
// PnlCalendarPos.Width := PnlCalendarPos.Parent.ClientWidth;
  PnlCalendarPos.Width := Self.Width;
// PnlCalendarPos.Width := Self.ClientWidth;
end;
Als "Interessant" herausgestellt hat sich eigentlich die obige Prozedur. Ich habe hier abwechslungsweise Zeilen ausgeklammert, um deren "Wirksamkeit zu testen.

Delphi-Quellcode:
procedure TPnlCalendarFrame.PnlSixMonths1Position;
begin
  PnlSixMonts1.Left := 0;
  PnlSixMonts1.Top := 0;
  PnlSixMonts1.Width := 6*300; // Diese 300 sind der von Hand aufgerundeten
  PnlSixMonts1.Height := 174; // Wert FDayNumberFrame.Width (257)
end;

procedure TPnlCalendarFrame.PnlSixMonths2Position;
begin
  PnlSixMonts2.Left := 0;
  PnlSixMonts2.Top := PnlSixMonts1.Height;
// PnlSixMonts2.Width := PnlCalendarPos.ClientWidth;
  PnlSixMonts2.Width := PnlSixMonts2.Parent.ClientWidth;
  PnlSixMonts2.Height := 174;
end;
KalenderFrame 1.jpgKalenderFrame 2.jpg
Das sind die Ergebnisse mit allen möglichen Codevarianten

KalenderFrame 3 - Designverlängert.jpg
Und das ist das Ergebnis, wenn ich zur Designzeit alle Hilfsfenster (Objectinspektor etc) ausblende und die Arbeitsform über möglichst die ganze Bildschirmbreite aufziehe.Ich habe nicht alle Codeteile korrekt angepasst. Desshalb die Ungleichheiten.
Ich verstehe das jetzt mal so, dass ohne Tricks (künstlich zugewiesene Masse) eine Frameinstanz nie grösser sein kann, als der benutzte BasisFrame zur Entwurfszeit - grosser Bildschirm hin oder her.
Als ich hierdran gearbeitet habe, war mein Gedanke erstmal: ich brauch die ganzen Panels gar nicht mehr. Aber sie machens auch so einfacher...
Tia, und wies nun weitergeht, hab ich erstmal keine Ahnung. 2 Panels links und rechts, die die Differenz DesignzeitBreite zur LaufzeitBreite ausgleichen?
Ich habe hier alle Margins und Paddings entfernt, mit Ausnahme des Titelpanels. Ob das tatsächlich notwendig ist, muss die Zukunft zeigen. Ich denke mir eigentlich: alles, was innerhalb der Masse des Basisframes liegt, sollte machbar sein.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  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 23:45 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