Vergleich von Delphi und Visual C++ - Inhalt
Vergleich von Delphi und Visual C++ - Inhalt
Vergleich von Delphi und Visual C++ - Inhalt
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Vergleich</strong> <strong>von</strong> <strong>Delphi</strong> <strong>und</strong> <strong>Visual</strong> <strong>C++</strong> - Kapitel 2C<br />
type<br />
MeineMsg = record<br />
Msg: Cardinal;<br />
Text: String;<br />
end;<br />
// die ersten 4 Byte für Botschafts-Nummer<br />
// Beispiel für einen Botschafts-<strong>Inhalt</strong><br />
A = class<br />
public<br />
procedure Botschaftbehandlung1(var M: MeineMsg); message 1;<br />
end;<br />
procedure A.Botschaftbehandlung1(var M: MeineMsg);<br />
begin<br />
writeln('A: Botschaft ', M.Text, ' erhalten.');<br />
end;<br />
var<br />
ObjA: A;<br />
Nachricht: MeineMsg;<br />
begin<br />
ObjA:= A.Create;<br />
Nachricht.Msg:= 1;<br />
// NachrichtenNummer eintragen<br />
Nachricht.Text:= 'Guten Tag'; // Nachrichten<strong>Inhalt</strong> eintragen<br />
ObjA.Dispatch(Nachricht); // Nachricht verschicken<br />
ObjA.Free;<br />
end.<br />
Programm-Ausgabe: A: Botschaft Guten Tag erhalten.<br />
In diesem Beispiel schickt Objekt A eine Botschaft an sich selbst. Das ist nicht besonders sinnvoll, demonstriert aber den Mechanismus des<br />
Versendens <strong>und</strong> Empfangens <strong>von</strong> Botschaften. Durch den Aufruf <strong>von</strong> Dispatch wird eine Botschaft verschickt. Der Empfänger der<br />
Botschaft ist klar bestimmt. Es ist aber für den Sender unerheblich, <strong>von</strong> welchem Klassen-Typ der Empfänger ist; der Empfänger kann<br />
irgendein beliebiges Objekt sein.<br />
Die Prozedur Dispatch, die in allen Objekten bekannt ist, erledigt auch das Auffinden der zur Botschaft passenden Methode <strong>und</strong> ruft diese<br />
dann auf. Dazu sucht Dispatch zuerst in der DMT der tatsächlichen Klasse der Instanz nach einer Methode mit der in der Botschaft<br />
enthaltenen Nummer. Ist dort keine solche Methode enthalten, wird, wie bei allen dynamischen Methoden, die Tabelle des Vorfahren der<br />
Klasse durchsucht, dann die <strong>von</strong> dessen Vorfahren, <strong>und</strong> so weiter. In welchem Schutzabschnitt einer Klasse (private, protected, public)<br />
eine Botschaftsbehandlungs-Methode definiert wurde, ist für den Empfang <strong>von</strong> Botschaften unerheblich.<br />
Es ist ein entscheidendes Merkmal der Botschaftsbehandlungs-Methoden, daß für den Aufruf einer botschaftsverarbeitenden Methode über<br />
Dispatch nur deren Nummer entscheidend ist. Der Name der Methode ist völlig irrelevant (im Beispiel lautet er Botschaftbehandlung1). Es<br />
ist insbesondere möglich, eine botschaftsverarbeitende Methode durch eine Methode völlig anderen Namens zu überschreiben, solange nur<br />
die Nummern übereinstimmen.<br />
Enthält beim Aufruf <strong>von</strong> Dispatch der gesamte in Frage kommende Zweig der Klassenhierarchie keine Methode mit der angegebenen<br />
Nummer, dann wird eine virtuelle Methode DefaultHandler aufgerufen, die in der Basisklasse TObject wie folgt deklariert ist:<br />
procedure DefaultHandler(var Message); virtual;<br />
Ein Aufruf dieser Methode bewirkt nichts, weil der Funktionsrumpf der Methode leer ist. Es ist aber möglich, DefaultHandler zu<br />
überschreiben, um ein anderes Standardverhalten bei unbehandelten Nachrichten zu implementieren, zum Beispiel die Ausgabe einer<br />
Fehlermeldung. Innerhalb der Klassenbibliothek VCL ruft die Methode DefaultHandler für Fenster-Klassen die Windows-API-Funktion<br />
http://ourworld.compuserve.com/homepages/praxisservice/kapit2c.htm (16 of 33) [19.05.2000 15:30:15]