Hallo,
ich finde den TIntegerWrapper hier nicht so gut. Es gehört zu den best practices eines framework designers jeder Klasse eine tag property mitzugeben, wenn diese Klasse keine rein interne Funktion hat. Mal ist diese property eine Integer (Tag), mal ein Pointer (Data) und mal ein TObject. Es wurde jeweils der Typ gewählt, der am sinnvollsten erschien - alle anderen Typen müssen über einen type cast passend gemacht werden. Das ist nichts verwerfliches und es genügt, wenn der type cast geeignet gekapselt wird. Der Wrapper bringt in diesem konkreten Fall Mehraufwand, dem kein Nutzen gegenüber steht.
Delphi-Quellcode:
function GetCount(sl: TStrings; const s: String): Integer;
var
index: Integer;
begin
index := sl.IndexOf(s);
if index < 0
then Result := 0
else Result := Integer(sl.Objects[index]);
end;
procedure SetCount(sl: TStrings; const s: String);
var
index: Integer;
begin
index := sl.IndexOf(s);
if index < 0
then sl.AddObject(s, Pointer(1))
else sl.Objects[index] := Pointer(Succ(Integer(sl.Objects[index])));
end;
procedure TDemoForm.DemoButtonClick(Sender: TObject);
var
sl: TStringList;
i: Integer;
begin
sl := TStringList.Create;
sl.Sorted := True;
sl.Duplicates := dupIgnore;
SetCount(sl, 'so');
SetCount(sl, 'oder');
SetCount(sl, 'So');
ListBox.Clear;
for i := 0 to Pred(sl.Count) do
ListBox.Items.Add(Format('%s = %d', [sl[i], GetCount(sl, sl[i])]));
sl.Free;
end;
Grüße vom marabu