Question

Je construis une simple interface de Matlab en utilisant GUIDE. J'ai une zone de liste d'articles. La plupart du temps, il fonctionne comme prévu, mais parfois (généralement après je modifier la figure avec un guide) peuplant la zone de liste l'amène à disparaître, avec ce message:

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

Ce comportement défie le débogage! Quand je fais un pas à travers, cela fonctionne comme prévu (je pense qu'il est une sorte de course de fil ou quelque chose). De plus, il disparaît généralement après le redémarrage de l'environnement Matlab, dans des conditions identiques.

Tous les documents trouvés sur cette erreur se réfèrent aux versions précédentes / ancienne de Matlab (je me sers R2010a).

Des idées ou des informations sur ce sujet serait grandement apprécié!


EDIT: Merci à Mikhail, il me semble avoir résolu le problème. Je posterai mon code ici pour référence future.

Après beaucoup d'impression de débogage et en cliquant sauvage, je trouve que, parfois, quand vous demandez la zone de liste ce qui est sélectionné, vous obtenez un résultat vide. Ceci et d'autres problèmes ont rendu les choses se détraquer. Je me suis déplacé toutes mes interactions d'écriture à la zone de liste dans une fonction centralisée, et je l'ai écrit un code de test pour faire en sorte que les choses restent comme elles le devraient.

S'il vous plaît noter que cela a été testé dans mon propre environnement (sur R2010a) et non largement. En outre, le code est redondant bits, mais il m'a fait sentir bien quand même. (Ie. itemcount ne peut pas être inférieure à 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
Était-ce utile?

La solution

Ceci est une programmation connue erreur et il n'a rien à voir avec l'état de la course!

Voici comment cela devrait fonctionner:

Pour Popup et liste propriété string unique de sélection doit être non vide, à savoir avoir un contenu. Mais il est vide par défaut il doit donc être toujours définie.

Dans Popup affiché (la liste en surbrillance) élément est défini par deux propriétés string (comme matrice de cellules de chaînes) et value (qui est 1 par défaut).

La prise premier élément d'un tableau vide ne signifie évidemment pas le travail, donc le contrôle ne peut pas être rendu!

Votre contrôle Listbox est simple sélection - ses propriétés min <max et value est-scalaire et> 0. Listbox (mais pas Popup) peuvent être multi-sélection si la propriété min> max, dans ce cas value peut être un tableau (ce qui implique aussi vide) et string vide ne causeront aucun problème.

Lire Matlab Aide pour les propriétés uicontrol string, value, min, max, listboxtop

Dans praxis

  • Vous dites qu'il se manifeste après l'édition avec GUIDE. GUIDE crée un code-behind. Après avoir modifié l'ancien code-behind reste parfois en place.
  • Parfois, Matlab est sensible à l'ordre dans une instruction, à savoir set(hlist, 'value', 2, 'string', {'aa','bb'}) définit value naïvement 2 avant string est assez long et Invalide UIControl.
  • MATLAB est bogué, chaque nouvelle version deux fois par an supprime les anciens et apporte de nouveaux bugs. Si vous êtes sûr que le mode débogage fonctionne pas comme il se doit alors il est un cas pour le soutien Matlab. J'ai même code en cours d'exécution en tant que m-code, code p et compilé exe - même code se comporte différemment, principalement dans la façon dont fonctionne l'interface graphique
  • .

Autres conseils

Dans mon expérience, cette erreur se produit le plus souvent lorsque la propriété value est plus grand que le nombre d'entrées dans la zone de liste. Ainsi, chaque fois que vous repeupler la zone de liste, vous devez mettre à jour la propriété value -. Fixer à 1 pour des raisons de sécurité

Autre que cela, vérifiez les excellents commentaires par @ Mikhail .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top