procedure Version_FillList( aList: TStrings; aVersion: string);
var
  i: Integer;
  s: string;
begin
  try
    aList.Clear;
    if (LENGTH( aVersion) > 0) then begin
      i := 1;
      s := '';
      while (i <= LENGTH( aVersion)) do begin
        // разделителем будет любой нецифренный символ
        if NOT (aVersion[i] in ['0'..'9']) then begin
          // Exchange #2320
          // проверяем, чтобы все параметры строки версии были указаны.
          // строки вида 5..1 - ошибка! заменяем пропущенный символ на ноль.
          if (Length(s) <= 0)
            then aList.Add('0')
            else aList.Add(s);
          s := '';
        end else
          s := s + aVersion[i];

        Inc(i);
      end;//while//
      if (s <> '') then aList.Add(s);
    end;

    // добавляем число значений версии нулями. это дает то, что при сравнении
    // версий в виде списков, списки будут уравновешаны по количеству
    // параметров. например: 5.1.2.3 будет равноценно: 5.1.2.3.0
    while (aList.Count < 5) do aList.Add('0');
    // при большем числе параметров - сокращаем их до пяти
    while (aList.Count > 5) do aList.Delete( aList.Count - 1);
    except
      raise( 'Сбой Version_FillList'#13#10 + LastException.Message);
  end;
end; {End FillList}


function Version_ValidateString( aVersion: string;
                                 aTemplate: string = '%s.%s.%s.%s-%s'): string;
var SL: TStringList;
begin
  try
    SL := NIL;
    try
      SL := TStringList.Create;
      Version_FillList( SL, aVersion);
      Result := FORMAT( aTemplate,
                        [ SL.Strings[0],
                          SL.Strings[1],
                          SL.Strings[2],
                          SL.Strings[3],
                          SL.Strings[4]]);
      finally
        if ( SL <> NIL) then SL.Free;
    end;
    except
      raise( 'Сбой Version_ValidateString'#13#10 + LastException.Message);
  end;
end;


{~Version_CompareEx
  сравнение строк версий aWorkVersion и aCompareVersion.
  строки версий задаются в формате: N[xN[xN[xN[xN]]]]].
  строки версий можно указывать согращенно, при этом расширение иден младшими
  цифрами!
  результат:
    <0 - aWorkVersion < aCompareVersion
    =0 - aWorkVersion = aCompareVersion
    >0 - aWorkVersion > aCompareVersion.
  например:
    Version_CompareEx( '1.0', '2.1') вернет -1
    Version_CompareEx( '1.0', '1.0.0') вернет 0
    Version_CompareEx( '3.0', '2.1') вернет 1}
function Version_CompareEx( aWorkVersion, aCompareVersion: string): Integer;
var
  i,n: integer;
  xWorkNumber, xCompareNumber: Integer;
  xWorkList, xCompareList: TStrings;
begin
  try
    Result := 0;
    xWorkList := NIL;
    xCompareList := NIL;
    try
      xWorkList := TStringList.Create;
      xCompareList := TStringList.Create;
      Version_FillList(xWorkList, aWorkVersion);
      Version_FillList(xCompareList, aCompareVersion);

      if (xWorkList.Count < xCompareList.Count)
        then n := xWorkList.Count
        else n := xCompareList.Count;
      for i := 0 to n - 1 do begin
        xWorkNumber := StrToIntDef(xWorkList.Strings[i], 0);
        xCompareNumber := StrToIntDef(xCompareList.Strings[i], 0);
        if (xCompareNumber <> xWorkNumber) then begin
          if (xWorkNumber > xCompareNumber)
            then Result := 1
            else Result := -1;
          Exit;
        end;
      end;//for//
    finally
      if ( xCompareList <> NIL) then xCompareList.Free;
      if ( xWorkList <> NIL) then xWorkList.Free;
    end;
    except
      raise( 'Сбой Version_CompareEx'#13#10 + LastException.Message);
  end;
end;

begin
end.