论坛风格切换切换到宽版
  • 2054阅读
  • 3回复

请教老虎版主这个类型不匹配问题,该怎么修改? [复制链接]

上一主题 下一主题
离线546242502
 

发帖
332
金钱
-3060
威望
-306
只看楼主 倒序阅读 0 发表于: 2015-08-23
  1. 问题还是没有解决,版本识别没有错误。现在有两个版本,比如一个老旧版本是9.50.11208,新的版本是10.0.1789,如果低于10.0.1789的版本就弹出警示框。
  2. 当对9.50.11208版进行操作的时候,按下面的做法没有效果:
  3. if CompareStr(fileVer, '10.0.1789') < 0 then
  4. MsgBox('你现有程序的版本低于 10.0.1789,不能继续安装。', mbInformation, MB_OK);
  5. --------------------------------->>
  6. [Code]
  7. procedure DecodeVersion(verstr: String; var verint: array of Integer);
  8. var
  9. i,p: Integer; s: string;
  10. begin
  11. // initialize array
  12. verint := [0,0,0,0];
  13. i := 0;
  14. while ( (Length(verstr) > 0) and (i < 4) ) do
  15. begin
  16.   p := pos('.', verstr);
  17.   if p > 0 then
  18.   begin
  19.     if p = 1 then s:= '0' else s:= Copy( verstr, 1, p - 1 );
  20.   verint := StrToInt(s);
  21.   i := i + 1;
  22.   verstr := Copy( verstr, p+1, Length(verstr));
  23.   end
  24.   else
  25.   begin
  26.   verint := StrToInt( verstr );
  27.   verstr := '';
  28.   end;
  29. end;
  30. end;
  31. // This function compares version string
  32. // return -1 if ver1 < ver2
  33. // return 0 if ver1 = ver2
  34. // return 1 if ver1 > ver2
  35. function CompareVersion( ver1, ver2: String ) : Integer;
  36. var
  37. verint1, verint2: array of Integer;
  38. i: integer;
  39. begin
  40. SetArrayLength( verint1, 4 );
  41. DecodeVersion( ver1, verint1 );
  42. SetArrayLength( verint2, 4 );
  43. DecodeVersion( ver2, verint2 );
  44. Result := 0; i := 0;
  45. while ( (Result = 0) and ( i < 4 ) ) do
  46. begin
  47.   if verint1 > verint2 then
  48.   Result := 1
  49.   else
  50.     if verint1 < verint2 then
  51.     Result := -1
  52.   else
  53.     Result := 0;
  54.   i := i + 1;
  55. end;
  56. end;
  57. function NextButtonClick(CurPageID: Integer): Boolean;
  58. var fileVer: String;
  59. begin
  60. result:= true;
  61. if CurPageID = wpSelectDir then
  62. begin
  63. if FileExists(ExpandConstant('{app}\myprog.exe')) then
  64.   begin
  65.   GetVersionNumbersString(ExpandConstant('{app}\myprog.exe'), fileVer);
  66.   MsgBox('现有文件版本: ' + fileVer, mbInformation, MB_OK);
  67.   if CompareVersion(fileVer, '10.0.1789.0') > 0 then
  68.     begin
  69.     MsgBox('你现有程序的版本高于 10.0.1789.0,不继续安装。', mbInformation, MB_OK);
  70.     result:= false;
  71.     WizardForm.CancelButton.OnClick(WizardForm);
  72.     end;
  73.   if CompareVersion(fileVer, '10.0.1789.0') = 0 then
  74.     begin
  75.     MsgBox('你现有程序的版本为 10.0.1789.0,不继续安装。', mbInformation, MB_OK);
  76.     result:= false;
  77.     WizardForm.CancelButton.OnClick(WizardForm);
  78.     end;
  79.   end
  80. else
  81.   if MsgBox('指定的文件夹中找不到文件 abc.exe,无论如何要安装吗?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDNO then
  82.     begin
  83.     result:= false;
  84.     WizardForm.CancelButton.OnClick(WizardForm);
  85.     end;
  86. end;
  87. end;

只会用,一遇到问题就,报错如下,望老虎版主修正下? 顺便问一下,老虎版主能否更新下那两个屏蔽 hosts 脚本?


离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 1 发表于: 2015-08-24
提醒过你了,你是直接从网页上复制代码的,而代码中使用了 i 这个计数变量,现在的网页程序会“吃掉”某些代码。从前的网页程序没有这个问题,所以当时在提供代码时也就没有考虑这个问题了。现在在网页上发代码,一般都会避免使用 i 这个变量。看到用斜体字体显示的网页内容,通常说明代码被吃掉的情况。这种情况下,你不要盲目使用复制的代码,先要把代码进行复原。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 2 发表于: 2015-08-24
正确的代码如下,随便还给你一个示例。


[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[code]
procedure DecodeVersion(verstr: String; var verint: array of Integer);
var
  n,p: Integer; s: string;
begin
  verint := [0,0,0,0];
  n := 0;
  while ( (Length(verstr) > 0) and (n < 4) ) do
  begin
    p := pos('.', verstr);
    if p > 0 then
    begin
      if p = 1 then s:= '0' else s:= Copy( verstr, 1, p - 1 );
      verint[n] := StrToInt(s);
      n := n + 1;
      verstr := Copy( verstr, p+1, Length(verstr));
    end
    else
    begin
      verint[n] := StrToInt( verstr );
      verstr := '';
    end;
  end;
end;

function CompareVersion(ver1, ver2: String) : Integer;
var
  verint1, verint2: array of Integer;
  n: integer;
begin
  SetArrayLength( verint1, 4 );
  DecodeVersion( ver1, verint1 );
  SetArrayLength( verint2, 4 );
  DecodeVersion( ver2, verint2 );
  Result := 0;
  n := 0;
  while ( (Result = 0) and ( n < 4 ) ) do
  begin
    if verint1[n] > verint2[n] then
      Result := 1
    else
      if verint1[n] < verint2[n] then
        Result := -1
      else
        Result := 0;
    n := n + 1;
  end;
end;

function InitializeSetup(): boolean;
var
  oldVersion: string;
begin
  if Not RegValueExists(HKLM, 'Software\Microsoft\DirectX', 'Version') then
    begin
      MsgBox('安装程序检测到您的系统内没有安装 ActiveX。安装无法继续。', mbInformation, MB_OK);
      Exit;
    end;
  if RegQueryStringValue(HKLM, 'Software\Microsoft\DirectX', 'Version', oldVersion) then
    if CompareVersion(oldVersion, '5.0.0.0') >= 0 then
      begin
      MsgBox('安装程序检测到您的 ActiveX 版本为 ' + oldVersion + ',满足要求。安装可以继续。', mbInformation, MB_OK);
      result := true;
      end
    else
      begin
      MsgBox('安装程序检测到您的 ActiveX 版本为 ' + oldVersion + ',不满足要求。安装无法继续。', mbInformation, MB_OK);
      result := false;
      end;
end;
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 3 发表于: 2015-08-24
回 2楼(gnatix) 的帖子
gnatix:正确的代码如下,随便还给你一个示例。[Setup]AppName=My Program....... (2015-08-24 04:37) 

谢谢老虎版主解答.
昨天运行出错就发上来了,今天一看,感觉那里遇到过,一看i:=i+1,就觉得
verint[缺少个i]= StrToInt( verstr );,不过没想到这次这里还有修改:
if verint1[n] < verint2[n] then
难怪改来改去还是有问题