Dies ist ein wenig komplizierter, da Sie Versionen wie 'V1.R2.12' und 'V0.R15.42' korrekt behandeln möchten - mit der einfachen Konvertierung in der anderen Antwort würden Sie 1212 und 1542 erhalten , die nicht so vergleichbar wären, wie Sie es erwarten würden.
Sie müssen entscheiden, wie groß jeder Teil der Versionsnummer sein kann, und multiplizieren Sie die Teile mit diesem Wert, um eine korrekte Endnummer zu erhalten. Etwas wie folgt aus:
[Code]
function string_to_numerical_value(AString: string; AMaxVersion: LongWord): LongWord;
var
InsidePart: boolean;
NewPart: LongWord;
CharIndex: integer;
c: char;
begin
Result := 0;
InsidePart := FALSE;
// this assumes decimal version numbers !!!
for CharIndex := 1 to Length(AString) do begin
c := AString[CharIndex];
if (c >= '0') and (c <= '9') then begin
// new digit found
if not InsidePart then begin
Result := Result * AMaxVersion + NewPart;
NewPart := 0;
InsidePart := TRUE;
end;
NewPart := NewPart * 10 + Ord(c) - Ord('0');
end else
InsidePart := FALSE;
end;
// if last char was a digit the last part hasn't been added yet
if InsidePart then
Result := Result * AMaxVersion + NewPart;
end;
Sie können dies testen mit dem folgenden Code:
function InitializeSetup(): Boolean;
begin
if string_to_numerical_value('V1.R2.12', 1) < string_to_numerical_value('V0.R15.42', 1) then
MsgBox('Version ''V1.R2.12'' is not as recent as version ''V0.R15.42'' (false)', mbConfirmation, MB_OK);
if string_to_numerical_value('V1.R2.12', 100) > string_to_numerical_value('V0.R15.42', 100) then
MsgBox('Version ''V1.R2.12'' is more recent than version ''V0.R15.42'' (true)', mbConfirmation, MB_OK);
Result := FALSE;
end;
Ob 10, 100 oder 1000 für AMaxVersion
passieren, hängt von der Anzahl und Reichweite Ihrer Versionsnummer Teile. Beachten Sie, dass Sie die Ergebnisvariable LongWord
, die einen maximalen Wert von 2^32-1 hat, nicht überlaufen lassen dürfen.
Ist die letzte Nummer (.12) für den Vergleich relevant? Angenommen, "R" steht für "release", dann hätten Sie nur eine Build-Nummer. Wenn Sie also einen festen Release-Prozess haben, können Sie ihn ignorieren. – Treb