Applicazioni e finestre di dialogo Delphi con moduli multipli
Domanda
Ho un'applicazione Delphi 7 che ha due visualizzazioni di un documento (ad es.una modifica HTML WYSIWYG potrebbe avere una vista WYSIWYG e una vista sorgente (non la mia vera applicazione).Possono essere aperti in finestre separate o ancorati in schede nella finestra principale.
Se apro una finestra di dialogo modale da uno dei moduli separati, il modulo principale viene portato in primo piano e viene mostrato come finestra selezionata nella barra delle applicazioni di Windows.Supponiamo che il modulo principale sia la vista WYSIWYG e che la vista di origine venga visualizzata.Vai in un punto particolare nella vista sorgente e inserisci un tag immagine.Viene visualizzata una finestra di dialogo che consente di selezionare e immettere le proprietà desiderate per l'immagine.Se la vista WYSIWYG e la vista di origine si sovrappongono, la vista WYSIWYG verrà portata in primo piano e la vista di origine sarà nascosta.Una volta chiusa la finestra di dialogo, la vista sorgente torna in vista.
Ho provato a impostare il proprietario e le proprietà ParentWindow sul modulo a cui è correlato:
dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;
Come posso risolvere questo problema?Cos'altro dovrei provare?
Dato che le persone sembrano inciampare nel mio esempio, forse posso provare con un esempio migliore:un editor di testo che ti consente di avere più di un file aperto contemporaneamente.I file che hai aperto sono in schede (come nell'IDE Delphi) o nella propria finestra.Supponiamo che l'utente apra la finestra di dialogo del controllo ortografico o la finestra di dialogo Trova.Ciò che accade è che se il file viene modificato nella propria finestra, quella finestra viene inviata sotto il modulo principale nell'ordine z quando viene mostrata la finestra di dialogo modale;una volta chiusa la finestra di dialogo, viene riportata al suo ordine z originale.
Nota:Se stai utilizzando Delphi 7 e stai cercando una soluzione a questo problema, vedi la mia risposta in basso nella pagina per vedere cosa ho fatto alla fine.
Soluzione
Io userei questo codice...(In pratica quello che ha detto Lars)
dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode := pmExplicit;
dialog.ShowModal();
Altri suggerimenti
Alla fine ho finito per trovare il file risposta utilizzando Google Gruppi.In poche parole, a tutte le finestre di dialogo modali è necessario aggiungere quanto segue:
procedure TDialogForm.CreateParams(var Params: TCreateParams); begin inherited; Params.Style := Params.Style or WS_POPUP; Params.WndParent := (Owner as TWinControl).Handle; end;
Immagino che questo sia l'equivalente delle risposte di Lars e Marius in Delphi 7.
La finestra di dialogo viene visualizzata utilizzando ShowModal o semplicemente Mostra?Probabilmente dovresti impostare correttamente la proprietà PopupMode della tua finestra di dialogo.pmAuto sarebbe probabilmente la scelta migliore.Verifica anche se è necessario impostare la proprietà PopupParent.
Prima di tutto, non sono del tutto sicuro di seguire, potrebbe essere necessario fornire alcuni dettagli aggiuntivi per aiutarci a capire cosa sta succedendo e qual è il problema.Immagino di non essere sicuro di capire esattamente cosa stai cercando di realizzare e qual è il problema.
In secondo luogo, non dovresti aver bisogno di impostare il genitore del dialogo poiché questo è essenzialmente ciò che accade con la chiamata a Create (passando il genitore).A dire il vero, i dialoghi che stai descrivendo sembrano aver bisogno di un po' di "ripensamento".Questa finestra di dialogo per inserire le proprietà dell'immagine è figlia della finestra di origine o della finestra WYSIWYG?
Non sono sicuro di aver capito bene a cosa vuoi arrivare, ma ecco alcune cose che posso suggerirti di provare...
- Questo comportamento cambia tra le diverse versioni di Delphi.Suggerirei che ciò sia dovuto agli ostacoli che hanno attraversato per supportare Windows Vista in Delphi 2007.
- Se stai utilizzando Delphi 2007, prova a rimuovere la riga dal file sorgente del progetto che imposta la variabile booleana Application.MainFormOnTaskBar.
- Con questo rimosso, dovresti essere in grado di utilizzare i vari metodi BringToFront / SendToBack del modulo per ottenere l'ordinamento Z che stai cercando.
Sospetto che ciò che hai scoperto sia stato discusso questo linkOvviamente potrei non aver colto del tutto il tuo punto, quindi mi scuso in anticipo!