GUIDE Matlab disparaît par intermittence IUG listbox avec l'erreur apparemment obsolète
-
27-09-2019 - |
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
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éfinitvalue
naïvement2
avantstring
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 .