![]() |
Delphi-Version: 5
Frage zum "is"-Operator
Hallo,
Ich habe eine Frage zum "is"-Operator. Soweit ich das nachvollziehen konnte prüft er, ob der Pointer von einem bestimmten Typ ist. Ich würde jedoch gerne wissen ob das Objekt, auf das der Pointer zeigt, von einem bestimmten Typ ist. Hintergrund: Ich bekomme von TForm.ActiveControl einen Pointer auf ein Objekt, das nicht vom Typ TWinControl ist. Das führt im weiteren Verlauf zu einer Access Violation, da ich auf nicht existente Methoden zugreife. Wie kann man herausbekommen, ob das Objekt, auf das ein Pointer zeigt, von einem bestimmten Typ ist? Hier ein Beispiel-Code, mit dem man das ganze nachvollziehen kann:
Code:
Ich habe im Forum und restlichen Internet leider kein passendes Thema gefunden.
procedure TForm1.Button1Click(Sender: TObject);
var stringList : TStringList; obj : TObject; control : TWinControl; begin stringList := (TStringList.Create); obj := TObject(stringList); control := TWinControl(obj); control.ClassType if (control is TWinControl) then ShowMessage('True') else ShowMessage('False'); end; Falls es ein doch bereits eines gibt, verzeiht mir den Doppel-Post. Vielen Dank im Voraus :) |
AW: Frage zum "is"-Operator
Delphi-Quellcode:
var
LWinControl : TWinControl; if Assigned( Self.ActiveControl ) and ( Self.ActiveControl is TWinControl ) then begin LWinControl := Self.ActiveControl as TWinControl; ... end |
AW: Frage zum "is"-Operator
Zitat:
|
AW: Frage zum "is"-Operator
Zeig mal Deinen Code, irgendwas erscheint mir da komisch.
|
AW: Frage zum "is"-Operator
Zeig uns doch mal, was zu dem Zeitpunkt dieses hier zurückgibt
Delphi-Quellcode:
.
ShowMessage( GetClassInheritancePathFrom( Self.ActiveControl ) );
Die Funktion findest du hier ![]() |
AW: Frage zum "is"-Operator
Und wenn man wie im obigen Code ein Objekt, dass kein TWinControl ist, einfach hart nach TWinControl castet, ist der Erfolg recht überschaubar.
|
AW: Frage zum "is"-Operator
Anscheinend liefert der 'is' immer true, wenn die Referenz den passenden Typ hat, das lässt sich nachvollziehen.
Wenn Du aber den Code in dieser Form abänderst:
Delphi-Quellcode:
Wird zuerst eine Box mit "false" und dann eine mit "true" gezeigt, so wie man es auch erwarten würde.
procedure TForm1.Button1Click(Sender: TObject);
var stringList : TStringList; obj : TObject; control : TWinControl; begin stringList := (TStringList.Create); obj := TObject(stringList); if (obj is TWinControl) then ShowMessage('True') else ShowMessage('False'); obj := Button1; if (obj is TWinControl) then ShowMessage('True') else ShowMessage('False'); end; |
AW: Frage zum "is"-Operator
Zitat:
Delphi-Quellcode:
etwas rein, was nicht von
ActiveControl
Delphi-Quellcode:
abgeleitet ist?
TWinControl
|
AW: Frage zum "is"-Operator
Keine Ahnung, ich hätte es ja mal versucht, habe aber just in diesem Moment Feierabend :mrgreen:
|
AW: Frage zum "is"-Operator
Wenn du direkt auf einen Typ prüfen willst, dann mußt du den Typ auch direkt "vergleichen".
z.B.:
Delphi-Quellcode:
Im Gegensatz zum IS muß man hier aber auf Assigned selber prüfen, auch wenn Emba das im ClassNameIf eigentlich hätte mit aufnehmen können.
if obj.ClassType = TIrgendwas then
if obj.ClassName = 'TIrgendwas' then if obj.ClassNameIs('TIrgendwas') then Zitat:
TRUE = wenn ein Objekt drin ist und wenn es dem Typ entspricht, oder davon abgeleitet wurde. Das AS läßt aber ein NIL durch, denn NIL könnte man auch als den Typ ansehen, nur daß keine Instanz davon vorhanden ist. AS knallt also nur, wenn ein "falscher" Typ drin ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz