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.

È stato utile?

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...

  1. 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.
  2. Se stai utilizzando Delphi 2007, prova a rimuovere la riga dal file sorgente del progetto che imposta la variabile booleana Application.MainFormOnTaskBar.
  3. 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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top