0

我最近从优秀的 Delphi 7 切换到 Embracadero Delphi XE8,现在我经常收到这个错误。每次我误点击任何 ListBox 中的空行时,它都会出现 - 这是我在 D7 中无法做到的。这是某种错误,还是我做错了什么?

UPD:这里是一个有问题的 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 中的空行。

4

1 回答 1

2

您发布的代码中存在一个根本缺陷,即未能检查 的值ChoiceListBox.ItemIndex以确保在使用它访问之前选择了一个项目ChoiceListBox.Items

首次创建 TListBox 时,默认情况下没有选择任何项目(除非您通过在 Object Inspector 或代码中设置 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 控件。

于 2015-06-23T12:45:45.990 回答