2012-10-18 7 views
8

Ich habe ein Dienstprogramm-Dialog (nicht-modale und bleiben-auf-top), sollte jederzeit zugänglich sein, wenn Sie die Anwendung verwenden (Denken Sie an einen Dialog, der verwendet werden kann, um Notizen zu machen, während der Arbeit mit der Anwendung) auch wenn Ein modaler Dialog wird angezeigt.Wie kann ich ein Formular erstellen, das nicht deaktiviert ist, wenn ein anderes Formular modal angezeigt wird?

Der Rest der Anwendung kann nicht geändert werden.

Ist es möglich? Wie könnte ich damit umgehen?

+0

'Modalität' in Windows kann in der Tat eine PITA sein. (Das schlechteste Beispiel, das mir einfällt, ist Microsoft Word 2010, wo Sie ein Word-Dokument nicht öffnen können (z. B. durch Doppelklicken auf eine * .docx-Datei), wenn in einem anderen Word-Fenster ein modales Dialogfeld geöffnet ist.) Teil einer anderen Anwendung? –

+0

@Andreas Rejbrand: Ich habe darüber nachgedacht, es zu einer separaten Anwendung zu machen, aber ich muss Zugriff auf die Interna der Anwendungen haben (für einige Capture/Replay-Mechanismen). – jpfollenius

+0

Die Verwendung von Named Pipes für die Kommunikation zwischen zwei Anwendungen ist ziemlich einfach. Sehen Sie sich [cromis-ipc] (http://www.cromis.net/blog/downloads/cromis-ipc/) für einen guten Start an. –

Antwort

15

Wenn ShowModal aufgerufen wird, sind alle vorhandenen Top-Level-Fenster deaktiviert. So soll Modalität funktionieren. Wenn Sie ein Fenster haben, mit dem die Interaktion sinnvoll ist, müssen Sie es nur noch einmal aktivieren.

Zum Beispiel könnten Sie dies zu Ihrem Nutzungsfenster hinzufügen:

type 
    TMyUtilityForm = class(TForm) 
    protected 
    procedure WMEnable(var Message: TWMEnable); message WM_ENABLE; 
    end; 
.... 
procedure TMyUtilityForm.WMEnable(var Message: TWMEnable); 
begin 
    if not Message.Enabled then 
    EnableWindow(Handle, True); 
    inherited; 
end; 

Dies wird sicherstellen, dass Ihr Programmfenster kann nie deaktiviert werden.

+2

+1. David weiß immer, wie die Dinge funktionieren! :) –

+1

@AndreasRejbrand Sehr nett von dir zu sagen, und ich kann nur wünschen, es wäre tatsächlich wahr! ;-) –

+0

Ich würde einen 'WM_ENABLE' Handler und einen Aufruf von' EanbleWindow() 'vor dem geerbten Aufruf verwenden. Würde natürlicher aussehen. –

Verwandte Themen