Posts Tagged ‘Stringliste’

Verbesserte Objekt-Stringlisten

Donnerstag, März 6th, 2014

Ich 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:

unit claNVStringList;

interface

uses classes;

type
TNVStringList = class(TStringList)
private
protected
public
{*** Destruktor der Klasse ***}
destructor Destroy; override;
{*** Löscht alle Items der Liste ***}
procedure Clear; override;
{*** Löscht ein Item und das dazugehörige Object aus der Liste ***}
procedure DeleteObject(AIndex:Integer);
{*** Austausch eines Strings in der Sortierten Liste ***}
procedure Put(AIndex: Integer; const AValue: string); override;
end;

implementation

{*** Destruktor der Klasse ***}
destructor TNVStringList.Destroy;
begin
Clear;

inherited Destroy;
end;

{*** Löscht alle Items der Liste ***}
procedure TNVStringList.Clear;
var I:Integer;
begin
for I := 0 to Count-1 do begin
if Objects[I] <> nil then begin
Objects[I].Free;
end;
end;

inherited Clear;
end;

{*** Löscht ein Item und das dazugehörige Object aus der Liste ***}
procedure TNVStringList.DeleteObject(AIndex:Integer);
begin
if Objects[AIndex] <> nil then begin
Objects[AIndex].Free;
end;
Delete(AIndex);
end;

{*** Austausch eines Strings in der Sortierten Liste ***}
procedure TNVStringList.Put(AIndex: Integer; const AValue: string);
var Obj:TObject;
begin
if Sorted then begin
Obj := Objects[AIndex];
Delete(AIndex);
if Obj = nil then begin
Add(AValue);
end else begin
AddObject(AValue,Obj);
end;
end else begin
inherited Put(AIndex,AValue);
end;
end;

end.