Matlab Guide Gui ListBox desaparece intermitentemente com erro aparentemente obsoleto
-
27-09-2019 - |
Pergunta
Estou construindo uma GUI direta do Matlab usando o guia. Eu tenho uma caixa de lista de itens. Na maioria das vezes, funciona como esperado, mas às vezes (geralmente depois de editar a figura com guia), a preenchimento da caixa de listagem faz com que ele desapareça, junto com esta mensagem:
Warning: single-selection listbox control requires a scalar Value
Control will not be rendered until all of its parameter values are valid
Esse comportamento desafia a depuração! Quando eu pulo, funciona como esperado (suspeito que seja uma espécie de corrida de threads ou algo assim). Além disso, geralmente desaparece após reiniciar o ambiente do MATLAB, em condições idênticas.
Toda a documentação encontrada neste erro refere -se a versões anteriores/antigas do MATLAB (estou usando o R2010A).
Quaisquer idéias ou informações sobre esse assunto seriam muito apreciadas!
EDIT: Graças a Mikhail, pareço ter resolvido o problema. Estou postando meu código aqui para referência futura.
Depois de muitos depuração de impressão e cliques selvagens, descobri que, às vezes, quando você pergunta ao ListBox o que é selecionado, você obtém um resultado vazio. Este e outros problemas fizeram com que as coisas fossem confundidas. Mudei todas as minhas interações de escrita para a caixa de listagem para uma função centralizada e escrevi algum código de teste para garantir que as coisas permaneçam do jeito que deveriam.
Observe que isso foi testado em meu próprio ambiente (no R2010A) e não extensivamente. Além disso, o código é um pouco redundante, mas me fez sentir bem de qualquer maneira. (ou seja. itemcount
não pode ser menor que 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
Solução
Este é um erro de programação conhecido e não tem nada a ver com a condição de corrida!
É assim que deve funcionar:
Para uma lista pop-up e de seleção única string
A propriedade deve não estar vazia, ou seja, ter algum conteúdo. Mas está vazio por padrão, portanto, deve ser sempre definido.
No Item Popup Exibido (na Lista Destaque) é definido por duas propriedades string
(como matriz celular de cordas) e value
(qual é 1
por padrão).
Tomar o primeiro elemento em uma matriz vazia obviamente não funciona, portanto, o controle não pode ser renderizado!
Seu controle de caixa de listar é uma seleção única - suas propriedades min
< max
e value
é escalar e> 0. ListBox (mas não pop-up) pode ser multi-seleção se propriedade min
> max
, nesse caso value
pode ser uma matriz (o que implica também vazio) e vazio string
não causará problemas.
Leia o MATLAB Ajuda para as propriedades do UiControl string, value, min, max, listboxtop
Em práxis
- Você diz que isso se manifesta após a edição com guia. O guia cria código-behind. Depois de editar o antigo código-behind, às vezes permanece no lugar.
- Às vezes, o Matlab é sensível à ordem dentro de uma declaração, ou seja,
set(hlist, 'value', 2, 'string', {'aa','bb'})
define ingenuamentevalue
para2
antes dastring
é longo o suficiente e invalida o uicontrol. - O Matlab é buggy, cada nova versão duas vezes por ano remove e traz novos bugs. Se você tem certeza de que o modo de depuração não funciona, não é um caso para o suporte ao MATLAB. Eu tenho o mesmo código em execução que o código M, o código P e o exe compilado-o mesmo código se comporta de maneira diferente, principalmente na forma como a GUI funciona.
Outras dicas
Na minha experiência, esse erro ocorre com mais frequência quando o value
A propriedade é maior que o número de entradas na caixa de listagem. Assim, sempre que você repovoar a caixa de listar, você deve atualizar o value
Propriedade - Defina -o como 1 por razões de segurança.
Fora isso, verifique os excelentes comentários de @Mikhail.