Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Object in Variable sichern? (https://www.delphipraxis.net/75304-object-variable-sichern.html)

rwachtel 17. Aug 2006 13:06

Re: Object in Variable sichern?
 
Zitat:

Zitat von moelski
Aha, also funktioniert das so wie ich es gemacht habe? [...]

Ja.

moelski 17. Aug 2006 13:07

Re: Object in Variable sichern?
 
Ok, dann bin ich erstmal glucklitsch :-D

Vielen Dank für die Antworten !! :hello:

moelski 17. Aug 2006 13:11

Re: Object in Variable sichern?
 
Moin nochmal ...

Öhm so ganz scheint das aber noch nicht zu gehen.

Wenn ich folgendes schreibe:
Delphi-Quellcode:
LastObject := SpectraII;
Dann müsste ich doch mittels LastObject auf Funktionen von SpectraII zugreifen können oder nicht?
Weil das bräuchte ich auch ...

Das funktioniert aber so nicht, denn ich bekomme den Fehler "[Fehler] DeviceUtils.pas(1023): Undefinierter Bezeichner: 'IsLogData'"
Der Aufruf war:
Delphi-Quellcode:
LastObject.IsLogData(Data);
Wie kriege ich das denn hin das LastObject.IsLogData funktioniert?

rwachtel 17. Aug 2006 13:17

Re: Object in Variable sichern?
 
Nein, Du kannst nur auf die Methoden und Eigenschaften der Basisklasse (hier: TObject) zugreifen.

Abhilfe schafft ein Typecasting:
Delphi-Quellcode:
TSpectraII(LastObject).IsLog(Data);
Daher der Tipp mit der Basisklasse und den virtuellen Methoden.

moelski 17. Aug 2006 13:17

Re: Object in Variable sichern?
 
Ah ok. Das hilft mir weiter.

Vielen Dank !

DGL-luke 17. Aug 2006 13:23

Re: Object in Variable sichern?
 
LastObject ist als TObject deklariert. Der Compiler kann also nicht wissen, dass deine eigene Klasse dahintersteckt. Du musst also entweder einen Typecast machen:

Delphi-Quellcode:
TSpectraII(LastObject).IsLog(Data); //hart
(LastObject as TSpectraII).IsLog(Data); //weich
ein weicher cast ist übrigens meist vorzuziehen, dabei wird eine überprüfung vorgenommen, ob auch wirklich das richtige objekt vorliegt.

ansonsten solltest du eine basisklasse definieren, die diese methode bereits enthält, wie rwachtel geschrieben hat. das geht so:

Delphi-Quellcode:
type
  TDevice = class {abstract} (TObject); //class abstract funktioniert ab Delphi 2005
  public
    function IsLogData: Boolean; virtual; abstract;
  end;
das schlüsselwort "virtual" besagt, dass die methode in einer nachfolgerklasse überschrieben werden kann, "abstract", dass sie in dieser Klasse nicht implementiert (=ausprogrammiert) wird.

überschrieben wird sie dann so:

Delphi-Quellcode:
type
  TSpectraII = class(TDevice)
  public
    function IsLogData; override;
  end;
override sorgt dafpr, dass der aufruf von IsLogData nicht auf die abstrakte Methode des vorgängers prallt, sondern auf die tatsächliche klasse umgeleitet wird.

Muetze1 17. Aug 2006 20:18

Re: Object in Variable sichern?
 
Zitat:

Zitat von rwachtel
Abhilfe schafft ein Typecasting:
Delphi-Quellcode:
TSpectraII(LastObject).IsLog(Data);

Er hat mehrere unterschiedliche Klassen in LastObject - das ist in so fern richtig gefährlich einen harten Typecast zu empfehlen - das ist mehr als gefährlich sowas als Antwort zu posten! Harter Typecast wäre ok, wenn vorher der Klassentyp mit dem IS Operator überprüft wurde. Oder halt ein weicher Typecast, dieser liefert NIL, wenn die Klasse nicht stimmt - da er selber nochmal einen Vergleich mit IS vornimmt.

Khabarakh 17. Aug 2006 20:57

Re: Object in Variable sichern?
 
Zitat:

Zitat von Muetze1
Oder halt ein weicher Typecast, dieser liefert NIL, wenn die Klasse nicht stimmt - da er selber nochmal einen Vergleich mit IS vornimmt.

So funktioniert der Operator in anderen Sprachen, under Anderem C#, in Delphi jedoch wird eine EInvalidCast-Exception geworfen.

Muetze1 17. Aug 2006 22:22

Re: Object in Variable sichern?
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von Muetze1
Oder halt ein weicher Typecast, dieser liefert NIL, wenn die Klasse nicht stimmt - da er selber nochmal einen Vergleich mit IS vornimmt.

So funktioniert der Operator in anderen Sprachen, under Anderem C#, in Delphi jedoch wird eine EInvalidCast-Exception geworfen.

Sorry, stimmt, mein Fehler. So manchmal kommt man doch schon durcheinander...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr.
Seite 2 von 2     12   

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-2025 by Thomas Breitkreuz