![]() |
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:
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.
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; Dank im voraus. Sven |
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.
|
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... |
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? |
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.
|
Re: VirtualStringTree: IP Adressen sortieren
Ich habe sie jetzt zerlegt und es funktioniert.
Danke. |
Re: VirtualStringTree: IP Adressen sortieren
Zitat:
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
|
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. |
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) ); |
Re: VirtualStringTree: IP Adressen sortieren
Das Ganze mit dem hexadezimalen Zeugs ist nur ein kleines Bissl unperformant
Zitat:
Zitat:
|
Re: VirtualStringTree: IP Adressen sortieren
Klar, die Einfachheit im Code wird sich erkauft mit Performance.
Aber ich denke lieber einfachen Code, als Millisekunden sparen. Einfacher Code lässt sich langfristig besser warten. Die Lösung mit dem Record in dem anderen Thread finde ich auch besser. Allerdings setzt das vor raus, dass jemand versteht wie das mit dem Arbeitsspeicher funktioniert. Wenn der Prozess zu lange dauert, kann man dann immer noch Bit-Optimieren oder Assembler schreiben. |
Re: VirtualStringTree: IP Adressen sortieren
Hallo,
das Auseinander-Basteln muss ja nicht erst in OnCompareNodes erfolgen. Ich würde das vor dem Laden in den TreeView amchen, das Ergebnis zwischenspeichern und dann diese Ergebnis in OnCompareNodes benutzen. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz