Stringliste | BVA-System

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:

 ”delphi“ | 
 
 Quellcode kopieren |
?

01
unit claNVStringList;
02
03
interface
04
05
uses classes;
06
07
type
08
 TNVStringList = class(TStringList)
09
 private
10
  protected
11
  public
12
   {*** 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
implementation
23
24
{*** Destruktor der Klasse ***}
25
destructor TNVStringList.Destroy;
26
begin
27
 Clear;
28
29
 inherited Destroy;
30
end;
31
32
{*** Löscht alle Items der Liste ***}
33
procedure TNVStringList.Clear;
34
var I:Integer;
35
begin
36
 for I := 0 to Count-1 do begin
37
  if Objects[I] <> nil then begin
38
   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
begin
48
 if Objects[AIndex] <> nil then begin
49
  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
begin
58
 if Sorted then begin
59
  Obj := Objects[AIndex];
60
  Delete(AIndex);
61
  if Obj = nil then begin
62
   Add(AValue);
63
  end else begin
64
   AddObject(AValue,Obj);
65
  end;
66
 end else begin
67
  inherited Put(AIndex,AValue);
68
 end;
69
end;
70
71
end.
72