Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObjectlist.add bei Objecten mit Parametern im create Aufruf (https://www.delphipraxis.net/80063-tobjectlist-add-bei-objecten-mit-parametern-im-create-aufruf.html)

Klaus01 2. Nov 2006 12:56


TObjectlist.add bei Objecten mit Parametern im create Aufruf
 
Hallo,

hier meine Typendeklaration:

Delphi-Quellcode:
 

TfeedType = set of (audio,video,html,none);

PfeedSet = ^TfeedSet;
TfeedSet = record
  feedType : TfeedType;
  itemTitle: String[125];
  itemUrl     : String[125];
  prev,next: PfeedSet;
end;


Tfeed = class(TObject)
   feedBD: File of TfeedSet;
   item: TfeedSet;

   title:String[125];
   DLPath:String[125];

   itemList: PfeedSet;
   firstItem,lastItem:pointer;

 private
   constructor create(aDLPath:String;aFeedTitle:String);
   destructor free;
 public
   procedure addItem(aFeedItem:TfeedSet);
   procedure deleteItem(aPointer:Pointer);
   function findItem(aTitle:String):pointer;
   function getItem(aPointer:Pointer):TFeedSet;
end;
Bei dem create Constructor von Tfeed benötige ich Parameter die dem Objekt übergeben werden sollen.

Wenn ich jetzt mehrere Objekte in einer ObjectList verwalten möchte, wird ja
wenn ich TObjectList.add(TFeed) das Object in der Liste instantiiert.

Wie kann ich der ganzen Geschichte dann Parameter mitgeben?

Oder sollte ich das mit der ObjectList sein lassen und anstelle dessen ein dynamisches Array hernehmen.

Brauche mal einen kleinen Denkanstoß.

Grüße
Klaus

Cöster 2. Nov 2006 13:06

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Zitat:

Zitat von Klaus01
Wenn ich jetzt mehrere Objekte in einer ObjectList verwalten möchte, wird ja
wenn ich TObjectList.add(TFeed) das Object in der Liste instantiiert.

Ich versteh nicht ganz. Suchst du vielleicht TObjectList.Add(TFeed.Create(<Parameter>))?

Muetze1 2. Nov 2006 13:10

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Hi!

- Die Definition von "feedBD: File Of TFeedSet" kann doch aus der Klasse raus, oder? In der Klasse willst du doch mit firstItem und LastItem auf die im Speicher vorhandenen Items zugreifen. Somit braucht diesen Filetype hier keiner. Diesen bräuchtest du nur lokal in der Lade/Speicher Methode zu deklarieren.
- TfeedSet ist ein Record und kein Objekt, daher frage ich mich, wo bei dir ein Objekt instanziiert wird?
- Wozu brauchst du noch itemList: PfeedSet;, wenn du mit firstItem und LastItem doch schon den Anfang und Ende der verketteten Liste hast?
- Die beiden Zeiger (firstItem,lastItem:pointer;), sollten die nicht eher vom Typ PfeedSet sein anstatt untypisiert als Pointer?
- Constructor und Destructor sind beide öffentlich (public). Du kannst sie nicht in eine geringere Sichtbarkeitsebene verschieben (private), daher musst du sie dort rausnehmen. Wenn die beiden Methoden private wären, dann könntest du ja niemals von aussen eine Klasse instanziieren oder freigeben.

Zitat:

Zitat von Klaus01
... wird ja wenn ich TObjectList.add(TFeed) das Object in der Liste instantiiert.

Falsch! Die TObjectList kennt ja den Typen der Klasse nicht welchen du ihr gibst und kann somit schlecht diesen instanziieren. Du übergibst bei Add() der TObjectList immer schon fertige Instanzen.

Zitat:

Zitat von Klaus01
Wie kann ich der ganzen Geschichte dann Parameter mitgeben?

Wieso änderst du nicht TFeedSet von einem Record in ein Objekt und entfernst die Pointer für die verkettete Liste. Dann kannst du TFeedSet einen Constructor definieren mit den Parametern die du brauchst um das Objekt zu intialisieren. Und TObjectList wäre dann auch nutzbar.

Thorben77 2. Nov 2006 13:15

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Auch wenn jetzt schon andere vor mir geantwortet haben:

Zitat:

Zitat von Klaus01
Wenn ich jetzt mehrere Objekte in einer ObjectList verwalten möchte, wird ja
wenn ich TObjectList.add(TFeed) das Object in der Liste instantiiert.

Nein :wink: . Das Objekt erstellst Du ganz normal mit
Delphi-Quellcode:
MeineFeedVariable := TFeed.Create(Die Parameter...);
Zur Objektliste hinzufügen kann man es dann so:
Delphi-Quellcode:
ObjectList.Add(MeineFeedVariable);
Zitat:

Zitat von Klaus01
Oder sollte ich das mit der ObjectList sein lassen und anstelle dessen ein dynamisches Array hernehmen.

Die Klasse TObjectList bzw. TList kapselt auch nur ein dynamisches Array.

Nebenbei:
Den Destruktor Deiner TFeed-Klasse solltest Du lieber Destroy nennen, sonst verdeckt er die Free-Methode. Und die sollte man aufrufen, wenn man das Objekt freigeben will, nicht den Destruktor direkt.

Klaus01 2. Nov 2006 13:24

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Hallo Thomas,

danke für die schnelle Antwort:

Zitat:

- Die Definition von "feedBD: File Of TFeedSet" kann doch aus der Klasse raus, oder? In der Klasse willst du doch mit firstItem und LastItem auf die im Speicher vorhandenen Items zugreifen. Somit braucht diesen Filetype hier keiner. Diesen bräuchtest du nur lokal in der Lade/Speicher Methode zu deklarieren
.

feedDB ist eine Datei die ich bei der Erstellung des Object einlesen und daraus eine verkettet Liste machen will.
firstItem und lastItem beinhalten die Adresse des ersten und letzten Elements der verketten Liste.

Zitat:

-TfeedSet ist ein Record und kein Objekt, daher frage ich mich, wo bei dir ein Objekt instanziiert wird?
Das TFeedSet ein Record ist, ist mir bewußt. Es beschreibt den Datensatz der feedDB. (Da muß ich noch die Pointer rausschmeißen)

Zitat:

- Die beiden Zeiger (firstItem,lastItem:pointer;), sollten die nicht eher vom Typ PfeedSet sein anstatt untypisiert als Pointer?
Ich denke, daß dies nicht unbedingt sein muß, da die Zeiger nur Adressen beinhalte und nicht unbedingt von der Datenstruktur wissen müßen.

Zitat:

- Constructor und Destructor sind beide öffentlich (public). Du kannst sie nicht in eine geringere Sichtbarkeitsebene verschieben (private), daher musst du sie dort rausnehmen. Wenn die beiden Methoden private wären, dann könntest du ja niemals von aussen eine Klasse instanziieren oder freigeben.
Habe ich nicht bedacht, werde ich ändern.

Zitat:

Wieso änderst du nicht TFeedSet von einem Record in ein Objekt und entfernst die Pointer für die verkettete Liste.
Dann kannst du TFeedSet einen Constructor definieren mit den Parametern die du brauchst um das Objekt zu intialisieren.
Und TObjectList wäre dann auch nutzbar.
Danke, da werde ich intensiver darüber nachdenken und es gegebenenalls anpassen.

Grüße
Klaus

Klaus01 2. Nov 2006 13:28

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Hallo Thorben,

danke für Deinen Beitrag.

Zitat:

Zitat von Thorben77
Zitat:

Zitat von Klaus01
Oder sollte ich das mit der ObjectList sein lassen und anstelle dessen ein dynamisches Array hernehmen.

Die Klasse TObjectList bzw. TList kapselt auch nur ein dynamisches Array.

Habe ich so noch nicht gesehen.

Zitat:

Zitat von Thorben77
Nebenbei:
Den Destruktor Deiner TFeed-Klasse solltest Du lieber Destroy nennen, sonst verdeckt er die Free-Methode. Und die sollte man aufrufen, wenn man das Objekt freigeben will, nicht den Destruktor direkt.

Das mit free schaut in der Deklaration so aus, in der free Methode wird aber noch inherited free aufgerufen.
Das konntest Du aber nicht wissen.

Grüße
Klaus

Muetze1 2. Nov 2006 13:32

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Zitat:

Zitat von Klaus01
Zitat:

- Die Definition von "feedBD: File Of TFeedSet" kann doch aus der Klasse raus, oder? In der Klasse willst du doch mit firstItem und LastItem auf die im Speicher vorhandenen Items zugreifen. Somit braucht diesen Filetype hier keiner. Diesen bräuchtest du nur lokal in der Lade/Speicher Methode zu deklarieren
.

feedDB ist eine Datei die ich bei der Erstellung des Object einlesen und daraus eine verkettet Liste machen will.
firstItem und lastItem beinhalten die Adresse des ersten und letzten Elements der verketten Liste.

Trotzden ist der Dateityp doch nur in den Laden/Speichern Methoden interessant und nicht in der Klasse selber?!

Zitat:

Zitat von Klaus01
Zitat:

-TfeedSet ist ein Record und kein Objekt, daher frage ich mich, wo bei dir ein Objekt instanziiert wird?
Das TFeedSet ein Record ist, ist mir bewußt. Es beschreibt den Datensatz der feedDB. (Da muß ich noch die Pointer rausschmeißen)

Wenn dem so ist, dann bewege ihn in den privaten Teil der Unit (unter Implementation), da es nach aussen nicht nötig ist den Aufbau der Datei zu kennen, oder?

Zitat:

Zitat von Klaus01
Zitat:

- Die beiden Zeiger (firstItem,lastItem:pointer;), sollten die nicht eher vom Typ PfeedSet sein anstatt untypisiert als Pointer?
Ich denke, daß dies nicht unbedingt sein muß, da die Zeiger nur Adressen beinhalte und nicht unbedingt von der Datenstruktur wissen müßen.

Tun sie auch weiterhin. Sie bleiben Zeiger, sie bleiben gleich gross, etc. Dafür hast du aber den Vorteil über firstItem.next dir gleich mal den 2. Eintrag zu holen, etc.

Jelly 2. Nov 2006 13:33

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Zitat:

Zitat von Klaus01
firstItem und lastItem beinhalten die Adresse des ersten und letzten Elements der verketten Liste.

Das versteh ich nicht ganz. Wenn du deine Objekte in einer TObjectList ablegst, so kannst Du doch problemlos die Methoden der TObjectList nutzen, um auf deine Elemente zuzugreifen. Dann brauchst du doch nicht nochmals innerhalb des Objektes einen Pointer zu seinen Nachbarn (next und prior).

Klaus01 2. Nov 2006 13:35

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Zitat:

Zitat von Cöster
Zitat:

Zitat von Klaus01
Wenn ich jetzt mehrere Objekte in einer ObjectList verwalten möchte, wird ja
wenn ich TObjectList.add(TFeed) das Object in der Liste instantiiert.

Ich versteh nicht ganz. Suchst du vielleicht TObjectList.Add(TFeed.Create(<Parameter>))?

Hallo,

Das hilft mir ein gutes Stück weiter.

Grüße
Klaus

Thorben77 2. Nov 2006 13:39

Re: TObjectlist.add bei Objecten mit Parametern im create Au
 
Zitat:

Zitat von Klaus01
Habe ich so noch nicht gesehen.

Das stimmt ja auch gar nicht. Es ist ja gar kein dynamisches Array :oops: . Nur ein ganz ordinäres statisches.

Zitat:

Zitat von Klaus01
Das mit free schaut in der Deklaration so aus, in der free Methode wird aber noch inherited free aufgerufen.

Es ist aber üblich, den Destruktor zu überschreiben, nicht die Free-Methode. (Was nicht heißt, dass man es nicht machen kann.)
Es ist üblich, den Destruktor destroy zu nennen, denn wenn man ihn Free nennt, verdeckt er die Free-Methode.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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