![]() |
Re: Zwei Versionen über „for“ vergleichen
Hallo,
Zitat:
![]()
Delphi-Quellcode:
Gruß Hawkeye
var
V1, V2 : Int64Rec; begin V1.Words[0] := 0; // Buildnummer V1.Words[1] := 0; // Revisionsnummer V1.Words[2] := 0; // Nebenversionsnummer V1.Words[3] := 3; // Hauptversionsnummer V2.Words[0] := 1; V2.Words[1] := 0; V2.Words[2] := 0; V2.Words[3] := 2; if (Int64(V1) <= Int64(V2)) then ShowMessage ('V1 ist kleiner oder gleich V2'); |
Re: Zwei Versionen über „for“ vergleichen
Die Buildnummer Hauptversionsnummer sollte dann allerdings nicht größer als High(Smallint) sein, sonst wird der Int64 negativ.
|
Re: Zwei Versionen über „for“ vergleichen
Zitat:
An Int (32 bit) dachte ich auch schon, aber dann muss man davon ausgehen, dass sie bei 255 "überläuft". Auch dachte ich, man müsse die if-Konstruktion eigentlich so ganz gut umsetzen können. Wobei folgendes da ziemlich gut klingt: Zitat:
xZise |
Re: Zwei Versionen über „for“ vergleichen
Hallo Philip,
Zitat:
Gruß Hawkeye |
Re: Zwei Versionen über „for“ vergleichen
:oops: Das ist mir eigentlich bekant. Gut, dass du mitdenkst.
|
Re: Zwei Versionen über „for“ vergleichen
@Hawkeye219: if UInt64(V1) <= UInt64(V2) then :angel:
PS: bei FNewVersion hätt ich gedacht, daß dieses True ist, wenn NewXYZ > XYZ wird und nicht bei <= :gruebel: also insgesammt glaub ich, stümmt was bei der anfänglich genannten IF-Verschachtelung nicht
Delphi-Quellcode:
oder seh ich das grad irgendwie falsch?
if NewMajor < Major then
begin if (NewMajor = Major) and (NewMinor < Minor) then begin if (NewMinor = Minor) and (NewRelease < Release) then begin if (NewRelease = Release) and (NewBuild < Build) then begin FNewVersion := false; end else FNewVersion := true; end else FNewVersion := true; end else FNewVersion := true; end else FNewVersion := true; gekürzt:
Delphi-Quellcode:
isNewVersion := (NewMajor > Major) or
((NewMajor = Major) and ((NewMinor > Minor) or ((NewMinor = Minor) and ((NewRelease > Release) or ((NewRelease = Release) and (NewBuild > Build)))))); Selber nutze ich auch gern Records, welche sich dann auch mal ganz leicht nach LongWord, bzw. LargeInt/UInt64 casten lassen:
Delphi-Quellcode:
Oder wie wäre es mal mit den neuen Funktionalitäten von Delphi?
Type TSmallVersion = packed Record
Build: Word; Minor, Major: Byte; End; TVersion = packed Record Build, Release: Word; Minor, Major: Word; End; und dann einfach nur noch
Delphi-Quellcode:
Var NewVersion, Version: TVersion;
... If NewVersion <= Version Then ...
Delphi-Quellcode:
Type TSmallVersion = packed Record
Build: Word; Minor, Major: Byte; Class Operator Implicit(Rec: TSmallVersion): LongWord; Class Operator Implicit(Value: LongWord): TSmallVersion; Class Operator Implicit(Rec: TSmallVersion): String; Class Operator Implicit(Value: String): TSmallVersion; Class Operator Explicit(Rec: TSmallVersion): LongWord; Class Operator Explicit(Value: LongWord): TSmallVersion; Class Operator Explicit(Rec: TSmallVersion): String; Class Operator Explicit(Value: String): TSmallVersion; Class Operator Equal (Oper1, Oper2: TSmallVersion): Boolean; Class Operator NotEqual (Oper1, Oper2: TSmallVersion): Boolean; Class Operator LessThan (Oper1, Oper2: TSmallVersion): Boolean; Class Operator LessThanOrEqual (Oper1, Oper2: TSmallVersion): Boolean; Class Operator GreaterThan (Oper1, Oper2: TSmallVersion): Boolean; Class Operator GreaterThanOrEqual(Oper1, Oper2: TSmallVersion): Boolean; Class Operator Add (Oper1, Oper2: TSmallVersion): TSmallVersion; Class Operator Subtract (Oper1, Oper2: TSmallVersion): TSmallVersion; Class Operator BitwiseAnd(Oper1, Oper2: TSmallVersion): TSmallVersion; Class Operator BitwiseOr (Oper1, Oper2: TSmallVersion): TSmallVersion; End; TVersion = packed Record Build, Release: Word; Minor, Major: Word; Class Operator Implicit(Rec: TSmallVersion): UInt64; Class Operator Implicit(Value: LongWord): TSmallVersion; Class Operator Implicit(Rec: TSmallVersion): String; Class Operator Implicit(Value: String): TSmallVersion; Class Operator Explicit(Rec: TSmallVersion): UInt64; Class Operator Explicit(Value: UInt64): TSmallVersion; Class Operator Explicit(Rec: TSmallVersion): String; Class Operator Explicit(Value: String): TSmallVersion; Class Operator Equal (Oper1, Oper2: TSmallVersion): Boolean; Class Operator NotEqual (Oper1, Oper2: TSmallVersion): Boolean; Class Operator LessThan (Oper1, Oper2: TSmallVersion): Boolean; Class Operator LessThanOrEqual (Oper1, Oper2: TSmallVersion): Boolean; Class Operator GreaterThan (Oper1, Oper2: TSmallVersion): Boolean; Class Operator GreaterThanOrEqual(Oper1, Oper2: TSmallVersion): Boolean; Class Operator Add (Oper1, Oper2: TSmallVersion): TSmallVersion; Class Operator Subtract (Oper1, Oper2: TSmallVersion): TSmallVersion; Class Operator BitwiseAnd(Oper1, Oper2: TSmallVersion): TSmallVersion; Class Operator BitwiseOr (Oper1, Oper2: TSmallVersion): TSmallVersion; End; // die Definitionen der Funktionen hab ich mir erstmal gesparrt |
Re: Zwei Versionen über „for“ vergleichen
Zitat:
Wenn die Hauptversionsnummer größer ist, springt er ins else -> Result := true:
Delphi-Quellcode:
Ansonsten macht er das mit der Nebenversionsnummer, der Releasenummer oder der Buildnummer.
if NewMajor <= Major then
begin [...] end else FNewVersion := true; MfG xZise |
Re: Zwei Versionen über „for“ vergleichen
Zitat:
Delphi-Quellcode:
hiernach wäre die 4.8 kleiner als 3.9, da 8 < 9
// New = 3.9.0.0
// Current = 4.8.0.0 if NewMajor{3} <= Major{4} {=true} then begin if NewMinor{9} <= Minor{8} {=false} then begin ... end else FNewVersion := true; {das Ergebnis} end else FNewVersion := true; Der nächste Versionsteil darf nur geprüft werden, wenn die vorherigen Teile gleich sind. |
Re: Zwei Versionen über „for“ vergleichen
Ich mache das mit Versionen so:
Delphi-Quellcode:
TVersion = packed record
case Integer of 0: (AsInt: Cardinal;); 1: (AsArray: Array[0..3] of Byte;); 2: (Major: Byte; Minor: Byte; Release: Byte; Build: Byte;); end; |
Re: Zwei Versionen über „for“ vergleichen
Moin himitsu,
Stimmt :) Aber deine Funktion ergibt auch "wahr", da Major != NewMajor ist. Zitat:
Mein Vorschlag:
Delphi-Quellcode:
Zu Nikolai: Wie machst du den Vergleich?
FNewVersion := false;
if NewMajor = Major then begin if NewMinor = Minor then begin if NewRelease = Release then begin if NewBuild > Build then begin FNewVersion := true; end; end else if NewRelease > Release then FNewVersion := true; end else if NewMinor > Minor then FNewVersion := true; end else if NewMajor > Major then FNewVersion := true;
Delphi-Quellcode:
MfG
var
Ver, NewVer : TVersion; begin if Ver... < NewVer... then FNewVersion := true else FNewVersion := false; end; xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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