2016-06-15 2 views
1

Я читал значение файла INF, теперь мне нужно, чтобы сравнить его с версией программы установки, но когда я компиляции я получаю сообщение об ошибке:Сравнить версии строки в программе установки Inno

Unknown identifier: CompareVersion

Что неправильно ?

[Code] 

function GetKeyValue(const AKeyName, AFileName, ADefault: string): string; 
var 
    I: Integer; 
    KeyPos: Integer; 
    KeyFull: string; 
    FileLines: TArrayOfString; 
begin 
    Result := ADefault; 
    if LoadStringsFromFile(AFileName, FileLines) then 
    begin 
    KeyFull := AKeyName + '='; 
    for I := 0 to GetArrayLength(FileLines) - 1 do 
    begin 
     FileLines[I] := TrimLeft(FileLines[I]); 
     KeyPos := Pos(KeyFull, FileLines[I]); 
     if KeyPos > 0 then 
     begin 
     Result := Copy(FileLines[I], KeyPos + Length(AKeyName) + 1, MaxInt); 
     Break; 
     end; 
    end; 
    end; 
end; 

var 
    L2Ver2: TLabel; 

procedure DirEditChange(Sender: TObject); 
var 
    FilePath: string; 
begin 
    FilePath := AddBackslash(WizardForm.DirEdit.Text) + 'left4dead2\steam.inf'; 
    L2Ver2.Caption := GetKeyValue('PatchVersion', FilePath, 'N/A'); 
    if (CompareVersion(L2Ver2.Caption, '{#MyAppOldVersion}') = 0) then 
    begin 
     ... 
    end 
end; 

У меня есть ошибка в этой строке:

if (CompareVersion(L2Ver2.Caption, '{#MyAppOldVersion}') = 0) then 

{#MyAppOldVersion} уже определен.

Это сообщение связано с моим предыдущим вопросом: Read an INF file during the Setup.

Если кто-то может помочь, я был бы признателен.

ответ

3

В Inno Setup нет функции CompareVersion.

Необходимо определить ваше собственное.

Что-то вроде:

function CompareVersion(V1, V2: string): Integer; 
var 
    P, N1, N2: Integer; 
begin 
    Result := 0; 
    while (Result = 0) and ((V1 <> '') or (V2 <> '')) do 
    begin 
    P := Pos('.', V1); 
    if P > 0 then 
    begin 
     N1 := StrToInt(Copy(V1, 1, P - 1)); 
     Delete(V1, 1, P); 
    end 
     else 
    if V1 <> '' then 
    begin 
     N1 := StrToInt(V1); 
     V1 := ''; 
    end 
     else 
    begin 
     N1 := 0; 
    end; 

    P := Pos('.', V2); 
    if P > 0 then 
    begin 
     N2 := StrToInt(Copy(V2, 1, P - 1)); 
     Delete(V2, 1, P); 
    end 
     else 
    if V2 <> '' then 
    begin 
     N2 := StrToInt(V2); 
     V2 := ''; 
    end 
     else 
    begin 
     N2 := 0; 
    end; 

    if N1 < N2 then Result := -1 
     else 
    if N1 > N2 then Result := 1; 
    end; 
end; 
  • Возвращает 0, если версии равны.
  • Возврат -1, если V1 больше, чем V2.
  • Возвращает 1, если V1 является новее, чем V2.
  • 1.12 считается более поздним, чем 1.1.
  • 1.1 считается такой же, как 1.1.0.
  • Выдает исключение, если версия синтаксически недействительна (допускаются только цифры и точки).

Unit тесты:

procedure CompareVersionTest(V1, V2: string; Expected: Integer); 
var 
    R: Integer; 
    M: string; 
begin 
    M := Format('Comparing [%s] vs. [%s] - expecting %d - ', [V1, V2, Expected]); 
    R := CompareVersion(V1, V2); 
    if R <> Expected then 
    begin 
    RaiseException(M + Format('Failed - Got %d', [R])); 
    end 
    else 
    begin 
    Log(M + 'Passed'); 
    end; 
end; 

procedure CompareVersionTests; 
begin 
    CompareVersionTest('1', '1', 0); 
    CompareVersionTest('1.2', '1.2', 0); 
    CompareVersionTest('1.2.3', '1.2.3', 0); 
    CompareVersionTest('1', '2', -1); 
    CompareVersionTest('1', '3', -1); 
    CompareVersionTest('2', '3', -1); 
    CompareVersionTest('2', '1', 1); 
    CompareVersionTest('3', '1', 1); 
    CompareVersionTest('3', '2', 1); 
    CompareVersionTest('1', '12', -1); 
    CompareVersionTest('12', '2', 1); 
    CompareVersionTest('12', '12', 0); 
    CompareVersionTest('1.2', '1.3', -1); 
    CompareVersionTest('1.3', '1.2', 1); 
    CompareVersionTest('1.2', '11.2', -1); 
    CompareVersionTest('11.2', '1.2', 1); 
    CompareVersionTest('1.1', '1.12', -1); 
    CompareVersionTest('1.11', '1.12', -1); 
    CompareVersionTest('1.12', '1.1', 1); 
    CompareVersionTest('1.12', '1.11', 1); 
    CompareVersionTest('1', '1.0', 0); 
    CompareVersionTest('1.0', '1', 0); 
    CompareVersionTest('1', '1.1', -1); 
    CompareVersionTest('1.1', '1', 1); 
    CompareVersionTest('1.12.123', '1.12.124', -1); 
    CompareVersionTest('1.12.124', '1.12.123', 1); 
    CompareVersionTest('1.12.123', '1.13.1', -1); 
    CompareVersionTest('1.13.1', '1.12.123', 1); 
    CompareVersionTest('1.12.123', '1.13', -1); 
    CompareVersionTest('1.13', '1.12.123', 1); 
    CompareVersionTest('1.12', '1.13.1', -1); 
    CompareVersionTest('1.13.1', '1.12', 1); 
end; 
+0

вы мне очень помогли, спасибо! он отлично работает –

Смежные вопросы