EDelphi XE8 "List index out of bounds (-1)" 单击列表框中的空行时
EDelphi XE8 "List index out of bounds (-1)" when clicking the empty line in ListBox
我最近从 good ol' Delphi 7 切换到 Embracadero Delphi XE8,现在我不断收到此错误。每次我在任何 ListBox 中误按一个空行时都会出现 - 这是我在 D7 中无法做到的。这是某种错误,还是我做错了什么?
更新:
下面是有问题的 ListBox 之一的 OnClick 过程:
procedure TMainForm.ChoiceListBoxClick(Sender: TObject);
begin
Choice:=ChoiceListBox.Items[ChoiceListBox.ItemIndex];
ChoiceListBox.Items.Clear;
if InDialogueWith<>'' then DialoguesUnit.Dialogue
else ActionsUnit.Actions;
end;
它将玩家的选择保存到一个变量中,清除列表,然后根据情况将其传递给某个过程。正如我之前所说,在 DE7 中一切正常 - 我只是无法点击 ListBox 中的空行。
您发布的代码存在一个根本性缺陷,即未能检查 ChoiceListBox.ItemIndex
的值以确保在使用它访问 ChoiceListBox.Items
之前选择了一个项目。
第一次创建 TListBox 时,默认情况下没有选择任何项目(除非您通过在对象检查器或代码中设置 ItemIndex 另有说明。无论何时单击列表框,都会调用 TListBox.OnClick
单击是否在某个项目上。您需要确保在尝试使用该项目之前首先选择了该项目。
正确的代码应该是
procedure TMainForm.ChoiceListBoxClick(Sender: TObject);
begin
if ChoiceListBox.ItemIndex <> -1 then
begin
Choice:=ChoiceListBox.Items[ChoiceListBox.ItemIndex];
ChoiceListBox.Items.Clear;
if InDialogueWith <> '' then
DialoguesUnit.Dialogue
else
ActionsUnit.Actions;
end;
end;
请注意,由于您没有另外指定,并且因为您将 Delphi 7 称为要升级的版本,所以我假设您的问题是指 VCL。由于 IDE 的最后几个版本包括共享相同名称的 VCL 和 FMX 控件,通常最好包含一个标记(或一些文本)来指示您正在使用的 UI 控件。
我最近从 good ol' Delphi 7 切换到 Embracadero Delphi XE8,现在我不断收到此错误。每次我在任何 ListBox 中误按一个空行时都会出现 - 这是我在 D7 中无法做到的。这是某种错误,还是我做错了什么?
更新: 下面是有问题的 ListBox 之一的 OnClick 过程:
procedure TMainForm.ChoiceListBoxClick(Sender: TObject);
begin
Choice:=ChoiceListBox.Items[ChoiceListBox.ItemIndex];
ChoiceListBox.Items.Clear;
if InDialogueWith<>'' then DialoguesUnit.Dialogue
else ActionsUnit.Actions;
end;
它将玩家的选择保存到一个变量中,清除列表,然后根据情况将其传递给某个过程。正如我之前所说,在 DE7 中一切正常 - 我只是无法点击 ListBox 中的空行。
您发布的代码存在一个根本性缺陷,即未能检查 ChoiceListBox.ItemIndex
的值以确保在使用它访问 ChoiceListBox.Items
之前选择了一个项目。
第一次创建 TListBox 时,默认情况下没有选择任何项目(除非您通过在对象检查器或代码中设置 ItemIndex 另有说明。无论何时单击列表框,都会调用 TListBox.OnClick
单击是否在某个项目上。您需要确保在尝试使用该项目之前首先选择了该项目。
正确的代码应该是
procedure TMainForm.ChoiceListBoxClick(Sender: TObject);
begin
if ChoiceListBox.ItemIndex <> -1 then
begin
Choice:=ChoiceListBox.Items[ChoiceListBox.ItemIndex];
ChoiceListBox.Items.Clear;
if InDialogueWith <> '' then
DialoguesUnit.Dialogue
else
ActionsUnit.Actions;
end;
end;
请注意,由于您没有另外指定,并且因为您将 Delphi 7 称为要升级的版本,所以我假设您的问题是指 VCL。由于 IDE 的最后几个版本包括共享相同名称的 VCL 和 FMX 控件,通常最好包含一个标记(或一些文本)来指示您正在使用的 UI 控件。