Frage

Ich habe eine Delphi 7-Anwendung, die zwei Ansichten eines Dokuments hat (z. B.eine WYSIWYG-HTML-Bearbeitung könnte eine WYSIWYG-Ansicht und eine Quellansicht haben – nicht meine eigentliche Anwendung).Sie können in separaten Fenstern geöffnet oder an Registerkarten im Hauptfenster angedockt werden.

Wenn ich einen modalen Dialog aus einem der separaten Formulare öffne, wird das Hauptformular in den Vordergrund gebracht und als ausgewähltes Fenster in der Windows-Taskleiste angezeigt.Angenommen, das Hauptformular ist die WYSIWYG-Ansicht und die Quellansicht wird ausgeblendet.Sie gehen zu einer bestimmten Stelle in der Quellansicht und fügen ein Bild-Tag ein.Es erscheint ein Dialog, in dem Sie die gewünschten Eigenschaften für das Bild auswählen und eingeben können.Wenn sich die WYSIWYG-Ansicht und die Quellansicht überlappen, wird die WYSIWYG-Ansicht in den Vordergrund gebracht und die Quellansicht ausgeblendet.Sobald der Dialog geschlossen wird, wird die Quellansicht wieder angezeigt.

Ich habe versucht, den Eigentümer und die ParentWindow-Eigenschaften auf das Formular festzulegen, auf das sie sich beziehen:

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

Wie kann ich dieses Problem beheben?Was sollte ich sonst noch versuchen?

Angesichts der Tatsache, dass die Leute über mein Beispiel zu stolpern scheinen, kann ich es vielleicht mit einem besseren Beispiel versuchen:Ein Texteditor, mit dem Sie mehr als eine Datei gleichzeitig öffnen können.Die von Ihnen geöffneten Dateien befinden sich entweder in Registerkarten (wie in der Delphi-IDE) oder in einem eigenen Fenster.Angenommen, der Benutzer ruft den Dialog zur Rechtschreibprüfung oder den Suchdialog auf.Wenn die Datei in einem eigenen Fenster bearbeitet wird, wird dieses Fenster in der Z-Reihenfolge unterhalb des Hauptformulars angezeigt, wenn das modale Dialogfeld angezeigt wird.Sobald der Dialog geschlossen wird, wird er in seine ursprüngliche Z-Reihenfolge zurückversetzt.

Notiz:Wenn Sie Delphi 7 verwenden und nach einer Lösung für dieses Problem suchen, lesen Sie meine Antwort weiter unten auf der Seite, um zu sehen, was ich letztendlich getan habe.

War es hilfreich?

Lösung

Ich würde diesen Code verwenden ...(Im Grunde das, was Lars gesagt hat)

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();

Andere Tipps

Letztendlich habe ich das gefunden Antwort mithilfe von Google Groups.Kurz gesagt, allen modalen Dialogen muss Folgendes hinzugefügt werden:


procedure TDialogForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_POPUP;
  Params.WndParent := (Owner as TWinControl).Handle;
end;

Ich vermute, dass dies das Äquivalent zu den Antworten von Lars und Marius in Delphi 7 ist.

Wird der Dialog mit ShowModal oder nur mit Show angezeigt?Sie sollten wahrscheinlich die PopupMode-Eigenschaft Ihres Dialogs richtig festlegen.pmAuto wäre wahrscheinlich Ihre beste Wahl.Prüfen Sie auch, ob Sie die PopupParent-Eigenschaft festlegen müssen.

Zunächst einmal bin ich mir nicht ganz sicher, ob ich dem folge. Möglicherweise müssen Sie einige zusätzliche Details angeben, damit wir besser verstehen, was passiert und wo das Problem liegt.Ich glaube, ich bin mir nicht sicher, ob ich genau verstehe, was Sie erreichen wollen und wo das Problem liegt.

Zweitens sollten Sie das übergeordnete Element des Dialogs nicht festlegen müssen, da dies im Wesentlichen mit dem Aufruf von Create (Übergabe des übergeordneten Elements) geschieht.Um ehrlich zu sein, klingen die Dialoge, die Sie beschreiben, so, als müssten sie etwas „überdacht“ werden.Ist dieser Dialog zur Eingabe der Eigenschaften des Bildes ein untergeordnetes Dialogfeld des Quellfensters oder des WYSIWYG-Fensters?

Ich bin mir nicht sicher, ob ich ganz verstehe, was Sie meinen, aber ich kann Ihnen ein paar Dinge vorschlagen, die Sie ausprobieren können ...

  1. Dieses Verhalten ändert sich zwischen verschiedenen Delphi-Versionen.Ich würde vermuten, dass dies an den Hürden liegt, die sie unternommen haben, um Windows Vista in Delphi 2007 zu unterstützen.
  2. Wenn Sie Delphi 2007 verwenden, versuchen Sie, die Zeile aus der Projektquelldatei zu entfernen, die die boolesche Variable Application.MainFormOnTaskBar festlegt.
  3. Wenn dies entfernt ist, sollten Sie in der Lage sein, die verschiedenen BringToFront-/SendToBack-Methoden des Formulars zu verwenden, um die gewünschte Z-Reihenfolge zu erreichen.

Ich vermute, dass das, was Sie herausgefunden haben, bereits besprochen wurde dieser LinkNatürlich habe ich Ihren Standpunkt möglicherweise völlig verfehlt, also entschuldigen Sie sich im Voraus!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top