Thema: Delphi IP-Adressen sortieren

Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#8

Re: IP-Adressen sortieren

  Alt 28. Dez 2004, 11:39
Folgender Funktionsentwurf würde gehen. Dieser ist jetzt weder schön noch gut, aber sollte gehen und Dir einen Ansatz liefern Voraussatzung ist, dass die Werte in einer TStringListe stehen.
Delphi-Quellcode:
// diese Funktion wird an die CustomSort methode der StringList übergeben
// siehe weiter unten für das Beispiel...
function IPSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  S1, S2: String;
  // indizies
  I11, I12, I21, I22,
  // bytewerte
  I1B, I2B: Byte;
begin
  S1 := List[Index1];
  S2 := List[Index2];
  // erstes Byte vergleichen
  I11 := Pos('.', S1);
  I1B := StrToIntDef(Copy(S1, 1, Pred(I11)), -1);
  I21 := Pos('.', S2);
  I2B := StrToIntDef(Copy(S2, 1, Pred(I21)), -1);
  if I1B < I2B then
  begin
    Result := -4
  end
  else if I1B > I2B then
  begin
    Result := 4
  end
  else
  begin
    // zweites Byte vergleichen
    Inc(I11);
    I12 := PosEx('.', S1, I11);
    I1B := StrToIntDef(Copy(S1, I11, I12 - I11), -1);
    Inc(I21);
    I22 := PosEx('.', S1, I21);
    I2B := StrToIntDef(Copy(S2, I21, I22 - I21), -1);
    if I1B < I2B then
    begin
      Result := -3
    end
    else if I1B > I2B then
    begin
      Result := 3
    end
    else
    begin
      // drittes Byte vergleichen
      Inc(I12);
      I11 := PosEx('.', S1, I12);
      I1B := StrToIntDef(Copy(S1, I12, I11 - I12), -1);
      Inc(I22);
      I21 := PosEx('.', S1, I22);
      I2B := StrToIntDef(Copy(S2, I22, I21 - I22), -1);
      if I1B < I2B then
      begin
        Result := -2
      end
      else if I1B > I2B then
      begin
        Result := 2
      end
      else
      begin
        // viertes Byte vergleichen
        Inc(I11);
        I12 := PosEx('.', S1, I11);
        I1B := StrToIntDef(Copy(S1, I11, MaxInt), -1);
        Inc(I21);
        I22 := PosEx('.', S1, I21);
        I2B := StrToIntDef(Copy(S2, I21, MaxInt), -1);
        if I1B < I2B then
        begin
          Result := -1
        end
        else if I1B > I2B then
        begin
          Result := 1
        end
        else
        begin
          Result := 0;
        end;
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SL := TStringList.Create;
  try
    /// WERTE IN DIE STRING-LISTE EINTRAGEN
    ....
    /// STRING-LISTE SORTIEREN
    SL.CustomSort(IPSort);

    /// und zum beispiel in ein Memo schreiben
    Memo1.Lines.Assign(SL);
  finally
    SL.Free;
  end;
end;
......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat