Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Verwalten von Objekten in einer Container-Klasse (https://www.delphipraxis.net/88218-verwalten-von-objekten-einer-container-klasse.html)

Luckie 16. Mär 2007 08:33

Re: Verwalten von Objekten in einer Container-Klasse
 
Du hast gut aufgepasst. ;) Es war gestern schon spät und ich habe im neuen Büro acht Stunden Wände weiß angemalt, das ist nichts für Programmierer. :mrgreen:

bernau 16. Mär 2007 08:52

Re: Verwalten von Objekten in einer Container-Klasse
 
Zitat:

Zitat von OldGrumpy
die Schleife könnte also genauso gut vorwärts laufen.

Prinzipiell ist es doch egal, ob die Schleife vorwärts oder rückwärts läuft. Hauptsache die Items werden freigegeben.

Es sei denn, daß die Ausführungsgeschwindigkeit ggf. schneller ist, wenn's vorwärts läuft.

Preisfrage. Wer weis es :-)

bernau 16. Mär 2007 08:59

Re: Verwalten von Objekten in einer Container-Klasse
 
Zitat:

Zitat von Elvis
Delphi-Quellcode:
var
  list     : TMyListItems;
  item     : TMyListItem;
  evilValue : PInteger;
begin
  ...
  new(evilValue);
  list.Add(evilValue);

  item := list[0];

  WriteLn(item.Name); //Hmpf? Was steht denn da drin?


Ich hab'S nicht getestet, aber...

Delphi-Quellcode:
  list.Add(evilValue);

Hier müstest du eigendlich einen Compilerfehler bekommen, da die Function Add überschrieben wurde und nur noch ein Ergebnis zurückliefert und keine Parameter erwartet.



Gerd

OldGrumpy 16. Mär 2007 16:02

Re: Verwalten von Objekten in einer Container-Klasse
 
@bernau, lies nochmal genau das Tutorial, dann findest Du sicher die Begründung warum es eben NICHT immer egal ist :mrgreen:

@luckie: Ja, das kommt mir bekannt vor *g* In erster Linie gings mir darum, zu wissen ob ich was übersehen hätte oder nicht. :)

bernau 16. Mär 2007 22:06

Re: Verwalten von Objekten in einer Container-Klasse
 
Zitat:

Zitat von OldGrumpy
@bernau, lies nochmal genau das Tutorial, dann findest Du sicher die Begründung warum es eben NICHT immer egal ist :mrgreen:

Solche Antworten veranlassen mich eigendlich immer sofort eine Diskussion abzubrechen und nicht mehr zu antworten.:evil: Ich kommer mir dabei immer vor wie im Kindergarten. Warum kann man es nicht auf den Punkt bringen und folgendermassen antworten:

Zitat:

Zitat von So wünsche ich mir die Antwort
@bernau, lies nochmal genau das Tutorial, im Abschnitt "Den Speicher verwalten" im dritten Absatz steht steht die Begründung warum es eben NICHT immer egal ist :mrgreen:

Ich kann leider keine Gedanken lesen. Deshalb kann ich nur vermuten, daß du diesen Absatz meinst.

Erst geht man die Liste durch und gibt alle in ihr enthaltenen Objekte frei. Dann gibt man die Liste selber frei. Wichtig ist, dass die Schleife rückwärts laufen muss, da die Eingangsbedingung einer for-Schleife nur beim Eintritt in die Schleife geprüft wird, aber in der Schleife entfernen wir ja Elemente, so dass wir, wenn die Schleife vorwärts liefe, über die Anzahl der Elemente hinauslaufen würden.

Nur ist diese Aussage schlichtweg falsch. In dem Beispiel werden in der Schleife lediglich die Objekte freigegeben. Die Menge der Elemente verändert sich nicht, da kein Delete aufgerufen wird. Daher ist es tatsächlich egal, ob die Schleife vorwärts oder rückwärts läuft. Wie du es ja selber geschrieben hast:

Zitat:

Zitat von OldGrumpy
Du führst doch nur ein Free() aus und kein Delete()

Es ist schon klar, daß man eine Schleife nicht vorwärts laufen lassen darf, wenn in der schleife die Elemente durch ein Delete entfernt werden.

Aber ich habe mich ja auf das Beispiel von Luckie bezogen. Und bei diesem Beispiel ist es tatsächlich egal ob vorwärts oder rückwärts. Einen Fehler wird's nicht geben. Mich hat eben nur interessiert ob es für dieses Beispiel tatsächlich einen Grund geben könnte, die Schleife in eine bestimmte Richtung laufen zu lassen.

Der einzige Grund hierbei rückwärts zu zählen ist IMHO, daß eine Prüfung des Schleifenzählers auf 0 schneller verarbeitet wird, als die Prüfung, ob der Schleifenzähler eine bestimmte Zahl erreicht hat. Aber ob daß tatsächlich ein ausschlaggebender Punkt ist, bezweifele ich.

