Einzelnen Beitrag anzeigen

fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#1

Überprüfen, ob ein Pointer auf ein Objekt zeigt

  Alt 3. Nov 2009, 14:09
Hallo Experten, folgendes Problem:

Ich möchte eine Listenklasse erstellen, die von TList abgeleitet ist. In allen Methoden, die einen Pointer zur Liste hinzufügen oder einen entfernen, möchte ich, falls es sich bei dem übergebenen Pointer um ein Objekt eines bestimmten Typs handelt, eine Methode davon aufrufen. Zur Überprüfung, ob es sich um diesen Typ handelt, benutze ich den is-Operator.
Diese Liste möchte ich applikationsweit als Ersatz von TList verwenden.

Das funktioniert auch wunderbar, solange die Liste ausschließlich mit Objekten gefüttert wird. Aber wehe, man versucht das mit Zeigern auf Records, dann gibt es eine AV - hier ein Beispiel:

Delphi-Quellcode:
type
  TMyObject = class (TObject) { Der Typ, auf den ich prüfen möchte }
  public
    procedure DoSomething();
  {...}
  end;

  TMyList = class (TList)
  public
    function Add (AItem : Pointer) : Integer; reintroduce;
    {...}
  end;

implementation
  
function TMyList.Add (AItem : Pointer) : Integer;
var
  obj : TObject;
begin
  obj := AItem; { Cast auf TObject, um "is" anwenden zu können }
  if obj is TMyObject then { <== hier schepperts, wenn AItem ein "normaler" Zeiger ist }
    TMyObject (AItem).DoSomething;
  Result := inherited Add (AItem);
end;
Ich bin mir darüber im klaren, dass der Cast auf TObject an sich schon problematisch ist - aber mir fällt keine andere Möglichkeit ein, herauszufinden um was es sich bei dem Pointer handelt. Natürlich könnte man die Exception abfangen und dann davon ausgehen, dass AItem kein Objekt ist, aber das fände ich auch unsauber.
Kann jemand helfen?
  Mit Zitat antworten Zitat