Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ? (https://www.delphipraxis.net/157248-2-panels-sollen-sich-das-form-gleichmaessig-teilen-anchors.html)

hoika 5. Jan 2011 06:16

2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Hallo #,

wie schon gesagt.
2 Panels teilen sich horizontal das Form.
Vergrößere ich das Form, sollen beide Panels jeweils die halbe
Breite des Forms nutzen.

Geht sowas über ausschließliche Nutzung von Anchors ?

PS:
Mit FormResize klappt das natürlich.


Danke

Heiko

Namenloser 5. Jan 2011 06:35

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Nur mit Anchors geht imo ich nicht. Du könntest dir aber mal das Ereignis OnAlignPosition anschauen, damit müsste sich das realisieren lassen.

hoika 5. Jan 2011 07:04

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Hallo,

Danke.


Heiko

Deep-Sea 5. Jan 2011 09:06

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Oder man schaut sich TGridPanel an (erst seit neueren Delphi-Versionen dabei). :wink:

hoika 5. Jan 2011 10:11

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Hallo,

Kann das TGridPanel denn auch folgendes:

1/3 der Breite Panel 1
2/3 der Breite Panel 2

Antwort: ja, kann es ;)

Jetzt bräuchte ich das nur noch auch für D2007.


Heiko

WIng2005 18. Apr 2013 21:10

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Gemeinde,

ich greife mal dieses relative alte Thema noch einmal auf, da ich ein ähnliches Problem habe. Ich habe mal mein Vorhaben versucht vereinfacht darzustellen (siehe Anhang).
Wie kann ich erreichen, dass sich die 4 Panel (in meinem tatsächlichen Programm sind es 7) beim Vergrößern der Form nicht überschneiden, sich also an der Form und am Nachbarn ausrichten? Nur über den OI habe ich es irgendwie nicht hinbekommen.

Danke für jeden Tip!!

Edit: ich nutze die Dynamic Skin Pack - Komponenten, das Gridpanel scheidet also erstmal aus.

Aviator 18. Apr 2013 21:42

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Indem du die Breiten der einzelnen Panels berechnest und die dementsprechend setzt. Du hast eine Gesamtbreite und eine Anzahl von Panels, die in diese Breite reinpassen sollen.
Also einfache Mathematik. Über den OI geht das nicht. Du kannst höchstens die beiden äußeren Panels links bzw. rechts verankern.

Versuche es mal. Wenn du es nicht hinbekommst, meld dich nochmal hier.

PS.: Und vergiss deinen Quellcode nicht, da immer gern gesehen wird, wie der Ansatz war.

Volker Z. 18. Apr 2013 22:46

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

über den OI geht es nicht vollständig, ein klein wenig rechnen wirst Du schon müssen.

Ich kenne das Dynamic Skin Pack nicht (vermute aber, dass die enthaltenen Panels von TPanel ableiten), mit der Standard-VCL-Panel ginge folgendes, um dass, was an den Screenshots zu erkennen ist, zu erreichen:
  1. Lege ein Panel auf das Form (Parentpanel) entsprechende Eigenschaften setzen (Align oder Anchor)
  2. Setzte die Eigenschaft BorderWidth des Parentpanel auf einen entsprechenden Wert z. B. 10
  3. Lege die sieben Panels auf das Parentpanel
  4. Von links nach rechts die ersten sechs Panels mit Align alLeft, das letzte alClient
  5. Von links nach rechts die ersten sechs Panels mit AlignWithMargins True, das letzte AlignWithMargins False
  6. Von links nach rechts die ersten sechs Panels Margin.Bottom, Margin.Left, Margin.Top 0 und Margin.Right z. B. 10
und dann noch etwas Code
Delphi-Quellcode:
procedure TForm4.ParentPanelResize(Sender: TObject);
var
  w : Integer;
begin
  w := (ParentPanel.Width - 2 * ParentPanel.BorderWidth - 6 * Panel1.Margins.Right) div 7;

  Panel1.Width := w;
  Panel2.Width := w;
  Panel3.Width := w;
  Panel4.Width := w;
  Panel5.Width := w;
  Panel6.Width := w
end;
Dann sollten sich die Panels nicht überlappen und alle die gleiche Größe haben (Panel7 kann natürlich ein paar Pixel größer bzw. kleiner sein).

Es sieht zumindest so aus, als wäre es was Du erreichen möchtest (siehe Screenshots hier mit nur 4 Panels).

Gruß

p80286 19. Apr 2013 10:05

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Zitat:

Zitat von Aviator (Beitrag 1212065)
Indem du die Breiten der einzelnen Panels berechnest und die dementsprechend setzt. Du hast eine Gesamtbreite und eine Anzahl von Panels, die in diese Breite reinpassen sollen.
Also einfache Mathematik. Über den OI geht das nicht.

