Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TObjectList unterschiedliche Objekte erkennen? (https://www.delphipraxis.net/163966-tobjectlist-unterschiedliche-objekte-erkennen.html)

mcbain 24. Okt 2011 07:26

TObjectList unterschiedliche Objekte erkennen?
 
Hallo,
ich speichere in einer TObjectList unterschiedliche Objekte ab. Meine Frage lautet nun, wie kann ich beim auslesen der Objekte erkennen, um welches Objekt es sich handelt?

Die Objekte, welche ich in der List ablege, sind alle von einem anderen Objekt (TAuto) abgeleitet.
Ich habe folgendese probiert:

Code:
for i := 0 to ObjectList.Count - 1 do
begin
  Auto := TAuto(Result.Items[i]);

  if (Auto is TCabrio) then
     ShowMessage('Es ist ein Cabrio');

  if (Auto is TCoupe) then
     ShowMessage('Es ist ein Coupe');
end;
Funktioniert aber nicht.

Wäre nett, wenn mir jemand bitte helfen könnte. Bin wohl noch nicht ganz ausgeschlafen ;).
Vielen Dank.

DeddyH 24. Okt 2011 07:38

AW: TObjectList unterschiedliche Objekte erkennen?
 
Was bedeutet "funktioniert nicht"? Eigentlich sollte es, wenn ich nichts übersehen habe und die Daten auch wirklich stimmen.

Sir Rufo 24. Okt 2011 07:44

AW: TObjectList unterschiedliche Objekte erkennen?
 
Zitat:

Zitat von DeddyH (Beitrag 1132118)
Was bedeutet "funktioniert nicht"? Eigentlich sollte es, wenn ich nichts übersehen habe und die Daten auch wirklich stimmen.

Und ich würde sagen, dass ohne weiteren Code, das auch nicht funktioniert.
Delphi-Quellcode:
ObjectList
vs
Delphi-Quellcode:
Result
?

mcbain 24. Okt 2011 07:46

AW: TObjectList unterschiedliche Objekte erkennen?
 
Das heißt, dass er mir nicht erkennt, um welche Klasse es sich handelt. Obwohl ich in meine ObjectList ein TCabrio eingetragen habe, erkennt er mir hier

Code:
if (Auto is TCabrio) then
     ShowMessage('Es ist ein Cabrio');
nicht, dass es sich um ein TCabrio Objekt handelt.

@Sir Rufo: Sorry, das heißt natürlich nicht Result sondern Objectlist.

DeddyH 24. Okt 2011 07:47

AW: TObjectList unterschiedliche Objekte erkennen?
 
Na gut, so gesehen. Auf jeden Fall zu wenig Infos.

Lemmy 24. Okt 2011 07:51

AW: TObjectList unterschiedliche Objekte erkennen?
 
Zitat:

Zitat von mcbain (Beitrag 1132120)
Das heißt, dass er mir nicht erkennt, um welche Klasse es sich handelt. Obwohl ich in meine ObjectList ein TCabrio eingetragen habe, erkennt er mir hier

Code:
if (Auto is TCabrio) then
     ShowMessage('Es ist ein Cabrio');
nicht, dass es sich um ein TCabrio Objekt handelt.

Und was für eine Klasse hat dann das Objekt (Auto.ClassName)?

DeddyH 24. Okt 2011 07:57

AW: TObjectList unterschiedliche Objekte erkennen?
 
Und zeigen Result und ObjectList auf dasselbe Objekt? Diese Frage von Sir Rufo scheint das Entscheidende zu sein.

mcbain 24. Okt 2011 08:08

AW: TObjectList unterschiedliche Objekte erkennen?
 
Ok, ich versuche es beispielhaft zu erklären.
Habe folgende Klassen:

TAuto:
Code:
 TAuto = class(TObject)
      private    
        FHersteller: string;    

      published
        property Hersteller: string read FHersteller write FHersteller;
      end;
TCabrio:
Code:
 TCabrio = class(TAuto)
      private    
        FSitze: integer;    

      published
        property FSitze: string read FSitze write FSitze;
      end;
TCoupe:
Code:
 TCoupe= class(TAuto)
      private    
        FSitze: integer;    

      published
        property FSitze: string read FSitze write FSitze;
      end;

Nun speichere ich Objekte in meiner TObjectlist:
Code:
var: AutoListe: TObjectList;
     Cabrio: TCabrio;
     Coupe: TCoupe:
     Auto: TAuto;

 AutoListe := TObjectList.Create;
 Auto := TAuto.Create;
 Auto.FHersteller := 'BMW';

 Coupe:= TCoupe(Auto);
 Coupe.FSitze := 4;

 AutoListe.Add(Coupe);



 Auto := TAuto.Create;
 Auto.FHersteller := 'VW';

 Cabrio:= TCabrio(Auto);
 Cabrio.FSitze := 2;

 AutoListe.Add(Cabrio);
Und hier möchte ich auselesen, um welches Objekt es sich handelt:
Code:
for i := 0 to ObjectList.Count - 1 do
begin
  Auto := TAuto(ObjectList.Items[i]);

  if (Auto is TCabrio) then
     ShowMessage('Es ist ein Cabrio');

  if (Auto is TCoupe) then
     ShowMessage('Es ist ein Coupe');
end;
Aber es wird mir keine ShowMessage-Box erzeugt, somit erkennt er mir auch nicht mein Objekt.

webcss 24. Okt 2011 08:18

AW: TObjectList unterschiedliche Objekte erkennen?
 
Dein Problem liegt hier:
Zitat:

Zitat von mcbain (Beitrag 1132126)
Nun speichere ich Objekte in meiner TObjectlist:
Code:
...
 Auto := TAuto.Create;
 Auto.FHersteller := 'BMW';

 Coupe:= TCoupe(Auto);
 Coupe.FSitze := 4;

 AutoListe.Add(Coupe);

...

Du erzeugst ein TAuto und castest dann in eine Unterklasse, speicherst aber immer "nur" ein TAuto. Sollte eigentlich so heißen:
Delphi-Quellcode:
Coupe := TCoupe.Create;
Coupe.FHersteller := 'BMW';
Coupe.FSitze := 4;
AutoListe.Add(Coupe);
Dies ist beispielhaft für jede Unterklasse von TAuto. Dann funktioniert es auch mit
Delphi-Quellcode:
if Objectlist[i] is TCoupe then...

Andreas L. 24. Okt 2011 08:19

AW: TObjectList unterschiedliche Objekte erkennen?
 
Du erstellst die Objekte falsch. Versuch es mal so:
Delphi-Quellcode:
var: AutoListe: TObjectList;
     Cabrio: TCabrio;
     Coupe: TCoupe:
     Auto: TAuto;

 AutoListe := TObjectList.Create;

 Coupe:= TCoupe.Create;
 Coupe.Hersteller := 'BMW';
 Coupe.Sitze := 4;

 AutoListe.Add(Coupe);

 Cabrio := TCabrio.Create;
 Cabrio.Hersteller := 'VW';
 Cabrio.Sitze := 2;

 AutoListe.Add(Cabrio);


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr.
Seite 1 von 2  1 2      

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