2008-08-22 5 views
4

Ich haben eine Delphi 7-Anwendung, die zwei Ansichten ein Dokument hat (zum Beispiel eines WYSIWYG-HTML bearbeiten könnte eine WYSIWYG-Ansicht und eine Quellensicht - nicht meine richtige Anwendung). Sie können in separaten Fenstern geöffnet oder in Registerkarten im Hauptfenster angedockt werden.Multiple Form Delphi-Anwendungen und Dialoge

Wenn ich einen modalen Dialog von einem der getrennten Formen öffnen, wird die Hauptform nach vorne gebracht, und wird als das ausgewählte Fenster in der Taskleiste angezeigt. Angenommen, das Hauptformular ist die WYSIWYG-Ansicht und die Quellansicht ist ausgeblendet. Sie gehen zu einem bestimmten Punkt in der Quellansicht und fügen ein Bild-Tag ein. Ein Dialogfeld wird angezeigt, in dem Sie die gewünschten Eigenschaften für das Bild auswählen und eingeben können. Wenn sich die WYSIWYG-Ansicht und die Quellenansicht überschneiden, wird die WYSIWYG-Ansicht nach vorne und die Quellenansicht ausgeblendet. Sobald der Dialog geschlossen ist, wird die Quellansicht wieder angezeigt.

Ich habe versucht, auf die Form, die Eigentümer und die Parent Eigenschaften festlegen es verwandt ist:

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

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

Da Menschen auf meinem Beispiel zu sein scheinen stolpern, vielleicht kann ich mit einem besseren Beispiel versuchen: ein Texteditor, den Sie mehr als eine Datei geöffnet zugleich haben kann. Die geöffneten Dateien befinden sich entweder in Tabs (wie in der Delphi-IDE) oder in einem eigenen Fenster. Angenommen, der Benutzer öffnet den Rechtschreibprüfdialog oder den Suchdialog. Was passiert, wenn die Datei in einem eigenen Fenster bearbeitet wird, wird dieses Fenster in der Z-Reihenfolge unterhalb des Hauptformulars gesendet, wenn der modale Dialog angezeigt wird. Sobald der Dialog geschlossen ist, wird er in seine ursprüngliche Z-Reihenfolge zurückversetzt.

Hinweis: Wenn Sie Delphi 7 verwenden und nach einer Lösung für dieses Problem suchen, finden Sie in meiner Antwort unten auf der Seite, um zu sehen, was ich getan habe.

Antwort

5

ich diesen Code verwenden würde ... (Im Grunde, was Lars sagte)

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

Dies hat habe gerade ein langjähriges Problem für mich gelöst. Vielen Dank. –

0

Zunächst einmal, ich bin nicht ganz sicher, ob ich folgen, müssen Sie möglicherweise einige zusätzliche Details liefern uns zu helfen zu verstehen, was passiert ist und was das Problem ist. Ich glaube ich bin mir nicht sicher, ob ich genau verstehe, was Sie erreichen wollen und was das Problem ist.

Zweitens sollten Sie nicht festlegen müssen die Eltern Dialog, da dies im Wesentlichen ist, was mit dem Anruf (vorbei an den Eltern) erstellen geschehen. Die Dialoge, die du beschreibst, hören sich an, als könnten sie ein bisschen "nachdenken", um ehrlich zu sein. Ist dieser Dialog zum Eingeben der Eigenschaften des Bildes ein Kind des Quellfensters oder des WYSIWYG-Fensters?

1

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

0

Ich bin nicht sicher, ich ganz verstehen, was Sie bekommen, aber hier ist ein paar Dinge, die ich Ihnen vorschlagen kann, kann versuchen Sie ...

  1. Dieses Verhalten wechselt zwischen verschiedenen Versionen von Delphi. Ich würde vorschlagen, dass dies aufgrund der Reifen sprangen sie durch Windows Vista in Delphi 2007.
  2. Wenn Sie mit Delphi 2007 zu unterstützen, versuchen, die Linie von der Projektquelldatei zu entfernen, die das Application.MainFormOnTaskBar boolean Variable setzt.
  3. Mit diesem entfernt sollten Sie in der Lage sein, die BringToFront/SendToBack-Methoden des Formulars zu verwenden, um die Z-Reihenfolge zu erreichen, nach der Sie suchen.

Ich vermute, dass das, was Sie entdeckt haben hat this link Natürlich diskutiert worden ist, kann ich nur knapp verfehlt Ihre Punkt ganz, so entschuldige mich im Voraus!

3

Ich fand schließlich die Suche nach answer mit Google Groups. Auf den Punkt gebracht, alle modale Dialoge müssen die folgenden hinzugefügt, um sie haben:


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

Ich vermute, das das Äquivalent von Lars tut und Marius' Antworten in Delphi 7.