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/)
-   -   Prism DockStyle Problem (https://www.delphipraxis.net/21906-dockstyle-problem.html)

Udo 9. Mai 2004 20:43


DockStyle Problem
 
Moin.

Ich erzeuge zur Laufzeit Panels mit Dockstyle.Left.
Seltsamerweise reihen die Teile sich verkehrt rum auf, also das zuletzt erzeugte ist ganz links.
Mache ich bei der Erzeugung was falsch? :gruebel:

Delphi-Quellcode:
procedure TWinFormFR.MenuItemNew_Click(sender: System.Object; e: System.EventArgs);
var FR: Panel; Lab: System.Windows.Forms.Label;
begin
  FR:= Panel.Create;
  FR.Parent:= Self;
  //pY und pX = Mausposition aus MouseDown
  if pY + FR.Height > Self.ClientSize.Height then
    FR.Top:= Self.ClientSize.Height - FR.Height
  else FR.Top:= pY;
  if pX + FR.Width > Self.ClientSize.Width then
    FR.Left:= Self.ClientSize.Width - FR.Width
  else FR.Left:= pX;
  FR.BorderStyle:= BorderStyle.FixedSingle;
  FR.BackColor:= SystemColors.ControlLight;
  FR.Dock:= DockStyle.Left;
  inc(Self.Count);
  Lab:= System.Windows.Forms.Label.Create;
  Lab.Top:= 10;
  Lab.Left:= 10;
  Lab.Width:= FR.Width - 15;
  Lab.Height:= FR.Height - 15;
  FR.Name:= 'Frame ' + Self.FCount.ToString;
  Lab.Parent:= FR;
  Self.Controls.Add(FR); // ??
end;
Udo :wall:

MaBuSE 12. Mai 2004 11:03

Re: DockStyle Problem
 
Zitat:

Zitat von Udo
Mache ich bei der Erzeugung was falsch? :gruebel:

Im Prinzip nein.

Die Hilfe schreibt dazu:
Zitat:

Zitat von Borland Online Hilfe
Wenn ein Steuerelement am Rand seines Containers angedockt ist, wird es bei jeder Änderung der Containergröße wieder bündig an diesem Rand ausgerichtet. Wenn an einem Rand mehrere Steuerelemente angedockt sind, werden diese Steuerelemente entsprechend ihrer z-Reihenfolge nebeneinander angezeigt, wobei Folgendes gilt: je höher ein Steuerelement in der z-Reihenfolge ist, desto weiter entfernt vom Containerrand ist es positioniert.

Diese z-Reihenfolge ist also schuld daran :evil:

Das ist nicht die Erstellungsreihenfolge, sondern die Reihenfolge in der es dem Container zugefügt wurde.

Das lässt sich auch einfach im Designer nachvollziehen:

Panel auf WinForm
-> Objektinspektor: Panel1.Dock = Left
-> weiteres Panel auf WinForm
-> Objektinspektor: Panel2.Dock = Left

-> nun versuchen die Reihenfolge zu tauschen (Maus oder Left)
-> lässt sich nicht drehen! Das 1. Panel ist immer Links!!!

Das entspricht auch der Hilfe und Deinem Problem

Lösungsvorschlag:
PanelX ist links, wenn Panely hinzugefügt würde wurde PanelX rechts neben PanelY stehen.
Wird PanelX aus der ControlCollection entfernt, PanelY hinzugefügt und danach PanelX wieder hinzugefügt,
so steht das PanelX links und PanelY rechts.
Delphi-Quellcode:
if Self.Controls.Contains(PanelX) then
begin
  Self.Controls.Remove(PanelX);
  Self.Controls.Add(PanelY);
  Self.Controls.Add(PanelX);
end;

Ich hoffe das hilft weiter

BTW:

Ein paar Verbesserungsvorschläge hätte ich noch zu dem Quellcode:

Delphi-Quellcode:
procedure TWinFormFR.MenuItemNew_Click(sender: System.Object; e: System.EventArgs);
var FR: Panel; Lab: System.Windows.Forms.Label;
begin
  FR:= Panel.Create;
  // FR.Parent:= Self;  
  // Das wird über die Zeile
  // Self.Controls.Add(FR); // ??
  // am Ende der Proc gemacht

{
  // Unwichtig, da ja eh am Rand ausgerichtet wird.
  //pY und pX = Mausposition aus MouseDown
  if pY + FR.Height > Self.ClientSize.Height then
    FR.Top:= Self.ClientSize.Height - FR.Height
  else FR.Top:= pY;
  if pX + FR.Width > Self.ClientSize.Width then
    FR.Left:= Self.ClientSize.Width - FR.Width
  else FR.Left:= pX;
}

  ...

  // Lab.Parent:= FR;
  FR.Controls.Add(Lab);

  Self.Controls.Add(FR);
end;
Mein Code zu dem Beisp. sieht so aus:
(Es besteht aber noch das gleiche Problem!)

Delphi-Quellcode:
procedure TWinForm.Button2_Click(sender: System.Object; e: System.EventArgs);
var
  myPanel: System.Windows.Forms.Panel;
  myLabel: System.Windows.Forms.Label;
begin
  inc(Self.Count);
  myPanel := System.Windows.Forms.Panel.Create;
  myLabel := System.Windows.Forms.Label.Create;
  myPanel.SuspendLayout;
  myPanel.Width := 25;
  myPanel.Dock := System.Windows.Forms.DockStyle.Left;
  myPanel.Name := 'myPanel'+Self.Count.ToString;;
  myPanel.Controls.Add(myLabel);
  myLabel.Location := System.Drawing.Point.Create(8, 8);
  myLabel.Name := 'myLabel'+Self.Count.ToString;;
  myLabel.Size := System.Drawing.Size.Create(24, 16);
  myLabel.Text := Self.Count.ToString;;
  Self.Controls.Add(myPanel);
  myPanel.ResumeLayout(False);
end;

Udo 18. Mai 2004 13:41

Re: DockStyle Problem
 
Hi MaBuSE

So richtig hülfts leider nicht. :?
Im Designer ist das schon so wie du es beschreibst und so will ich das auch.
PanelA --> left --> ganz links
PanelB --> left --> rechts daneben
PanelC --> Client --> füllt den Platz rechts neben Panel2
So ist das OK

Nur per Code vehält sich das anders:
PanelA --> Left --> ganz links
PanelB --> Left --> schiebt sich links vor PanelA :evil:
PanelC --> Client --> wieder ganz links und füllt die ganze Form, PanelA und B liegen darüber.
Das ist völlig unbrauchbar :(

Ich habe mal versucht das ControlArray "umzudrehen", bringt leider garnix, keine Änderung. :wall:

Um das zu vereinfachen habe ich 2 Panels auf ne Form gepatscht (Designtime), darauf je ein Label zur Erkennung.
Beide DockStyle.Left, links Panel1 rechts daneben Panel2.

Folgender Code sollte die Reihenfolge ändern:

Delphi-Quellcode:
Panel1.Dock:= DockStyle.None;
Panel2.Dock:= DockStyle.None;
Panel1.Left:= 400; // bei D6 hat das noch ne Rolle gespielt für die Reihenfolge
Panel2.Left:= 5;
Panel1.Height:= 200;
Panel2.Height:= 200; // --> bis hier OK
// Reigenfolge tauschen:
Self.Controls.Remove(Panel1);
Self.Controls.Remove(Panel2);
Self.Controls.Add(Panel2);
Self.Controls.Add(Panel1);
//andersrum andocken:
Panel2.Dock:= DockStyle.Left;
Panel1.Dock:= DockStyle.Left;
Ist nix....Diese Conrols.Remove und Add bewirkt garnüscht, jedenfalls nichs bei der Z-Order. :evil:
Noch ne Idee? :cry:

Gruss
Udo

OregonGhost 29. Mai 2004 09:36

Re: DockStyle Problem
 
Du kannst mit Control.SendToBack() ein Steuerelement ans Ende der Z-Reihenfolge setzen, und mit Control.BringToFront() an den Anfang. Damit sollte sich deine Positionierung machen lassen (so funktioniert sie ja auch im Designer, jedenfalls im C#-Builder, hab noch nicht mit Delphi.NET gearbeitet).

Udo 31. Mai 2004 22:13

Re: DockStyle Problem
 
Danke OregonGhost, das funktioniert. :bounce2:


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