Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualStringTree: IP Adressen sortieren (https://www.delphipraxis.net/143980-virtualstringtree-ip-adressen-sortieren.html)

Piro 27. Nov 2009 10:46


VirtualStringTree: IP Adressen sortieren
 
Moin,

ich würde gerne einmal wissen wie ihr die Sortierung von IP Adressen im VST gelöst habt.
Meine derzeitige Lösung sieht wie folgt aus:
Delphi-Quellcode:
procedure Tfrm_main.vst_network_subnetdetailsCompareNodes(
  Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex;
  var Result: Integer);
var
 SubnetDetailsData1 : TOSubnetDetailsData;
 SubnetDetailsData2 : TOSubnetDetailsData;
 IP1, IP2           : Integer;
begin
 SubnetDetailsData1 := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node1)^);
 SubnetDetailsData2 := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node2)^);
 IP1                := StrToInt(StringReplace(SubnetDetailsData1.ipaddress, '.','',[rfReplaceAll]));
 IP2                := StrToInt(StringReplace(SubnetDetailsData2.ipaddress, '.','',[rfReplaceAll]));

 if column > -1 then
 begin
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'IP Address' then Result := CompareValue(IP1, IP2);
   ...
 end;
end;
Leider werden Sie immer noch flasch sortiert. Ich habe mir schon überlegt, ob ich sie in 4 Teile zerlege und dann die Sortierung durchführe. Diesen Weg wollte ich aber erst am Schluss machen, da er sehr aufwendig ist.

Dank im voraus.

Sven

DeddyH 27. Nov 2009 10:53

Re: VirtualStringTree: IP Adressen sortieren
 
Wäre es nicht sinnvoller, die IP-Adressen(zusätzlich) als DWORD vorzuhalten? Nach diesen könntest Du dann sortieren.

ToFaceTeKilla 27. Nov 2009 10:56

Re: VirtualStringTree: IP Adressen sortieren
 
Und ich schon wieder :lol:
Wie willst du sie denn sortieren? Auf-/absteigend? Oder nach Subnet?
Daraus die nächste Frage: Sortierung über HeaderClick (wie im Explorer) oder von außen gesteuert?
Je nachdem, wie du dir das gedacht hast, ändert sich auch der Ansatz...

Piro 27. Nov 2009 11:14

Re: VirtualStringTree: IP Adressen sortieren
 
OnHeaderClick auf/absteigend.

Wenn ich sie als DWORD abspeichere, ist es dann nicht das selbe was ich gemacht habe? Ich habe sie zum Integer umgewandelt. Oder irre ich mich?

Wie kann man denn aus einem String ein DWORD machen?

DeddyH 27. Nov 2009 11:22

Re: VirtualStringTree: IP Adressen sortieren
 
Das einfache Wandeln in Integer führt nur dann zum gleichen Ergebnis, wenn Du die einzelnen Oktetts 3-stellig im String vorliegen hast. Ansonsten müsstest Du den String zerlegen, die einzelnen Teilstrings in Byte umwandeln, per Bitshifting an die richtige Position verschieben und binär verodern.

Piro 27. Nov 2009 11:24

Re: VirtualStringTree: IP Adressen sortieren
 
Ich habe sie jetzt zerlegt und es funktioniert.

Danke.

generic 27. Nov 2009 14:53

Re: VirtualStringTree: IP Adressen sortieren
 
Zitat:

Zitat von DeddyH
Das einfache Wandeln in Integer führt nur dann zum gleichen Ergebnis, wenn Du die einzelnen Oktetts 3-stellig im String vorliegen hast. Ansonsten müsstest Du den String zerlegen, die einzelnen Teilstrings in Byte umwandeln, per Bitshifting an die richtige Position verschieben und binär verodern.

Das klingt kompliziert.
Warum schreibst du die nicht als Hexzahl hinter einander weg und wandelst dann den Hex in ein DWord?

Code:
192.168.1.2 -> $c0 $a8 $01 $02 -> $c0a80102 -> 3232235778

Piro 7. Dez 2009 20:40

Re: VirtualStringTree: IP Adressen sortieren
 
Ich muss nochmal das Thema aufgreifen.

Ich verstehe das mit dem DWORD nicht ganz. Wenn ich den String der IP Adresse in ein DWORD umwandel, funktioniert die Sortierung dann wie gewünscht?

Wi wandelt man denn 192.168.1.29 in ein DWORD?

Vielen Dank im voraus.

generic 9. Dez 2009 13:35

Re: VirtualStringTree: IP Adressen sortieren
 
eine Möglichkeit:

Delphi-Quellcode:
var
  dwip: dword;
  a,b,c,d: byte;
begin
  a:=192;
  b:=168;
  c:=0;
  d:=1;
  dwip:=strtoint(
      '$'+
      IntToHex(a,2)+
      IntToHex(b,2)+
      IntToHex(c,2)+
      IntToHex(d,2)
  );

himitsu 9. Dez 2009 13:50

Re: VirtualStringTree: IP Adressen sortieren
 
Das Ganze mit dem hexadezimalen Zeugs ist nur ein kleines Bissl unperformant

Zitat:

- String zerlegen
- Zahl-String in Integer umwandeln
- Zahl-String in Integer umwandeln
- Zahl-String in Integer umwandeln
- Zahl-String in Integer umwandeln
- Integer in Hex-String umwandeln
- Integer in Hex-String umwandeln
- Integer in Hex-String umwandeln
- Integer in Hex-String umwandeln
- die 4 Strings zusammensetzen
- Hex in EINEN Integer umwandeln
statt nur
Zitat:

- String zerlegen
- Zahl-String in Integer umwandeln
- Zahl-String in Integer umwandeln
- Zahl-String in Integer umwandeln
- Zahl-String in Integer umwandeln
- die 4 Integer zusammensetzen


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz