![]() |
Re: else ifs werden übersprungen
Da hast du wohl Recht :) Aber für den Fall, dass man keine Build-Nummer benutzen will (oder die aus irgend einem Grund nicht konsequent hochzählt), wäre dann unser Vorschlag ebenfalls geeignet.
|
Re: else ifs werden übersprungen
Hi,
diese Funktion liefert folgendes Ergebnis: V1 < V2 -> -1 V1 = V2 -> 0 V1 > V2 -> 1 und zwar immer wenn die einzelnen Versions-Zahlen nicht größer sind, als in ein integer passt. Wer es grösser mag und braucht, kann ja auch int64 nehmen. Die Funktion stammt aus einem Projekt von mir, wo ich in einem VirtualStringTree u.a. nach Versions-Nummern sortieren lassen will. Klappt übrigens auch hervorragend mit IP-Adressen (verwende ich in dem geleichen Projekt auch dafür) :wink: cu Oliver
Delphi-Quellcode:
function VersionCompareStr(const V1, V2 : string) : integer;
var tvSL, cvSL : TStrings; i : integer; equal : boolean; tV1, tV2 : string; begin tvSL := TStringList.Create; cvSL := TStringList.Create; try tV1 := V1; tV2 := V2; tV1 := StringReplace( tV1, ',', '.', [ rfReplaceAll ] ); tV2 := StringReplace( tV2, ',', '.', [ rfReplaceAll ] ); tV1 := StringReplace( tV1, '_', '.', [ rfReplaceAll ] ); tV2 := StringReplace( tV2, '_', '.', [ rfReplaceAll ] ); tvSL.Delimiter := '.'; cvSL.Delimiter := '.'; tvSL.DelimitedText := tV1; cvSL.DelimitedText := tV2; while tvSL.Count < cvSL.Count do tvSL.Add( '0' ); while cvSL.Count < tvSL.Count do cvSL.Add( '0' ); i := 0; RESULT := 0; equal := true; while ( i < tvSL.Count ) and equal do begin equal := StrToIntDef( tvSL.Strings[ i ], 0 ) = StrToIntDef( cvSL.Strings[ i ], 0 ); if not equal then if StrToIntDef( tvSL.Strings[ i ], 0 ) < StrToIntDef( cvSL.Strings[ i ], 0 ) then RESULT := -1 else RESULT := 1; Inc( i ); end; finally FreeAndNil( tvSL ); FreeAndNil( cvSL ); end; end; |
Re: else ifs werden übersprungen
Ich würde mal sagen die beste Lösung ist die von Dax:
Delphi-Quellcode:
Kurz, knackig und effizient.
funtion VersionID(Major, Minor, Release, Build: Word): Int64;
begin Result := Int64(Major) shl 48 or Int64(Minor) shl 32 or Release shl 16 or Build; end; |
Re: else ifs werden übersprungen
Jap :) Mir fiel gestern noch auf, dass er auch bei gleichen Versionen zuschlägt.
Gibt es denn sozusagen ein int64 als vorzeichenlose Ganzzahl? Und eine Frage zu Int64: ist das erste Bit ein Vorzeichenbit? (Also 63 Bits für die Zahl?) Oder ist "0" dass minimum? (also "- (MAX_INT64 / 2)?) |
Re: else ifs werden übersprungen
@xZise:
Hattest Du wirklich das Create vergessen? Deine Bildchen waren nicht ganz aussagekräftig - bin mir nicht sicher, ob Du Deinen Kopf wegen Dir, oder wegen mir an der Wand zerschmetterst :stupid: |
Re: else ifs werden übersprungen
Zitat:
|
Re: else ifs werden übersprungen
Na dann bin ich ja froh :wink: - danke für's Feedback :-D
|
Re: else ifs werden übersprungen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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