You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Inno Setup的「选择目标位置」页面添加磁盘空间显示标签?

实现Inno Setup「选择目标位置」页面显示空间信息

嘿,这个需求我刚好折腾过,用Inno Setup的自定义控件+内置函数就能完美搞定,下面是一步步的具体方案:

核心实现代码与说明

直接在脚本的[Code]段里编写逻辑就行,我把每个部分的作用都标清楚了:

[Code]
var
  // 存储我们要添加的自定义标签控件
  SpaceInfoLabel: TNewStaticText;

// 函数:获取指定路径所在磁盘的可用空间(单位:MB)
function GetDiskFreeSpaceMB(const Path: string): Integer;
var
  FreeBytes: Int64;
begin
  if GetDiskFreeSpaceEx(Path, FreeBytes, nil, nil) then
    Result := Round(FreeBytes / 1024 / 1024)
  else
    Result := -1; // 获取失败时返回-1做标记
end;

// 函数:计算安装所需的总空间(单位:MB)
function GetRequiredSpaceMB: Integer;
var
  RequiredBytes: Int64;
begin
  // 从向导内置的TotalSizeLabel里提取总字节数
  RequiredBytes := StrToInt64(WizardForm.TotalSizeLabel.Caption);
  // 转换为MB并取整
  Result := Round(RequiredBytes / 1024 / 1024);
end;

// 更新标签文本的核心逻辑
procedure UpdateSpaceInfoLabel;
var
  FreeSpace: Integer;
  RequiredSpace: Integer;
  TargetPath: string;
begin
  TargetPath := WizardForm.DirEdit.Text;
  FreeSpace := GetDiskFreeSpaceMB(TargetPath);
  RequiredSpace := GetRequiredSpaceMB;

  if FreeSpace = -1 then
    SpaceInfoLabel.Caption := '无法获取当前驱动器可用空间'
  else
    SpaceInfoLabel.Caption := Format(
      '当前驱动器可用空间:%d Mb'#13#10'安装所需空间:%d Mb',
      [FreeSpace, RequiredSpace]
    );
end;

// 初始化向导时创建并配置标签控件
procedure InitializeWizard;
begin
  // 创建新的静态文本控件
  SpaceInfoLabel := TNewStaticText.Create(WizardForm);
  with SpaceInfoLabel do
  begin
    Parent := WizardForm.SelectDirPage;
    // 调整位置:放在目录输入框下方,和输入框对齐
    Left := WizardForm.DirEdit.Left;
    Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 10;
    Width := WizardForm.DirEdit.Width;
    WordWrap := True; // 自动换行避免文字溢出
    // 可选:自定义样式,比如加粗文字
    // Font.Style := [fsBold];
    // Font.Color := clNavy;
  end;

  // 绑定目录输入框的变化事件,实时更新标签
  WizardForm.DirEdit.OnChange := @DirEditChange;

  // 初始加载页面时就显示空间信息
  UpdateSpaceInfoLabel;
end;

// 当用户切换到选择目标位置页面时,更新标签
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then
    UpdateSpaceInfoLabel;
end;

// 当用户修改目录输入框内容时,实时刷新标签
procedure DirEditChange(Sender: TObject);
begin
  UpdateSpaceInfoLabel;
end;

关键细节说明

  • 控件位置适配:通过Left和Top属性把标签放在目录输入框下方,和输入框对齐,你可以根据自己的界面风格调整数值。
  • 实时更新逻辑:绑定了DirEdit.OnChange和CurPageChanged两个事件,确保用户手动修改路径、点击浏览按钮选择新目录,或者切换回该页面时,空间信息都会自动刷新。
  • 兼容性:如果你的Inno Setup版本比较旧,TNewStaticText可能无法使用,换成TStaticText即可。

内容的提问来源于stack exchange,提问作者Saimon Frost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:15:00