05.11.2013 Aufrufe

Vergleich von Delphi und Visual C++ - Inhalt

Vergleich von Delphi und Visual C++ - Inhalt

Vergleich von Delphi und Visual C++ - Inhalt

MEHR ANZEIGEN
WENIGER ANZEIGEN

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]

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!