So und nur so weiß man was man hat.(im onResize des Form)

Zitat:

Zitat von Aviator (Beitrag 1212065)
Du kannst höchstens die beiden äußeren Panels links bzw. rechts verankern.

Das halte ich für überflüssig bzw. kontraproduktiv, da Du Oberflächengestaltung an zwei Orten OI/Programm vornimmst.

Gruß
K-H

Aviator 19. Apr 2013 21:24

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Zitat:

Zitat:

Zitat von Aviator (Beitrag 1212065)
Du kannst höchstens die beiden äußeren Panels links bzw. rechts verankern.

Das halte ich für überflüssig bzw. kontraproduktiv, da Du Oberflächengestaltung an zwei Orten OI/Programm vornimmst.

Gruß
K-H
Deshalb hab ich "höchstens" geschrieben ;)
Ich würds nämlich nicht machen.

WIng2005 23. Apr 2013 17:00

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Hallo zusammen,

Sorry für die späte Antwort, meine Festplatte hatte sich zwischenzeitlich entschieden, in den Festplattenhimmel aufzusteigen....:cry: Naja, so hatte ich wenigstens Grund für ne SSD :-D.

Danke erstmal für die Antworten. Ich hatte schon befürchtet, dass das Ganze nur via Berechnung laufen kann. Muss ich mich mal intensiver mit befassen. Dramatisch daran ist nur, dass die Panel auf einem Notebook angeordnet sind, 5 Seiten, verschiedene Komponenten. Naja, mal schauen, wie ich das per Funktion allgemein auf alle Seiten bringen kann.

Dank euch!

WIng2005 23. Apr 2013 21:58

AW: 2 Panels sollen sich das Form gleichmäßig teilen -> Anchors ?
 
Liste der Anhänge anzeigen (Anzahl: 2)
So, hier mal meine Lösung, wobei mich mal eure Meinung interessieren würde:
Ich nehme die Properties Tag und TabOrder der Panel zu Hilfe, um die Position auf dem Hauptpanel zu ermitteln. Somit werden die Panel horizontal und vertikal richtig aufgeteilt.

Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
var w,l,d,tl,wd,i,j, hgt:integer;
    pnl: TPanel;
    maxTag, maxTabOrder:integer;
    aMaxTaborder:array of array of Integer;

begin
d:=24; //Abstand zwischen den Panels
l:=24; //Rand zum Panel5
maxTag:=-1;


for i := 0 to Panel5.ControlCount - 1 do
begin
  if Panel5.Controls[i] is TPanel then begin
    pnl := TPanel(Panel5.Controls[i]);
    if maxTag<pnl.Tag then Begin
      maxtag:=pnl.Tag;
      setlength(aMaxTabOrder,maxTag+1,2);
      aMaxTaborder[pnl.Tag,0]:=pnl.Tag;
      aMaxTaborder[pnl.Tag,1]:=1;
    end
    else aMaxTaborder[pnl.Tag,1]:=aMaxTaborder[pnl.Tag,1]+1;
  End;
end;


// Horizontale Ausrichtung *************************************
if maxTag>0 then Begin
  wd:=trunc(((panel5.Width)-(2*l)-((maxtag)*d))/(maxTag+1));

  for i := 0 to Panel5.ControlCount - 1 do
  begin
    if Panel5.Controls[i] is TPanel then begin
      pnl := TPanel(Panel5.Controls[i]);
      pnl.width := wd;
      pnl.Left:= l+((wd+d)*pnl.Tag);
      pnl.Top:=l;
      pnl.Height:=panel5.Height-2*l;
    end; //if
  End;//for
end; //if maxTag
//***************************************************************

// Vertikale Ausrichtung*****************************************
  maxTabOrder:=0;
  For j:=0 to High(aMaxTabOrder) do
    if aMaxTabOrder[j,1]>1 then Begin
      hgt:=trunc(((panel5.height)-(2*l)-((aMaxTabOrder[j,1]-1)*d))/((aMaxTabOrder[j,1]-1)+1));
      for i := 0 to Panel5.ControlCount - 1 do begin
        if ((Panel5.Controls[i] is TPanel) and (Panel5.Controls[i].Tag=aMaxTabOrder[j,0])) then begin
          pnl := TPanel(Panel5.Controls[i]);
          pnl.height := hgt;
          pnl.top:= l+((hgt+d)*pnl.TabOrder-1);
        end; //if
      End;//for
  End;//if

//***************************************************************


end;

Wie sieht es dabei mit der Ressourcennutzung aus, oder anders ausgedrückt: Ist das russisch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 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