Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#14

Re: Was macht Free genau in einem Array

  Alt 9. Dez 2005, 11:48
Hi,
hab mir mal deine Komponente angeschaut und ehrlich gesagt solltest du einiges an der ändern.
Aber ich komme erstmal auf deinen Fehler zu sprechen, wann genau tritt er denn auf? Was genau tust du denn? Ich hab jetzt einfach ein paar mal Add und Delete (sorry, gerade vergessen wie die Methode hieß) an verschiedenen Stellen aufgerufen und es kam kein Fehler.

Unsauber an deinem Programm ist es übrigens, dass du dein Array immer um eine Stelle vergrößerst oder verkleinerst (hatte hier auch schon jmd gesagt, oder?). Das ganze hat in Delphi echt Lustige Effekte, wenn ich mich nicht ganz irre gibt Delphi nämlich nicht den alten Platz frei, reserviert aber auch die neue Größe (alte Länge + 1) und damit hast du einen unnötigen Speicherbedarf.
Gute Alternativen (die intern auch auf Arrays zurückgreifen aber alles schön kapseln) sind die Listen TObjectList, TComponentList und TControlList, wobei erstere für dich wohl am ehesten in Frage kommt.

So, eine andere Sache ist dein FCount. Du kannst eigentlich gänzlich auf diese Variable verzichten (FCount = length(FItems) - 1), aber du solltest auch Klassenvariablen (imho) initialisieren. Die bekommen zwar von Delphi (soviel ich weiß) wirklich immer den Wert 0 zugewiesen, aber Eindeutigkeit schadet nicht.

Ganz schlimm ist es übrigens, dass du dein if then else immer schön in eine Zeile schreibst, solltest du wirklich ändern! Sorry, aber ist nicht meine persönliche Ansicht sondern einer der vielen Punkte zu gutem Code. Es lässt sich einfach leicht übersehen, dass ein else mit in der Zeile steht und es ist durch Einrückung leichter eine Hierachie sichtbar.
Zudem hast du beim Einzelschrittmodus natürlich überhaupt keinen Plan, ob er gerade das if oder das else abarbeitet.

Ja und zu guter Letzt noch was zu deinem Destruktor von TLaufzettel. Warum gibst du denn da nur den aktuellen TDigitalenLaufzettel frei? Deine Komponente TLaufzettel gibt es danach nicht mehr (wenn du ihr Free aufrufst). Also solltest du tunlichst alle TDigitalerLaufzettel freigeben. Und dazu solltest du dann über das ganze Array iterieren
Delphi-Quellcode:
for i := 0 to length(self.FItems) - 1 do
  begin
    self.FItems[i].Free;
  end;
finalize(self.FItems);
setLength(self.FItems, 0);

inherited destroy;
Ach ja, setVersion solltest du eher getVersion nennen

Ja, nicht böse sein, sind nur Stellen die du ändern solltest. Wie gesagt, dein Fehler ist bei mir nicht aufgetreten.

Gruß Der Unwissende
  Mit Zitat antworten Zitat