Laden...

SplitContainer-SplitterDistance Fehlfunktion???

Erstellt von pkoeppe vor 17 Jahren Letzter Beitrag vor 15 Jahren 6.992 Views
P
pkoeppe Themenstarter:in
319 Beiträge seit 2006
vor 17 Jahren
SplitContainer-SplitterDistance Fehlfunktion???

Hallo zusammen,

ich habe auf einem Form einen SplitContainer. Für diesen wird beim Beenden des Forms die SplitterDistance gespeichert und beim erneuten Start geladen. Die Werte (speichern und laden) sind identisch, aber die Position des Splitters ist völlig daneben.

Vorgehensweise:
Im Constructor der Form setze ich nach InitializeComponent() die SplitterDistance und in FormClosing speichere ich die aktuelle SplitterDistance. Nun habe ich mir mal noch ein paar Console.WriteLines eingefügt. Im Constructor vor dem Setzen der SplitterDistance, nach dem Setzen, in FormLoad, in FormClosing und im Moved-Event des SplitContainers.

Und jetzt mal ein Bsp:

  1. Verschiebe Splitter => Moved => SplitterDistance = 537
  2. FormClosing => SplitterDistance = 537
  3. Starte neu
  4. Vor dem Setzen => SplitterDistance = 458 (kommt vom Designer)
  5. Moved => SplitterDistance = 537
  6. Nach dem Setzen => SplitterDistance = 537
  7. Moved => SplitterDistance = 793
  8. Load => SplitterDistance = 793

Wo kommt 7. her nach dem Setzen löse ich bei mir nirgends ein erneutes Setzen aus, also woher bzw. was löst das Moved aus??? Das kann doch nicht angehen! Weiß irgendwer Rat?

Debuggen bringt auch nicht viel nach dem Constructor geht's zurück zu Application.Run(new Main()) und von da aus direkt zum Moved-EventHandler, aber warum?

Gruß
Patrick

Wer nicht fragt, bleibt dumm.

P
pkoeppe Themenstarter:in
319 Beiträge seit 2006
vor 17 Jahren

Kann das Problem irgenwer nachvollziehen?

Die, wie ich finde, dirty-Lösung ist ja einfach das Setzen der SplitterDistance in die Load-Methode des Forms reinzunehmen, da Punkt 7 ja irgendwo zwischen Konstruktor und Load auftritt. Dirty deshalb weil ich nicht weiß wo und vor allem warum Punkt 7 ausgelöst wird, und ich eigentlich alle Initialisierungen der Oberfläche im Konstruktor der Form erledige (geht ja hier irgendwie nicht).

Falls doch noch jemand eine Idee hat, dann ist diese mir sehr willkommen.

Gruß
Patrick

Wer nicht fragt, bleibt dumm.

S
134 Beiträge seit 2005
vor 16 Jahren
SplitterDistance

Hallo pkoeppe,

ich habe das gleiche Problem und wollte nur der Vollständigkeit darauf hinweisen, dass es wahrscheinlich mit der Minimum-Size der beiden Container zu tun hat. Das Problem scheint zu sein, dass er bei Verstoß gegen eine der Min-Sizes immer auf MinSize setzt.

So richtig verstehen tue ich das auch noch nicht, aber vielleicht ist es ja ein Ansatz.

sprinter252

"Das Unverständlichste am Universum ist im Grunde, daß wir es verstehen." A. Einstein

S
134 Beiträge seit 2005
vor 16 Jahren

Hallo,

ich hab's endlich gefunden!!!!

Man darf die Distance frühestans ab dem Form.Shown-Event setzen. Setzt man sie vorher, wird das alles durch den Designer-Code überschrieben!

Besser spät als nie 😁

sprinter252

"Das Unverständlichste am Universum ist im Grunde, daß wir es verstehen." A. Einstein

420 Beiträge seit 2007
vor 15 Jahren

Hallo,

ich habe ebenfalls die Probleme mit dem Setzen der SplitterDistance:
Wenn das Programm geschlossen wird, speichere ich den Wert, der in "SplitterDistance" steht, ab. Wenn das Programm wieder gestartet wird, wird "SplitterDistance" mit dem gespeicherten Wert gesetzt.

Also mache ich im Prinzip genau das Gleiche wie von pkoeppe beschrieben:

  1. Verschiebe Splitter => Moved => SplitterDistance = 537
  2. FormClosing => SplitterDistance = 537
  3. Starte neu
  4. Vor dem Setzen => SplitterDistance = 458 (kommt vom Designer)
  5. Moved => SplitterDistance = 537
  6. Nach dem Setzen => SplitterDistance = 537
  7. Moved => SplitterDistance = 793
  8. Load => SplitterDistance = 793

Man darf die Distance frühestans ab dem Form.Shown-Event setzen

Funktioniert bei mir leider immernoch genauso wenig.

Hat jemand eine Idee?

Gruß Dennis

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo dennisspohr,

die SplitterDistance wird durch Größenänderungen des SplitterControls beeinflusst. Deshalb muss sie ganz zuletzt gesetzt werden, nachdem alle Aktionen, die Einfluss auf die Größe des SplitterControls haben, durchgeführt worden sind. Eine ganze Menge Aktionen haben Einfluss auf die Größe, z.B. auch Dock. Wenn du die SplitterDistance erst ganz zum Schluss setzt, wüsste ich keinen Grund, warum das nicht gehen sollte. Wenn Form.Shown zu früh ist, kannst du es testweise mit Application.Idle probieren.

herbivore

420 Beiträge seit 2007
vor 15 Jahren

Hallo herbivore

die SplitterDistance wird durch Größenänderungen des SplitterControls beeinflusst

Ich habe mein Problem gelöst. Nun funktioniert es.
Vielen Dank für deine Hilfe!

Gruß Dennis

29 Beiträge seit 2008
vor 15 Jahren

Wie hast du es denn gelöst?