Hallo Stefan,
im Objektinspektor von Delphi hast Du zwei Tab's, "Eigenschaften" und "Ereignisse". Wenn Du auf die Seite "Ereignisse" wechselst, siehst Du
links alle Ereignisse, welche die ausgewählte(n) Komponenten besitzen. Rechts von jedem Ereignissnamen kannst Du den Namen der mit dem Ereigniss verknüpften Prozedur eintragen. Wenn diese Prozedur noch nicht existiert, legt Delphi automatisch einen Rumpf an. Du kannst aber auch eine Prozedur mit den passenden Übergabeparametern von Hand erstellen und dort eintragen oder eine bereits vorhandene Prozedur diesem Ereigniss zuordnen. In der Combobox rechts neben dem Eigenschaftsnamen werden alle von den Übergabeparametern her passenden Prozeduren angezeigt. Wann das Ereigniss ausgelöst wird und welche Parameter übergeben werden verrät die Hilfe. Einfach den Cursor im Objektinspektor in das Eingabefeld für den Prozedurnamen stellen und F1 drücken. Der Name für die Prozedur zur Ereignissbehandlung ist frei wählbar, man macht sich aber das Leben leichter, wenn man "sprechende" Namen wählt. "EditExit" ist kein gutes Beispiel, es verrät zwar, dass diese Routine beim verlassen des Feldes aufgerufen wird, aber nicht weshalb und warum, "ValidateNumInput" wäre eine bessere Idee, wenn ich prüfen will, ob eine Zahl eingegeben wurde.
Zu der Sache mit dem Cast. Alle Komponenten in Delphi sind durch ein oder mehrfache Ableitung von einem Basistyp entstanden. Eine abgeleitete Komponente erbt alle Eigenschaften und Methoden von ihrer Elternkomponente. Im Fall von TEDit sieht diese Hirarchie so aus:
Quote
TEdit -> TCustomEdit -> TWinControl -> TControl -> TComponent -> TPersistent -> TObject
Da aufgrund der Vererbung eine abgeleitete Komponente alle Eigenschaften ihrer Vorgänger besitzt, darf man einer Variablen vom Typ eines der Vorgänger auch eine davon abgeleitete Komponente zuweisen. Also kann ich einer Variblen vom Typ TObject auch ein TEdit zuweisen.
Somit hat eine Variable genaugenommen zwei Typen, den der bei ihrer Deklaration angegeben wurde und den der Komponente auf die sie real zeigt. Erster ist zur Kompilezeit bekannt und kann sich nicht ändern, der zweite ist erst zur Laufzeit des Programmes bekannt und kann sich mit jeder Zuweisung an diese Variable ändern. Der Kompiler kennt nur den deklarierten Typ und erlaubt somit auch nur den Zugriff auf Eigenschaften und Methoden die für diesen Typ existieren. Der Ausdruck
ist die Anweisung an den Kompiler: "ich weiss, daß Sender nicht vom Typ TEdit ist, tue aber trotzdem so, als ob Sender vom Typ TEdit wäre". Damit setze ich natürlcih die Prüfungsmechanismen des Kompilers ausser Betrieb. Wenn ich die Prozedur nur als Ereignissbehandlung für TEdit's verwende. kann ich sicher sein, daß Sender immer auf ein TEdit zeigt und der Cast wird funktionieren. Die sichere Variante ist
Code
if Sender is TEdit then TEdit(Sender)...
.
Hier prüft der Operator "is" ob Sender wiklich zur Laufzeit auf ein TEdit oder eine davon abgeleitete Komponente zeigt und nur wenn ja, wird der Cast ausgeführt.
Ich hoffe, daß ich Dir etwas weiterhelfen konnte. Sehr zu empfehlen ist auch die Hife von Delphi, sie erklärt viele Sachverhalte sehr anschaulich und mit Beispielen.
P.S. Wo ich hier von Komponenten spreche, müsste es eigentlich Objekte heissen. Die Komponenten in Delphi sind nur eine spezielle Form von Objekten und die Aussagen über Zuweisungsverträglichkeit und so weiter gelten generell für alle Objekte.
Gruß Thomas