Aber vieleicht gibt's ja tatsächlich noch andere Gründe.


Gerd

OldGrumpy 18. Mär 2007 10:47

Re: Verwalten von Objekten in einer Container-Klasse
 
@bernau:

Erstens: War schon spät
Zweitens: Warum soll ich Dir alles vorkauen, hast doch die Stelle auch selber gefunden. Ich unterstütze Denkfaulheit nicht.
Drittens: Ich schrieb "nicht *immer*" - Luckie hatte ja bereits geschrieben dass das etwas anders geplant war, und weiter oben im Tutorial gibts genau so eine Stelle wo alle Objekte abgeräumt werden - "schlicht falsch" ist meilenweit daneben.
Viertens: Damit Du nicht wieder ne Beschwerde posten musst, hier noch die Info dass ich mich auf TContactList.Delete() aus dem Tutorial beziehe.
Fünftens: Schönen Sonntag noch! :cheers:

bernau 18. Mär 2007 11:35

Re: Verwalten von Objekten in einer Container-Klasse
 
Zitat:

Zitat von OldGrumpy
Zweitens: Warum soll ich Dir alles vorkauen, hast doch die Stelle auch selber gefunden. Ich unterstütze Denkfaulheit nicht.

Das hat nichts mit Denkfaulheit zu tun. Es hilft nur ungemein, wenn man weis worauf sich ein Kommentar bezieht.

Zitat:

Zitat von OldGrumpy
Viertens: Damit Du nicht wieder ne Beschwerde posten musst, hier noch die Info dass ich mich auf TContactList.Delete() aus dem Tutorial beziehe.

Was allerdings nichts mit der besagten Schleife zu tun hat.:zwinker:

Zitat:

Zitat von OldGrumpy
Fünftens: Schönen Sonntag noch! :cheers:

Jo. Lass uns wieder Freunde sein. :kiss:

SvB 17. Apr 2007 14:48

Re: Verwalten von Objekten in einer Container-Klasse
 
Hallo,

sehr interessant, da ich auch gerade so was brauche und auch einiges schon selbst sehr ähnlich gemacht habe.
Um mein Verständnis etwas zu erweitern, bzw. Euren Rat einzuholen folgende Frage / Erweiterung - ist das so OK:
Kann ich Methode wie folgt implementieren. Alles was im Beispiel gleich ist, habe ich jetzt hier nicht mehr reingepakt.

Delphi-Quellcode:
TContactList = class(TObject)
private
  FOnContactAdded: TNotifyEvent;
public
  destructor Destroy; override;
  function AddContact: TContact;
  procedure DeleteAllItems;
end;

TContactList.AddContact: TContact;
begin
  Result := TContact.Create(self);
  FInnerList.Add(Result);
  if Assigned(FOnContactAdded) then FOnContactAdded(Result);
end;

TContactList.DeleteAllItems;
var
  i : Integer;
begin
  if FInnerList.Count > 0 then begin
    for i := FInnerList.Count - 1 downto 0 do begin
      TObject(FInnerList.Items[i]).Free;
    end;
  end;
  FInnerList.Clear;
  // Würde FInnerList.Clear nicht auch alle Objekte freigeben?
end;

destructor TContactList.Destroy;
begin
  DeleteAllItems;
  FInnerList.Free;
  inherited;
end;
Was meint Ihr?

Grüße
Sven

bernau 17. Apr 2007 15:29

Re: Verwalten von Objekten in einer Container-Klasse
 
Zitat:

Zitat von SvB
// Würde FInnerList.Clear nicht auch alle Objekte freigeben?

Nur wenn FInnerList.OwnsObjects = true. Ansonstem muss man sich selber um die Freigabe der Objekte kümmern.


GErd

Elvis 17. Apr 2007 15:39

Re: Verwalten von Objekten in einer Container-Klasse
 
Nimm' als InnerList eine TobjectList mit OwnsObject = true.
Und zum löschen, rufst du einfach ihr Clear auf. (Du nennst es dann natürlich auch Clear ;) ).
Falls du einen event auslösen willst, der dich darüber informiert, dass ein Item entfernt wurde, müsste du natürlich wieder rückwärts durchlaufen und alles selbst rauswerfen.
Der Cast zu TObject ist natürlich witzlos, wenn es eine TObjectList ist.

btw: Dupliziere nix was bereits TObjectList implementiert hat, reiche es nur durch.
Code, den du nicht geschrieben hast, musst du auch nicht testen. (wenn er so oft benutzt wird wie TObjectList.Xyz, ist ja fast wie TObject.Free() ;) )


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
Seite 4 von 4   « Erste     234   

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