Warum sieht mein TFrame eine gepostete Nachricht nicht?

8

Ich habe gerade erst angefangen, TFrames stark zu benutzen (OK, ja, ich habe unter einem Stein gelebt ...). Ich dachte, Frames unterstützten die Deklaration der Message-Handler-Methode - und ich habe viele Beispiele dafür gesehen. Warum sieht diese einfache Testeinheit für einen TFrame nie die Nachricht, die sie selbst veröffentlicht? (Ich habe den Test erstellt, als ich herausfand, dass Nachrichtenhandler in meiner größeren Anwendung nicht aufgerufen wurden.)

%Vor%

Dieser Rahmen enthält nur ein TPanel, und der Rahmen wird auf einem einfachen Hauptformular verwendet, das nur den Rahmen und eine Schließen-Schaltfläche enthält.

Was vermisse ich?

    
Mark Wilsdorf 22.04.2011, 13:08
quelle

2 Antworten

8

Ich sehe zwei Möglichkeiten:

  1. Ihr Programm hat noch nicht mit der Verarbeitung von Nachrichten begonnen. Veröffentlichte Nachrichten werden nur verarbeitet, wenn Ihr Programm GetMessage oder PeekMessage und dann DispatchMessage aufruft. Das geschieht innerhalb von Application.Run . Wenn Ihr Programm dort noch nicht angekommen ist, wird es keine geposteten Nachrichten verarbeiten.

  2. Der Fenstergriff Ihres Frames wurde zerstört und neu erstellt. Der Zugriff auf die Handle -Eigenschaft erzwingt die Erstellung des Fensterhandle des Frames, aber wenn das Elternelement des Frames noch nicht ganz stabilisiert ist, kann es sein eigenes Fensterhandle zerstören und neu erstellen. Dadurch werden alle untergeordneten Elemente gezwungen, dasselbe zu tun. Daher existiert das Handle, zu dem Sie die Nachricht gesendet haben, nicht, wenn Ihr Programm mit der Verarbeitung von Nachrichten beginnt.

Um das erste Problem zu beheben, warten Sie einfach. Ihr Programm beginnt mit der Verarbeitung von Nachrichten. Um das zweite Problem zu beheben, überschreiben Sie die CreateWnd -Methode Ihres Frames und geben die Nachricht dort ein. Diese Methode wird aufgerufen, nachdem das Fensterhandle erstellt wurde, sodass vermieden wird, dass erzwingen das Handle vorzeitig erstellt wird. Es ist jedoch immer noch möglich, dass das Handle zerstört und neu erstellt wird, und CreateWnd wird für jede Zeit aufgerufen. Daher müssen Sie vorsichtig sein, da Ihre Initialisierungsnachricht möglicherweise gepostet wird mehr als einmal (aber nie im selben Fenster mehrmals behandeln). Ob das richtig ist, hängt davon ab, welche Art von Initialisierung Sie durchführen müssen.

    
Rob Kennedy 22.04.2011, 13:16
quelle
3

Die einzige Erklärung hierfür ist, dass das Handle Ihres Frames neu erstellt wird, nachdem Sie die Nachricht gepostet haben und bevor die Nachrichtenwarteschlange gepumpt wird. Versuchen Sie, in einer OnShow zu posten.

    
David Heffernan 22.04.2011 13:16
quelle