Delphi ist ein objektorientiertes visuelles Softwareentwicklungstool der Borland Company. Delphi vereint die Vorteile von Visual C++ und Visual Basic: einfach zu bedienen, leistungsstark und bietet einzigartige Vorteile, insbesondere im Schnittstellendesign, in der Datenbankprogrammierung und in der Netzwerkprogrammierung.
Nachrichten in Delphi
Eine Nachricht ist eine von Windows gesendete Benachrichtigung, die einer Anwendung mitteilt, dass ein Ereignis aufgetreten ist. In Delphi sind Windows-Nachrichten in den meisten Fällen in VCL-Ereignisse gekapselt. Wenn wir jedoch eigene Steuerelemente schreiben, Nachrichten abfangen oder filtern müssen, müssen wir uns mit dem Win32-Meldungsverarbeitungsmechanismus befassen.
In Delphi werden Nachrichten in Form von TMessage-Datensätzen definiert. Öffnen Sie die Datei Message.pas. Wir können sehen, dass Tmessage wie folgt definiert ist:
Typ
TMessage = gepackter Datensatz
Nachricht: Kardinal;
case Ganzzahl von
0: (WParam: Longint;
LParam: Longint;
Ergebnis: Longint);
1: (WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Wort;
ResultLo: Wort;
ErgebnisHi: Word);
Ende;
Unter diesen ist Msg ein konstanter Wert, der sich von anderen Nachrichten unterscheidet. Diese konstanten Werte können vordefinierte Konstanten in Windows-Einheiten oder benutzerdefinierte Konstanten sein. Wparam ist normalerweise ein konstanter Wert, der sich auf eine Nachricht bezieht, oder es kann ein Handle für ein Fenster oder Steuerelement sein. LParam ist normalerweise ein Zeiger auf Daten im Speicher.
Ergebnis ist der Rückgabewert der Nachrichtenverarbeitung. Wparam, Lparam und Result sind alle 32-Bit. Wenn Sie auf die unteren 16 Bits oder die oberen 16 Bits zugreifen möchten, können Sie WparamLo, WparamHi, LParamLo, LparamHi, ResultLo und ResultHi verwenden.
Zusätzlich zur allgemeinen Tmessage wird in Delphi für jedes Windows ein spezieller Nachrichtendatensatz definiert. Wir können die Datei Message.pas durchsuchen. Hier ist der Tastaturnachrichtendatensatz:
TWMKey = gepackter Datensatz
Nachricht: Kardinal;
CharCode: Wort;
Unbenutzt: Wort;
Schlüsseldaten: Lange Ganzzahl;
Ergebnis: Longint;
Tastaturbezogene Nachrichten wie die Datensätze WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP und WM_SYSCHAR werden ebenfalls als TWMkey definiert. In der Datei Message.pas gibt es die folgende Anweisung:
TWMChar=TWMkey; TWMKeyDown=
TWMkey; TWMKeyUp=TWMkey;
-KeyDown=TWMkey; TWMSysKeyUp=
TWMkey;TWMSysChar=TWMkey;
Versenden von Nachrichten
Bei der Nachrichtenverarbeitung wird definiert, wie die Anwendung auf Windows-Nachrichten reagiert. In Delphi muss jede Nachricht eine Methode in einem Objekt sein und kann nur eine Tmessage oder einen anderen speziellen Nachrichtendatensatz übergeben. Nach der Methodendeklaration muss eine Nachricht im Bereich von 0 folgen bis Constant zwischen 32767.
Die zuvor erwähnten Meldungen sind alle Standard-Windows-Meldungen (WM_X). Darüber hinaus gibt es VCL-interne Meldungen, Benachrichtigungsmeldungen und benutzerdefinierte Meldungen.
Interne VCL-Nachrichten beginnen normalerweise mit „CM_“ und werden zur Verwaltung von Dingen innerhalb der VCL verwendet. Wenn Sie einen Eigenschaftswert oder andere Merkmale einer Komponente ändern, müssen Sie andere Komponenten über interne Nachrichten über die Änderung informieren. Beispielsweise wird die Nachricht „Eingabefokus aktivieren“ an eine aktivierte oder deaktivierte Komponente gesendet, um den Eingabefokus zu akzeptieren oder aufzugeben.
Es gibt auch Benachrichtigungsmeldungen mit einem untergeordneten Steuerelement in einem Fenster und das übergeordnete Fenster muss benachrichtigt werden. Dies wird durch Benachrichtigungsmeldungen erreicht. Es funktioniert nur mit Standard-Fenstersteuerelementen wie Schaltflächen, Listenfeldern, Bearbeitungsfeldern usw. Öffnen Sie die Datei Message.pas. Nach dem Standard-Windows folgt die Deklaration der Benachrichtigungsmeldung:
const
{$EXTERNALSYM BN_CLICKED}
BN_CLICKED = 0;
{$EXTERNALSYM BN_PAINT}
BN_PAINT = 1;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2;
Oben sind die Benachrichtigungsmeldungen der Schaltfläche aufgeführt, die jeweils anzeigen, dass der Benutzer auf die Schaltfläche geklickt hat, dass die Schaltfläche neu gezeichnet werden sollte und dass der Benutzer die Schaltfläche markiert hat.
Benutzer können auch eigene Nachrichten definieren, Nachrichten an sich selbst senden und Nachrichtenverarbeitungsverfahren schreiben. Der konstante Wert der Nachricht ist WM_USER+100 bis $7FFF. Dieser Bereich ist von Windows für benutzerdefinierte Nachrichten reserviert.
Es gibt drei Methoden zum Senden von Delphi-Nachrichten:
1. Objektmethode der Tcontrol-Klasse ausführen. Sie können Nachrichten an jedes Formular oder Steuerelement senden. Sie müssen lediglich die Instanz des Formulars oder Steuerelements kennen. Seine Aussage lautet wie folgt:
Funktion Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint
2. Windows-API-Funktionen SendMessage() und Postmessage(). Seine Aussage lautet wie folgt:
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
Die PostMessage-Funktion fügt der Nachrichtenwarteschlange der Anwendung eine Nachricht hinzu. Die Nachrichtenschleife der Anwendung extrahiert die registrierte Nachricht aus der Nachrichtenwarteschlange und sendet sie dann an das entsprechende Fenster.
Die SendMessage-Funktion kann Nachrichten über die Nachrichtenwarteschlange direkt an die Fensterprozedur senden. Daher wird SendMessage verwendet, wenn Windows sofort einen Wert zurückgeben muss, und PostMessage wird verwendet, wenn verschiedene Anwendungen Nachrichten nacheinander verarbeiten müssen. Perform ähnelt im Wesentlichen SendMessage, sie werden direkt an die Fensterprozedur gesendet. Die Funktionen „SendMessage“ und „Postmessage“ müssen nur das Handle des Fensters zum Senden von Nachrichten kennen, damit sie eine Nachricht an ein Nicht-Delphi-Formular senden können. Perform muss jedoch die Instanz des Formulars oder Steuerelements kennen.
VCL-Nachrichtenverarbeitungsmechanismus
Es gibt die Anweisung application.Run im Quellcode der Delphi-Anwendung. Ihre Funktion besteht darin, die Nachrichtenschleife zu starten und dann Application.PRocessMessage aufzurufen. Diese Funktion findet eine Nachricht in der Nachrichtenwarteschlange der Anwendung. Wenn eine Nachricht aus der Nachrichtenwarteschlange abgerufen wird, wird das Application.OnMessage-Ereignis ausgelöst. Auf diese Weise reagiert Windows auf die Verarbeitung des OnMessage-Ereignisses, bevor es die Nachricht selbst verarbeitet. Es ist jeder Nachrichtenverarbeitung überlegen und empfängt nur registrierte Nachrichten, d. h. die von PostMessage gesendeten Nachrichten, wie oben erwähnt. Der Verarbeitungsprozess, der auf das Application.OnMessage-Ereignis reagiert, muss vom Typ TmessageEvent sein, der wie folgt deklariert wird:
type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) des Objekts;
Wobei TMsg der in Windows definierte Nachrichtendatensatz ist, können wir ihn wie folgt deklarieren:
Prozedur OnMyMessage(var Msg:TMsg;var Handled:Boolean);
Weisen Sie dann diese Methode dem Application.OnMessage-Ereignis zu:
Application.OnMessage :=OnMyMessage;
Das OnMessage-Ereignis erfasst alle an die Anwendung gesendeten Nachrichten. Dabei handelt es sich um ein sehr ausgelastetes Ereignis. Daher ist es unklug, während der Verarbeitung des OnMessage-Ereignisses Haltepunkte für die Nachrichtenverarbeitung festzulegen.
Die vom VCL-Objekt zum Empfangen von Nachrichten verwendete Methode heißt MainWndProc. Es handelt sich um eine statische Methode, die in der Twincontrol-Klasse definiert ist und nicht überladen werden kann. Die Nachricht wird nicht direkt verarbeitet, wenn sie MainWndProc verlässt. Die WndProc-Methode ist eine in der Tcontrol-Klasse definierte virtuelle Methode, die die Dispatch-Methode aufruft. Dispatch sucht anhand der eingehenden Nachricht nach der entsprechenden Verarbeitungsmethode. Wenn es sie am Ende nicht finden kann, sucht es weiter nach der Nachrichtenverarbeitungsmethode in der übergeordneten Klasse, bis sie nicht gefunden wird. Die Defaulthandler-Methode führt die abschließende Verarbeitung der Nachricht durch und übergibt die Nachricht dann an die Windows-Funktion DefWindowProc oder andere Standardfensterprozeduren.