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
Foi útil?

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 ingenuamente value para 2 antes da string é 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top