![]() |
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:
Udo :wall:
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; |
Re: DockStyle Problem
Zitat:
Die Hilfe schreibt dazu: Zitat:
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:
Mein Code zu dem Beisp. sieht so aus:
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; (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; |
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:
Ist nix....Diese Conrols.Remove und Add bewirkt garnüscht, jedenfalls nichs bei der Z-Order. :evil:
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; Noch ne Idee? :cry: Gruss Udo |
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).
|
Re: DockStyle Problem
Danke OregonGhost, das funktioniert. :bounce2:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz