Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Variablen - Größte daraus finden

  Alt 15. Apr 2007, 15:09
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
  Mit Zitat antworten Zitat