Hier ein simpler Code um 2 Versionsnummern zu prüfen.
Dazu werden die Buchstaben in ihre entsprechenden Zahlenwerte verwandelt, sämtlich Sonderzeichen werden ignoriert.
Limitierung: Wenn die Versionsnummer die Größe von Int64 überschreitet.
Ich habe hier 2 Versionen zur Verfügung gestellt, die erste ist getestet unter Delphi 2006 und Free Pascal 2.4.0.
Die zweite Version ist unter Delphi XE getestet worden.
Der Unterschied ist die Verwendung von "CharInSet" (in Delphi 2006 und FPC nicht verfügbar), um Kompatibilität mit WideStrings zu gewährleisten.
Die erste Version funktioniert zwar generell auch in den neueren Delphi Versionen, es wird aber fehlende WideString Kompatibilität angemahnt.
Delphi 2006/Free Pascal Version:
Delphi-Quellcode:
function checkversion(ver1,ver2 : string) : byte;
var i : integer;
tmp1,tmp2 : string;
cver1,cver2 : int64;
begin
{
Return values:
0: versions are equal
1: ver1 is bigger then ver2
2: ver2 is bigger then ver1
253: ver1 is too big (could not be converted to int64)
254: ver2 is too big (could not be converted to int64)
}
tmp1 := '';
tmp2 := '';
for i := 1 to length(ver1) do begin
if (ver1[i] in ['a'..'z']) or (ver1[i] in ['A'..'Z']) then
tmp1 := tmp1 + inttostr(Ord(ver1[i]));
if (ver1[i] in ['0'..'9']) then
tmp1 := tmp1 + ver1[i];
end;
for i := 1 to length(ver2) do begin
if (ver2[i] in ['a'..'z']) or (ver2[i] in ['A'..'Z']) then
tmp2 := tmp2 + inttostr(Ord(ver2[i]));
if (ver2[i] in ['0'..'9']) then
tmp2 := tmp2 + ver2[i];
end;
if not TryStrToInt64(tmp2,cver2) then begin
checkversion := 254;
exit;
end;
if not TryStrToInt64(tmp1,cver1) then begin
checkversion := 253;
exit;
end;
if ver1 > ver2 then
checkversion := 1
else if ver2 > ver1 then
checkversion := 2
else
checkversion := 0;
end;
Delphi XE Version:
Delphi-Quellcode:
function checkversion(ver1,ver2 : string) : byte;
var i : integer;
tmp1,tmp2 : string;
cver1,cver2 : int64;
begin
{
Return values:
0: versions are equal
1: ver1 is bigger then ver2
2: ver2 is bigger then ver1
253: ver1 is too big (could not be converted to int64)
254: ver2 is too big (could not be converted to int64)
}
tmp1 := '';
tmp2 := '';
for i := 1 to length(ver1) do begin
if (CharInSet(ver1[i],['a'..'z'])) or (CharInSet(ver1[i],['A'..'Z'])) then
tmp1 := tmp1 + inttostr(Ord(ver1[i]));
if (CharInSet(ver1[i],['0'..'9'])) then
tmp1 := tmp1 + ver1[i];
end;
for i := 1 to length(ver2) do begin
if (CharInSet(ver2[i],['a'..'z'])) or (CharInSet(ver2[i],['A'..'Z'])) then
tmp2 := tmp2 + inttostr(Ord(ver2[i]));
if (CharInSet(ver2[i],['0'..'9'])) then
tmp2 := tmp2 + ver2[i];
end;
if not TryStrToInt64(tmp2,cver2) then begin
checkversion := 254;
exit;
end;
if not TryStrToInt64(tmp1,cver1) then begin
checkversion := 253;
exit;
end;
if cver1 > cver2 then
checkversion := 1
else if cver2 > cver1 then
checkversion := 2
else
checkversion := 0;
end;
Aufruf-Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var test : byte;
begin
test := checkversion(edit1.text,edit2.text);
if test >= 253 then
showmessage('Error while comparing')
else if test = 2 then
showmessage('Version 2 is newer')
else if test = 1 then
showmessage('Version 1 is newer')
else
showmessage('Versions are equal');
end;