Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verschiedene TObject-Typen in TObjectList (https://www.delphipraxis.net/117396-verschiedene-tobject-typen-tobjectlist.html)

Yheeky 17. Jul 2008 13:09


Verschiedene TObject-Typen in TObjectList
 
Hi,

ich würde gerne folgende Situation mit TObjectList und TObject realisieren.
Ich habe ein Objekt Auto und Fahrrad:

Delphi-Quellcode:
type
  TAuto = class(TObject)
  Marke,
  Modell : String;
  AnzahlTueren : Integer;
end;

type
  TFahrrad = class(TObject)
  Marke,
  Modell : String;
  Gaenge : Integer;
end;
Ich hätte jetzt gerne eine Sammlung mit den Objekten. Wie mache ich das, wenn ich mich bei der Sammlung nicht auf einen Typen festlegen möchte?

Aenogym 17. Jul 2008 13:12

Re: Verschiedene TObject-Typen in TObjectList
 
Delphi-Quellcode:
uses contnrs;

{ ... }

var ol: TObjectList;
begin
  ol := TObjectList.create();

  //hinzufügen:
  ol.add(auto1);
  ol.add(fahhrad1);
  ol.add(auto2);

  //und wieder bekommen:
  case ol[0].ClassType of
    TAuto: showmessage('es ist ein auto');
    TFahrrad: showmessage('es ist ein fahrrad');
  end;
end;
Grüße,
Steffen

Yheeky 17. Jul 2008 13:27

Re: Verschiedene TObject-Typen in TObjectList
 
Zitat:

Zitat von Aenogym
Delphi-Quellcode:
uses contnrs;

{ ... }

var ol: TObjectList;
begin
  ol := TObjectList.create();

  //hinzufügen:
  ol.add(auto1);
  ol.add(fahhrad1);
  ol.add(auto2);

  //und wieder bekommen:
  case ol[0].ClassType of
    TAuto: showmessage('es ist ein auto');
    TFahrrad: showmessage('es ist ein fahrrad');
  end;
end;
Grüße,
Steffen

Super, so einfach geht das?! Danke!

Die Zeile case ol[0].ClassType of funktioniert aber so nicht..."Ordinaltyp erforderlich" ist die Meldung. Mit IF funktioniert´s aber :-)

tomsel 17. Jul 2008 13:34

Re: Verschiedene TObject-Typen in TObjectList
 
Was bei deinem Beispiel nicht funktionieren würde wären zugriffe auf die Eigenschaften Marke und Modell, ohne dabei den Klassentyp zu prüfen. Hier kann man eine gemeinsame Oberklasse extrahieren, z.Bsp. "Fahrzeug"

Delphi-Quellcode:
type

  TFahrzeug = class
  public
    Marke,
    Modell : String;
  end;

  TAuto = class(TFahrzeug)
  public
    AnzahlTueren : Integer;
  end;

  TFahrrad = class(TFahrzeug)
  public
    Gaenge : Integer;
  end;
Dann geht auch sowas:

Delphi-Quellcode:
  ShowMessage(ol[0].Marke + ' ' + ol[0].Modell);
[edit] geht natürlich so nur, wenn ol eine spezielle Objektliste ist. Sonst muss man dabei zumindest auf TFahrzeug casten. [/edit]

Aenogym 17. Jul 2008 13:38

Re: Verschiedene TObject-Typen in TObjectList
 
Zitat:

Zitat von Yheeky
Die Zeile case ol[0].ClassType of funktioniert aber so nicht..."Ordinaltyp erforderlich" ist die Meldung. Mit IF funktioniert´s aber :-)

Sorry, das stimmt natürlich.

Zitat:

Zitat von tomsel
Was bei deinem Beispiel nicht funktionieren würde wären zugriffe auf die Eigenschaften Marke und Modell, ohne dabei den Klassentyp zu prüfen. Hier kann man eine gemeinsame Oberklasse extrahieren, z.Bsp. "Fahrzeug"

Wenn man erstmal weiß, welcher Typ sich hinter dem Objekt befindet, könnte man auch with (ol[0] as TAuto) do benutzen. Zumindest hätte ich es so gemacht ;)
edit: Aber das Einführen der Oberklasse ist natürlich sinnvoll und besserer Stil.

Steffen

Yheeky 17. Jul 2008 13:45

Re: Verschiedene TObject-Typen in TObjectList
 
Zitat:

Zitat von Aenogym
Aber das Einführen der Oberklasse ist natürlich sinnvoll und besserer Stil.

So hab ich´s nun auch gemacht - danke! :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr.

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