Einzelnen Beitrag anzeigen

hypfvieh

Registriert seit: 1. Jan 2009
2 Beiträge
 
#1

Zwei Version-Strings (mit Buchstaben) vergleichen

  Alt 17. Feb 2011, 07:30
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;
  Mit Zitat antworten Zitat