Mega Code Archive

 
Categories / Delphi / String
 

How to easily implement a 2 dimensional stringlist !

Title: How to easily implement a 2-dimensional stringlist ! Question: How to append additional data to a string in a stringlist, listbox, memo or combobox ! Answer: To add strings in a stringlist is very easy: var hSL: TStringList; begin hSL:= TStringList.Create; hSL.Add('any string...'); hSL.Destroy; end; Howevery - sometimes you need to add additional information to every string. This can be done by the objects-property: var hIndex: integer; // any number that specifies the line begin hSL.Add('my string'); hSL.Sort; hIndex:= hSL.IndexOf('my string'); hSL.Objects[hIndex] := TStringList.Create; TStringList(hSL.Objects[hIndex]).Add('any substring...'); end; The definition of the object property looks like this: property Objects[Index: Integer]: TObject; It takes an index where any object (every delphi class derives from TObject) can be assigned respectively appended. To get the right index we call the function 'IndexOf'. IndexOf only works when the stringlist is sorted ! Having the index whe can append a new stringlist: hSL.Objects[hIndex] := TStringList.Create; With a typecast this 'sub-stringlist' can be filled: TStringList(hSL.Objects[hIndex]).Add('any substring...'); If you need to parse the sub-stringlist, just do this: for i:= 0 to hSL.Count - 1 do for ii:= 0 to TStringList(hSL.Objects[i]).Count - 1 do Memo1.Lines.Add(TStringList(hSL.Objects[i]).Strings[ii]); When the application terminates every substringlist has to be destroyed explicitely: for i:= 0 to hSL.Count - 1 do hSL.Objects[i].Destroy; Now you can destroy the main stringlist itself: hSL.Destroy; Of course you can also define your own 'data-container' that can be appended to every line in the stringlist. Just define a class: type TSLData = class public X1: integer; x2: string; // etc. end; ... hSL.Objects[hIndex] := TSLData.Create; TSLData(hSL.Objects[hIndex]).X1 := 123; TSLData(hSL.Objects[hIndex]).X2 := '123'; The great thing is that this works in the same way for every VCL class that uses TStings like: TMemo TListbox TCombobox etc. or other classes that provide a Data property, like: TTreeView or TListView