Che cos'è TApplication.Handle
?Delphi: Che cos'è Application.Handle?
- Da dove viene?
- Perché esiste?
- E soprattutto: perché tutti i moduli hanno come handle della finestra principale?
L'aiuto Delphi dice:
TApplication.Handle
Consente di accedere alla finestra di gestire del modulo principale (finestra) dell'applicazione .
property Handle: HWND;
Descrizione
Usa maniglia al momento della chiamata API di Windows funzioni che richiedono una finestra padre maniglia. Ad esempio, una DLL che visualizza la propria finestra popup a livello superiore richiede una finestra principale per visualizzare le sue finestre nell'applicazione . L'utilizzo della proprietà Handle rende tali finestre parte dell'applicazione , in modo che siano minimizzate, ripristinate, abilitate e disattivate con l'applicazione.
Se mi concentro sulle parole "l'handle della finestra del modulo principale dell'applicazione", e mi prendo a significare l'handle della finestra del modulo principale dell'applicazione, quindi posso confrontare :
- "la maniglia di finestra del modulo principale dell'applicazione", con
- la maniglia finestra della
MainForm
delApplication
, ma non sono la stessa cosa:
Application.MainForm.Handle: 11473728
Application.Handle: 11079574
Allora, qual è Application.Handle
?
- Da dove viene?
- Che handle di finestra di Windows ® è?
- Se lo è l'handle di finestra di Windows ® di
Application
'sMainForm
, quindi perché non corrispondono? - Se è non la maniglia della finestra di
Application
'sMainForm
, allora che cos'è? - Ancora più importante: perché è il genitore supremo di ogni modulo?
- E la cosa più importante: perché tutto va in tilt se cerco di avere un modulo non abbinato (così posso apparire sulla TaskBar), o provare ad usare qualcosa come IProgressDialog?
Davvero quello che sto chiedendo è: qual è la logica di progettazione che rende Application.Handle esiste? Se riesco a capire il perché, il come dovrebbe diventare ovvio.
Aggiornamento Capire attraverso un gioco di venti domande:
Nel parlare la soluzione di fare una finestra sulla barra delle applicazioni, rendendo il suo proprietario null
, Peter Below in 2000 said:
Questo può causare alcuni problemi con le forme modali mostrate dai moduli secondari .
Se l'utente si allontana dall'app mentre è attivo un modulo modale e quindi torna al modulo che lo ha mostrato, il modulo modale può nascondere sotto il modulo. E 'possibile affrontare questo facendo in modo il form modale è imparentato alla forma che ha mostrato (usando `params.WndParent`` come sopra)
Ma questo non è possibile con lo standard finestre di dialogo dal
Dialogs
unità e eccezioni, che hanno bisogno di uno sforzo maggiore per farli lavorare a destra (in pratica la manipolazioneApplication.OnActivate
, alla ricerca di forme modali, imparentata a Application viaGetLastActivePopup
e portarli alla parte superiore della Z-ordine viaSetWindowPos
) .
- Perché un form modale finire bloccato dietro ad altre forme?
- Quale meccanismo porta in genere una forma modale in primo piano e perché non è funzionale qui?
- Windows ® è responsabile della visualizzazione di finestre impilate. Che cosa è andato storto che Windows ® non mostra le finestre corrette?
Ha parlato anche con il nuovo stile di Windows estesa che costringe una finestra per comparire sulla barra delle applicazioni (in cui le normali regole di renderlo non-proprietà è insufficiente, poco pratico, o indesiderabili), con l'aggiunta del WS_EX_APPWINDOW
esteso stile:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
Ma poi avverte:
Se si fa clic su un pulsante della barra delle forme secondarie mentre un'altra applicazione è attiva questo sarà ancora portare tutte le applicazioni f orms in primo piano. Se non si vuole che ci sia un'opzione
che sta portando tutte le forme in primo piano quando il proprietario della forma è ancora Application.Handle
. L'applicazione sta facendo questo? Perché sta facendo questo?Piuttosto che farlo, non dovrebbe farlo non? Qual è lo svantaggio di non facendo questo; vedo il lato negativo di fare esso (menu di sistema del non funzionano propertly, le miniature dei pulsanti della barra delle applicazioni sono inesatte, Windows ® shell non può ridurre al minimo le finestre
In un altro post che fare con la Application
, Mike Edenfield says that the parent window sends other window's their minimize, maximize and restore messages:.
questo aggiungerà il pulsante sulla barra delle applicazioni per il modulo, ma ci sono un paio di altri dettagli minori a maniglia. la maggior parte, ovviamente, il modulo riceve ancora minimizzare/massimizzare spediti al form padre (la principale forma di th e applicazione). Per evitare questo, è possibile installare un gestore di messaggi per WM_SYSCOMMAND con l'aggiunta di una linea come ad esempio:
procedure WMSysCommand(var Msg: TMessage); WM_SYSCOMMAND; procedure TParentForm.WMSysCommand(var Msg: TMessage); begin if Msg.wParam = SC_MINIMIZE then begin // Send child windows message, don't // send to windows with a taskbar button. end; end;
Si noti che questo gestore va nella PARENT forma di quello che si desidera a comportarsi in modo indipendente di> il resto dell'applicazione, in modo da evitare di passare il messaggio minimizzare. È possibile aggiungere simili> codice per SC_MAXIMIZE, SC_RESTORE, ecc
Come è possibile che minimizzare/massimizzare/i messaggi per il mio Windows ® finestre ripristino non stanno andando a mia finestra? È perché i messaggi destinati a una finestra vengono inviati da Windows ® al proprietario della finestra? E in questo caso tutti i moduli in un'applicazione Delphi sono "di proprietà" di Application
? Vuol non significa che, per rendere nullo il proprietario:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0; //NULL
end;
rimuoverà Application
e della finestra della maniglia di interferire con la mia forma, e Windows dovrebbe ancora una volta inviare me mia mimimize/massimizzare/messaggi di ripristino?
Forse, se abbiamo confrontato e contrastato ora un'applicazione "normale" di Windows fa le cose, di come Borland inizialmente progettato applicazioni Delphi per fare le cose - rispetto a questo oggetto Application
ed è ciclo principale.
- quale soluzione era la risoluzione dell'oggetto
Application
? - Che modifica è stata apportata alle versioni successive di Delphi in modo che questi stessi problemi non esistano?
- Il cambiamento nelle versioni successive di Delphi non ha introdotto altri problemi, che la progettazione iniziale dell'applicazione ha provato così difficile da risolvere?
- In che modo le nuove applicazioni possono ancora funzionare senza che l'Applicazione interferisca con esse?
Ovviamente Borland ha realizzato il difetto nella progettazione iniziale. Qual era il loro progetto iniziale, quale problema risolveva, qual è il difetto, quale è stato il re-design e come risolve il problema?
Penso che ti interesserà conoscere questi due trucchi: http://yoy.be/item.asp?i89 http://yoy.be/item.asp?i87 –
@Stinh Sanders: i ' Ho visto quelli, loro non risolvono i problemi. Inoltre, mai, mai, mai passare GetDesktopWindow come proprietario di una finestra, come suggeriscono quelli e altri post sull'argomento. Fare così usato per causare il blocco di Windows. È stato un tale problema che Microsoft ha applicato patch a CreateWindow, quindi chiunque ha passato GetDesktopWindow mentre il proprietario viene modificato per utilizzare NULL. E se potessi modificare quel post su ** yoy.com **, lo farei. –