Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zum "is"-Operator (https://www.delphipraxis.net/178729-frage-zum-operator.html)

QStorm 23. Jan 2014 15:36

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:
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;
Ich habe im Forum und restlichen Internet leider kein passendes Thema gefunden.
Falls es ein doch bereits eines gibt, verzeiht mir den Doppel-Post.

Vielen Dank im Voraus :)

Sir Rufo 23. Jan 2014 15:39

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

QStorm 23. Jan 2014 15:44

AW: Frage zum "is"-Operator
 
Zitat:

Zitat von Sir Rufo (Beitrag 1245070)
Delphi-Quellcode:
var
  LWinControl : TWinControl;

if Assigned( Self.ActiveControl ) and ( Self.ActiveControl is TWinControl ) then
begin
  LWinControl := Self.ActiveControl as TWinControl;
  ...
end

Das funktioniert leider nicht, da "Self.ActiveControl is TWinControl" True zurück liefert, obwohl das Objekt, auf das "Self.ActiveControl" zeigt, nicht kompatible zu TWinControl ist.

DeddyH 23. Jan 2014 15:47

AW: Frage zum "is"-Operator
 
Zeig mal Deinen Code, irgendwas erscheint mir da komisch.

Sir Rufo 23. Jan 2014 15:54

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 http://www.delphipraxis.net/1243656-post12.html

DeddyH 23. Jan 2014 15:56

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.

Mikkey 23. Jan 2014 15:57

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:
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;
Wird zuerst eine Box mit "false" und dann eine mit "true" gezeigt, so wie man es auch erwarten würde.

Sir Rufo 23. Jan 2014 15:58

AW: Frage zum "is"-Operator
 
Zitat:

Zitat von DeddyH (Beitrag 1245080)
Und wenn man wie im obigen Code ein Objekt, dass kein TWinControl ist, einfach hart nach TWinControl castet, ist der Erfolg recht überschaubar.

Die Frage ist eigentlich, wie kommt in
Delphi-Quellcode:
ActiveControl
etwas rein, was nicht von
Delphi-Quellcode:
TWinControl
abgeleitet ist?

DeddyH 23. Jan 2014 16:00

AW: Frage zum "is"-Operator
 
Keine Ahnung, ich hätte es ja mal versucht, habe aber just in diesem Moment Feierabend :mrgreen:

himitsu 23. Jan 2014 16:47

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:
if obj.ClassType = TIrgendwas then

if obj.ClassName = 'TIrgendwas' then

if obj.ClassNameIs('TIrgendwas') then
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.


Zitat:

Delphi-Quellcode:
if Assigned(obj) and (obj is TIrgendwas) then

Das IS prüft auch auf Assigned.

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 16:52 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz