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

Inno Setup访问TNewComboBox.ItemIndex属性报错如何解决

问题原因

报错和VCL-Styles插件、TNewComboBox.ItemIndex属性本身无关,是代码逻辑错误导致的:

  • 过程参数默认是值传递:你写的CreateDropDown过程里,cb: TNewComboBox属于值形参,过程内执行cb := TNewComboBox.Create(page)时,只会修改过程内部的参数副本,不会改动你定义的全局cb变量。事件触发时全局cb是未初始化的野指针,访问它的属性自然抛出"Could not Call proc"错误。
  • 多余的全局变量依赖:所有控件事件的Sender参数就是触发事件的控件实例本身,根本不需要靠全局变量存储控件引用。
  • 你最早贴的调用代码还存在参数类型不匹配问题:第三个参数要求传TNewComboBox类型,你传了字符串'ComboBox',这类低级错误编译时就会提示,注意排查。
修复方法

两个调整点:

  1. 如果需要通过参数把创建好的控件返回给外部,给形参加var关键字改成引用传递,过程内对参数的修改会同步到外部变量。
  2. 事件处理逻辑里直接用Sender参数强转得到当前触发事件的组合框实例,不需要依赖全局变量。

修复后可正常运行的最小代码如下:

[Code]
var
    ExamplePage: TWizardPage;

procedure DropDownChanged(Sender: TObject);
var
    cb: TNewComboBox;
begin
    // Sender就是当前触发选择变更的组合框,直接强转即可
    cb := TNewComboBox(Sender);
    Log(IntToStr(cb.ItemIndex));
end;

// 注意cb参数前加var,改为引用传递
procedure CreateDropDown(page: TWizardPage; var cb: TNewComboBox; index: Integer; item0, item1 : String);
begin
    cb := TNewComboBox.Create(page);
    cb.Parent := page.Surface;
    cb.Style := csDropDownList;
    cb.Items.Add(item0);
    cb.Items.Add(item1);
    cb.ItemIndex := index;
    cb.OnChange := @DropDownChanged;
end;

procedure CreateExamplePage;
var
    ExampleComboBox: TNewComboBox;
begin
    ExamplePage := CreateCustomPage(wpWelcome, 'Example Page', 'This is an example');
    CreateDropDown(ExamplePage, ExampleComboBox, 0, 'First Item', 'Second Item');
end;

procedure InitializeWizard;
begin
    CreateExamplePage;
end;
补充说明

如果要创建多个组合框复用同一个OnChange事件,用Sender获取当前控件的写法是通用方案,不需要为每个组合框单独定义全局变量和事件过程,代码可维护性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:03:19