Verbesserte Objekt-Stringlisten
Verfasst am: Donnerstag, 06. Mrz. 2014 um 21:48Ich bin mittlerweile dazu übergegangen, Stringlisten mit Objekten zur Verwaltung meiner internen Datenstrukturen zu verwenden. Für mich haben sie den Vorteil, das man sie durch eine einfache Einstellung von Anfang an sortiert aufbauen kann. Gerade die Suche nach einem Element der Liste wird dadurch viel effizienter, da dafür eine binäre Suche angewendet wird. Allerdings habe ich recht häufig vergessen, das ein einfaches freigeben der Liste nicht reicht, um sämtlichen Speicherplatz wieder freizugeben. Die Objekte blieben dadurch häufig stehen. Um diese Fehlerquelle für immer auszuschließen, habe ich mich entschlossenen, die Stringlisten-Klasse zu erweitern. Dazu musste ich 2 Funktionen der Stringlistenklasse überschreiben und eine neue hinzufügen.
- Der Destruktor „Destroy()“ leert nun die Stringliste, bevor das Listenobjekt freigegeben wird.
- Die Funktion „Clear()“, die zum leeren der Liste dient, gibt nun eventuell vorhandene Objekte frei.
- Die neue Funktion „DeleteObject()“ löscht ein Element aus der Stringliste und gibt das dazugehörige Objekt frei.
Weiterhin behinderte mich die Tatsache, das man die Zeichenkette eines Elementes nicht verändern konnte, wenn die Liste sortiert ist. Da ich nun bereits eine eigene Klasse hatte, kümmerte ich mich auch gleich um dieses Problem. Hier reichte es aus, eine einzelne Funktion zu überschreiben.
- In der Funktion „Put()“ wird nun das alte Element aus der Liste gelöscht und ein neues mit der geänderten Zeichenkette erstellt. Der Zeiger auf das Objekt wird dabei übernommen.
Hier der Quelltext der kompletten Klasse:
”delphi“ |Quellcode kopieren |?
01 unit claNVStringList;02 03 interface04 05 uses classes;06 07 type08 TNVStringList = class(TStringList)09 private10 protected11 public12 {*** Destruktor der Klasse ***}13 destructor Destroy; override;14 {*** Löscht alle Items der Liste ***}15 procedure Clear; override;16 {*** Löscht ein Item und das dazugehörige Object aus der Liste ***}17 procedure DeleteObject(AIndex:Integer);18 {*** Austausch eines Strings in der Sortierten Liste ***}19 procedure Put(AIndex: Integer; const AValue: string); override;20 end;21 22 implementation23 24 {*** Destruktor der Klasse ***}25 destructor TNVStringList.Destroy;26 begin27 Clear;28 29 inherited Destroy;30 end;31 32 {*** Löscht alle Items der Liste ***}33 procedure TNVStringList.Clear;34 var I:Integer;35 begin36 for I := 0 to Count-1 do begin37 if Objects[I] <> nil then begin38 Objects[I].Free;39 end;40 end;41 42 inherited Clear;43 end;44 45 {*** Löscht ein Item und das dazugehörige Object aus der Liste ***}46 procedure TNVStringList.DeleteObject(AIndex:Integer);47 begin48 if Objects[AIndex] <> nil then begin49 Objects[AIndex].Free;50 end;51 Delete(AIndex);52 end;53 54 {*** Austausch eines Strings in der Sortierten Liste ***}55 procedure TNVStringList.Put(AIndex: Integer; const AValue: string);56 var Obj:TObject;57 begin58 if Sorted then begin59 Obj := Objects[AIndex];60 Delete(AIndex);61 if Obj = nil then begin62 Add(AValue);63 end else begin64 AddObject(AValue,Obj);65 end;66 end else begin67 inherited Put(AIndex,AValue);68 end;69 end;70 71 end.72
Ähnliche Artikel:
Tags: Delphi, Stringliste