Hallo,
hier eine mögliche Lösung, die auf marabus Vorschlag basiert:
Delphi-Quellcode:
type
TCounterList = class (TStringList)
private
function GetCounter (const aName: string): Cardinal;
procedure SetCounter (const aName: string; aValue: Cardinal);
public
function CountByIndex (aIndex: Integer): Cardinal;
procedure SortByCount;
property Counter [const aName: string]: Cardinal
read GetCounter write SetCounter;
end;
function CompareCount (List: TStringList; Index1, Index2: Integer): Integer;
begin
with TCounterList(List) do
Result := CountByIndex(Index2) - CountByIndex(Index1); // umgekehrte Sortierung
end;
function TCounterList.GetCounter (const aName: string): Cardinal;
begin
Result := CountByIndex(IndexOf(aName));
end;
function TCounterList.CountByIndex (aIndex: Integer): Cardinal;
begin
if ((aIndex >= 0) and (aIndex < Count)) then
Result := Integer(Objects[aIndex])
else
Result := 0;
end;
procedure TCounterList.SetCounter (const aName: string; aValue: Cardinal);
var
k : Integer;
begin
k := IndexOf(aName);
if (k < 0) then
k := Add(aName);
Objects[k] := TObject(aValue);
end;
procedure TCounterList.SortByCount;
begin
CustomSort (CompareCount);
end;
Die Anwendung könnte so aussehen:
Delphi-Quellcode:
const
FMT_Rang = 'Rang %d: %s (Anzahl=%d)';
FMT_Haus = 'Häuser: %d';
FMT_Tier = 'Tiere: %d';
var
List : TCounterList;
begin
List := TCounterList.Create;
List.Counter['Haus'] := 200;
List.Counter['Baum'] := 50;
List.Counter['Auto'] := 114;
List.Counter['Person'] := 14;
List.Counter['Blume'] := 344;
List.Counter['Tier'] := 9;
List.SortByCount;
Memo1.Clear;
Memo1.Lines.Add(Format(FMT_Rang, [1, List[0], List.CountByIndex(0)]));
Memo1.Lines.Add(Format(FMT_Rang, [2, List[1], List.CountByIndex(1)]));
Memo1.Lines.Add(Format(FMT_Rang, [3, List[2], List.CountByIndex(2)]));
Memo1.Lines.Add('');
Memo1.Lines.Add(Format(FMT_Haus,[List.Counter['Haus']]));
Memo1.Lines.Add(Format(FMT_Tier,[List.Counter['Tier']]));
List.Free;
end;
Wer es ganz sauber mag, der leitet nicht von TStringList ab, sondern verwendet eine lokale Instanz der Stringliste in der TCounterList-Klasse. Damit können nur die benötigten Methoden und Eigenschaften nach außen sichtbar gemacht werden.
Gruß Hawkeye