2013-02-14 3 views
5

In der Delphi-Dokumentation über die TCustomForm.FormStyle wird eine Notiz hinzugefügt, die besagt: "Es ist nicht ratsam, FormStyle zur Laufzeit zu ändern."Warum ist es nicht ratsam, den Formstil zur Laufzeit zu ändern?

Ich würde gerne wissen, warum es nicht ratsam ist, den Formstil zur Laufzeit zu ändern. Ist es aus Sicht der Benutzerschnittstelle nicht ratsam, oder können technische Probleme auftreten? Und welche Probleme könnten auftreten, nachdem der Formstil zur Laufzeit geändert wurde?

Use Case

Wir möchten die Multi-Monitor-Unterstützung unserer MDI-Anwendung verbessern. Derzeit werden alle untergeordneten Fenster innerhalb des Hauptfensters (MDI-Elternfenster) geöffnet. Was die Benutzer möchten, ist in der Lage zu sein, ein Kind-Fenster außerhalb des Hauptfensters zu öffnen/zu bewegen, so dass das Kind-Fenster als separates schwebendes Fenster geöffnet wird, das sich irgendwo auf dem Windows-Desktop befinden kann.

Ich habe Beispiele dieser Funktionalität in Adobe Photoshop, Google Chrome und Microsoft Internet Explorer gesehen. (Tabs können aus der Tableiste verschoben werden und werden in einem separaten schwebenden Fenster geöffnet)

Antwort

8

die FormStyle zur Laufzeit von fsNormal zu fsMDIform oder fsMDIChild ändern, muss neu erstellt den Fenstergriff, und das wiederum erfordert die Neuschöpfung aller Fenster für alle Steuerelemente auf dem Formular verarbeitet. Es gibt eine Menge Dinge außerhalb von Delphis Kontrolle, wenn das passiert: Vielleicht verwenden Sie ein Steuerelement von Drittanbietern, das auf einer Windows-Steuerung beruht, aber das Steuerelement von Drittanbietern weiß nicht, wie es seinen Status speichert. Der Benutzer würde alle Arbeit verlieren, wenn der Fensterhandle neu erstellt wird.

Zum Glück können Sie das Problem umgehen:

  • Stopp mit MDI, alle Fenster „schweben“ machen und mit ihnen eine andere Art und Weise beschäftigen. MDI ist seit einiger Zeit aus der Mode gekommen.
  • Tun Sie es einfach, abhängig von der Art der Kontrollen, die Sie haben, könnte es gut funktionieren. Wenn dies nicht der Fall ist, sehen Sie, was schief gelaufen ist und umgehen Sie das Problem (Beispiel: Sie müssen eventuell den Status der Steuerung selbst speichern und nach dem Austausch wiederherstellen)
  • Versuchen Sie, alles auf einen Rahmen zu setzen; Wenn der Benutzer sich bewegen möchte, erstellen Sie ein neues leeres Nicht-MDI/MDI-Formular, teilen Sie den Rahmen erneut ab, und zerstören Sie das alte Formular.
+0

+1 Die letzten Optionen sind wahrscheinlich der einfachste verfügbare Übergang für eine vorhandene Codebasis. –

6

Wahrscheinlich liegt es daran, dass eine Änderung des Formularstils zur Neuerstellung des Fensterhandle führt. Dies erzwingt die Neuerstellung der Handles aller untergeordneten Fenster.

Fenster Re-Erstellung ist im Großen und Ganzen etwas, was passieren kann, ohne dass Sie es merken. Aber es gibt Kontrollen, die Probleme mit der Neuerstellung haben. Ich habe darunter mit der Symbolleistensteuerung in der Vergangenheit zum Beispiel gelitten. Neuere Versionen von Delphi sind resistenter für die Neuerstellung.

+0

Das war mein Gedanke auch. Ich hatte Probleme mit Nachrichten, die an das alte Handle eines Controls gesendet wurden, die noch nicht bearbeitet wurden (kein Wortspiel beabsichtigt), aber das ist auch etwas, worauf man achten sollte. – hvd

Verwandte Themen