6

我正在使用 GUIDE 构建一个简单的 MATLAB gui。我有一个项目列表框。大多数情况下,它按预期工作,但有时(通常在我使用 GUIDE 编辑图形之后)填充列表框会导致它消失,同时出现以下消息:

Warning: single-selection listbox control requires a scalar Value
Control will not be rendered until all of its parameter values are valid 

这种行为无视调试!当我逐步完成时,它按预期工作(我怀疑这是一种线程竞赛或其他东西)。此外,在相同的条件下,它通常会在重新启动 MATLAB 环境后消失。

在此错误中找到的所有文档均参考以前/古老版本的 MATLAB(我使用的是 R2010a)。

任何有关此主题的想法或信息将不胜感激!


编辑:感谢米哈伊尔,我似乎已经解决了这个问题。我在这里发布我的代码以供将来参考。

经过大量调试打印和疯狂点击后,我发现有时当您询问列表框选择了什么时,您会得到一个空结果。这个问题和其他问题让事情变得一团糟。我将我所有的写作交互都移到了一个集中的函数中,并编写了一些测试代码以确保事情保持应有的方式。

请注意,这已在我自己的环境(在 R2010a 上)中进行了测试,并未进行广泛测试。此外,代码有点多余,但无论如何它让我感觉很好。(即itemcount不能小于 0 ...)

function ensure_listbox_ok(handles)

%check to make sure it does not suck - ask what it has
thestrings = get(handles.listbox_files, 'String');
selection = get(handles.listbox_files, 'Value');

itemcount = length(thestrings);

betterselection = selection;

if(itemcount <= 0)
    betterselection = 1;
else
    if(selection > itemcount)
        betterselection = itemcount;
    end
end

%never use zero!!!! even if 1 is out of bounds.
if(isempty(betterselection) || betterselection <= 0)
    betterselection = 1;
end

%uncomment for debug logging
%display(['Was: ' num2str(selection) ', cleaned: ' num2str(betterselection)]);

%update if we are out of bounds.
if(isempty(selection) || betterselection ~= selection)
    set(handles.listbox_files, 'Value', betterselection);
end
4

2 回答 2

2

这是一个已知的编程错误,它与竞争条件无关!

这是它应该如何工作的:

对于 Popup 和单选 Liststring属性必须不为空,即有一些内容。但默认情况下它是空的,因此必须始终定义它。

在弹出窗口中显示(在列表中突出显示)项目由两个属性string(作为字符串的单元格数组)和value1默认情况下)定义。

在空数组中取第一个元素显然不起作用,因此无法呈现控件!

您的 Listbox 控件是单选的 - 它的属性min<是标量maxvalue>0。min如果 property > ,列表框(但不是 Popup)可以是多选的max,在这种情况下value可以是一个数组(这意味着也是空的)并且空string不会导致问题。

阅读 MATLAB 帮助以获取 uicontrol 属性string, value, min, max, listboxtop

在实践中

  • 你说它在用 GUIDE 编辑后表现出来。GUIDE 创建代码隐藏。编辑旧代码后,有时会保留在原处。
  • 有时 MATLAB 对一个语句中的顺序很敏感,即set(hlist, 'value', 2, 'string', {'aa','bb'})天真地value设置2beforestring足够长并且使 uicontrol 无效。
  • MATLAB 是错误的,每年两次的每个新版本都会删除旧的并带来新的错误。如果您确定调试模式不能正常工作,那么它就是 MATLAB 支持的情况。我有与 m-code、p-code 和编译的 exe 相同的代码运行 - 相同的代码行为不同,主要是 GUI 的工作方式。
于 2010-08-12T08:47:39.690 回答
2

value根据我的经验,当属性大于列表框中的条目数时,最常发生此错误。因此,每当您重新填充列表框时,都应该更新该value属性 - 出于安全原因将其设置为 1。

除此之外,请查看@Mikhail的出色评论。

于 2010-08-12T11:55:32.647 回答