Wie vermeide ich dieses unerwünschte Verhalten mit Delphis TSPSPLITTER und PORTS?
-
27-10-2019 - |
Frage
Eingeschlossen ist ein kleines Projekt, das mein Problem demonstriert. Ich habe ein TPageControl
auf die Hauptform ausgerichtet. Bei jedem der zwei Tabsheets habe ich den Panels -Client ausgerichtet. Auf jedem dieser Panels habe ich 2 Subpanels und einen Splitter. Das LH-Panel und der Splitter sind links ausgerichtet, das RH-Panel-Client-ausgerichtete.
Grundsätzlich ist das Problem die Interaktion zwischen den 2 Registerkarten. Demonstrieren:
- Führen Sie das Programm aus
- Dehnen Sie die Hauptform horizontal. Panel 3 wird wachsen
- Bewegen Sie den Splitter so weit nach rechts, wie er gehen wird. Panel 2 wird wachsen, Tafel 3 schrumpft auf seine 10-Pixel-Minwidth-Einschränkung.
- Wählen Sie Registerkarte 2. Panel 5 ist wie entworfen. Tafel 6 wuchs, als das Hauptformular gestreckt wurde
- Reduzieren Sie die Hauptformbreite auf ihre ursprüngliche Breite. Tafel 6 schrumpft zu stark (unerwünscht)
- Klicken Sie auf die Registerkarte 1. Das Hauptformular erhöht sich wieder (unerwünscht).
OK, das Verhalten ist wahrscheinlich in Bezug auf die Regeln für ausgerichtete Panels erklärbar, aber kann jemand Verbesserungen des Betriebs vorschlagen?
unit Unit17;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls;
type
TForm17 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Panel1: TPanel;
Panel2: TPanel;
Splitter1: TSplitter;
Panel3: TPanel;
Panel4: TPanel;
Splitter2: TSplitter;
Panel5: TPanel;
Panel6: TPanel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form17: TForm17;
implementation
{$R *.dfm}
end.
object Form17: TForm17
Left = 0
Top = 0
Caption = 'Form17'
ClientHeight = 254
ClientWidth = 314
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object PageControl1: TPageControl
Left = 0
Top = 0
Width = 314
Height = 254
ActivePage = TabSheet1
Align = alClient
Constraints.MinWidth = 30
TabOrder = 0
ExplicitWidth = 480
object TabSheet1: TTabSheet
Caption = 'TabSheet1'
ExplicitWidth = 281
ExplicitHeight = 165
object Panel1: TPanel
Left = 0
Top = 0
Width = 306
Height = 226
Align = alClient
Caption = 'Panel1'
TabOrder = 0
ExplicitWidth = 109
ExplicitHeight = 165
object Splitter1: TSplitter
Left = 151
Top = 1
Width = 12
Height = 224
ExplicitLeft = 145
end
object Panel2: TPanel
Left = 1
Top = 1
Width = 150
Height = 224
Align = alLeft
Caption = 'Panel2'
Constraints.MinWidth = 10
TabOrder = 0
end
object Panel3: TPanel
Left = 163
Top = 1
Width = 142
Height = 224
Align = alClient
Caption = 'Panel3'
Constraints.MinWidth = 10
TabOrder = 1
ExplicitLeft = 141
ExplicitWidth = 330
end
end
end
object TabSheet2: TTabSheet
Caption = 'TabSheet2'
ImageIndex = 1
ExplicitWidth = 281
ExplicitHeight = 165
object Panel4: TPanel
Left = 0
Top = 0
Width = 306
Height = 226
Align = alClient
Caption = 'Panel4'
TabOrder = 0
ExplicitWidth = 109
ExplicitHeight = 165
object Splitter2: TSplitter
Left = 149
Top = 1
Width = 11
Height = 224
ExplicitLeft = 141
end
object Panel5: TPanel
Left = 1
Top = 1
Width = 148
Height = 224
Align = alLeft
Caption = 'Panel5'
Constraints.MinWidth = 10
TabOrder = 0
end
object Panel6: TPanel
Left = 160
Top = 1
Width = 145
Height = 224
Align = alClient
Caption = 'Panel6'
Constraints.MinWidth = 10
TabOrder = 1
ExplicitLeft = 141
ExplicitWidth = 139
ExplicitHeight = 163
end
end
end
end
end
Lösung
Um das erwartete Verhalten zu erhalten, entfernen Sie die Einschränkungen (MinWidth
) von deinen Panels. Diese Einstellungen sind derzeit unwirksam Wie auch immer, da Ihre Splitter eine haben MinSize
von '30' (der Standard, nicht gespeichert).
bearbeiten (Antwort auf den Kommentar): Sie können nicht erwarten, dass die "Minwidth" -Erbeschränkung eines Steuerelements auf der rechten Seite eines Splitters die Größe der linken Steuerung eingestellt wird. Das ist nur logisch, die Einschränkung ist eine Eigenschaft für die von Ihnen festgelegte Kontrolle. Alles, was Sie erreichen, ist, dass das Formular das Schrumpfen leugnet, wenn Ihre Kontrolle bereits an der "Minwidth" liegt, daher die unerwünscht Verhalten, das Sie beobachten, dass das Formular beim Wechseln der Registerkarten größer wird. Was Sie wünschen, Sie müssen mit Code zu tun - wie Marjan in seiner Antwort sagte. Es sollte mehr als eine Möglichkeit geben, dies zu erreichen.
procedure TForm1.Panel3CanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
if NewWidth < Splitter1.MinSize then
Panel2.Width := Panel2.Width - Splitter1.MinSize + NewWidth;
end;
Andere Tipps
Nicht unbedingt eine echte Antwort, sondern ein paar Bemerkungen:
Minsize voor ein alleft ausgerichteter Splitter bezieht sich auf die Kontrolle auf der linken und rechten Splitter. Ihr Panel 6 wird in der Tat geändert, dass sie (etwas mehr als) seine eigene Minwidth (10) anstelle der Minsize des Splitters (30) (30). Sie können dies leichter demonstrieren, indem Sie zwei links ausgerichtete Panels auf jeden Ihrer Paneele 2, 3, 5 und 6 hinzufügen und ihnen eine Breite von 10 und 20 und eine andere Farbe geben.
Wählen Sie nach der Reduzierung der Mainform -Breite erneut das Mainform (Yikes) und zeigt, dass nun Panel3 jetzt auch auf die min -Breite anstelle des Min -Splitters reduziert wurde.
Die Lösung für die Hauptform des Größens von der Größe? Keine Ahnung, aber sicherzustellen, dass die Minwidth Ihrer Panels mit der Minsize der Splitter synchronisiert ist, sollte das Schrumpfen entfernen. Und wie Sertac sagt, vermute ich, dass Sie sich einfach für das eine oder andere entscheiden müssen, aber nicht beides ...
Aktualisieren:
Setzen Sie die MINSIZE der Splitter auf 30 und setzen Sie die Minwidth der Panels auf 0, nimmt die Größenänderung der Mainform weg, reduziert jedoch die rechten Handplatten auf 0 Breite.
Das Einstellen der MINSIZE der Splitter auf 30 und das Einstellen der Minwidth der Panels auf 30, nimmt die Mindestbreitprobleme weg, aber dennoch die Größe der Größe der Größe.
Das Einstellen der Minwidth der Panels auf 30 und das Einstellen der MINSIZE der Splitter auf 1 (das Minimum) ermöglicht es, den Splitter nach rechts zu bewegen, und ändert die Hauptform von den Panels Minwidth, wenn Sie den Splitter freigeben. Es wird verhindern, dass Panel6 auf weniger als 30 reduziert wird, aber die Mainform ändert sich erneut, wenn Sie die Registerkarte 1 erneut auswählen.
Es scheint, dass Ihre beste Wahl darin besteht, sich auf die Minsize der Splitter zu verlassen und "manuell" zu verhindern, dass die rechten Handplatten auf weit reduziert werden, indem die Bewegung der Splitter einschränken, wenn sie nach rechts geht. Sie können dies im OnCanResize -Ereignis der Splitter tun.
Übrigens mit D2009
void __fastcall TFMain::SplitterCanResize(TObject *Sender, int &NewSize, bool &Accept)
{
TSplitter *S = (TSplitter *)Sender;
for (int i = 0; Accept && i < S->Parent->ControlCount; i++) if (S->Parent->Controls[i]->Constraints->MaxHeight && S->Parent->Controls[i]->Align == S->Align && NewSize >= S->Parent->Controls[i]->Constraints->MaxHeight * 2) Accept = false;
}
Wenn Sie den Splitter weit nach rechts bewegt haben, reduzierte Sie die Breite der Form, so dass sie schmaler wurde als die linke Tafel (und damit der Splitter als „außerhalb“ der Form), was sollte das Verhalten Ihrer Form Ihre Form haben in diesem Fall sein? Sie wurden nach Ihren Kriterien für wünschenswertes Verhalten gefragt, und alles, was ich in Ihrer bisherigen Antwort sehen kann, ist Ihr Verständnis von Ihrem Verständnis unwünschenswertes Verhalten.
Jetzt war ich ein paar Mal besorgt mit möglichen Nebenwirkungen der Größenänderung eines Formulars mit Panels und Splitern. Ich habe mich nicht sehr darauf untersucht und insbesondere noch nie zuvor über den automatischen Effekt wie in Ihren Situationen gewusst. Wie auch immer, um die meisten (wenn nicht solche) der möglichen Verhaltensart -Fakte zu verhindern, die ich in Betracht gezogen habe TScrollBox
als Elternsteuerung für Panels und Splitter statt von TPanel
.
Ich glaube, dies würde sich ändern, wenn die Größe des Formulars in der Größenänderung des Kundenbereichs der Scroll Box die Größenänderung geändert hat. Dies würde für mich gut funktionieren, wenn auch nur wenige kleine Projekte von mir, bei denen ich Splitter verwendet habe, wenn ich wie Sie Tabsheets verwendet habe. Ich kann jedoch nicht über Ihren Fall wissen. Und ich verstehe, dass dies eher eine Problemumgehung als eine Lösung für Ihr Problem ist.