Delphi-PRAXiS

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

generic 9. Dez 2009 14:00

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.

hoika 9. Dez 2009 14:24

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 08:33 Uhr.

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