'V1.R2.12'や'V0.R15.42'のようなバージョンを正しく処理したいので、これはもう少しトリッキーです-他の答えの単純な変換では、1212と1542が得られますが、そうではありませんあなたが期待する方法を比較してください。
バージョン番号の各部分の大きさを決定し、その部分にその値を掛けて、正しい終了番号を取得する必要があります。このようなもの:
[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;
次のコードでこれをテストできます。
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;
10、100、または1000に合格するかどうかAMaxVersion
は、バージョン番号のパーツの数と範囲によって異なります。LongWord
最大値が2^32-1である結果変数をオーバーフローさせてはならないことに注意してください。