Domanda

Sto costruendo un gui MATLAB semplice utilizzando GUIDA. Ho una casella di riepilogo di elementi. La maggior parte del tempo, funziona come previsto, ma a volte (di solito dopo che ho modificare la figura con la guida) che popolano la casella di riepilogo induce a scomparire, insieme a questo messaggio:

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

Questo comportamento sfida debug! Quando faccio un passo attraverso, funziona come previsto (ho il sospetto che è una sorta di gara di thread o qualcosa del genere). Inoltre, di solito va via dopo aver riavviato l'ambiente MATLAB, in condizioni identiche.

Tutta la documentazione trovato su questo errore si riferiscono alle versioni precedenti / antica di MATLAB (sto usando R2010a).

Tutte le idee o informazioni su questo argomento sarebbe molto apprezzato!


EDIT: grazie a Mikhail, mi sembra di aver risolto il problema. Vi metto il mio codice qui per riferimento futuro.

Dopo un sacco di stampa di debug e facendo clic selvaggia, ho scoperto che a volte quando si chiede la casella di riepilogo ciò che viene selezionata, si ottiene un risultato vuoto. Questo e altri problemi ha reso le cose vanno in tilt. Ho spostato tutti i miei interazioni scrittura alla casella di riepilogo in una funzione centralizzata, e ho scritto qualche codice di test per garantire che le cose rimangono come dovrebbero.

Si prega di notare che questo è stato provato nel mio ambiente (su R2010a) e non ampiamente. Inoltre, il codice è un po 'ridondante, ma mi ha fatto sentire bene comunque. (Es. itemcount non può essere inferiore a 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
È stato utile?

Soluzione

Questa è una nota di programmazione errori e non ha nulla a che fare con la condizione di competizione!

Questo è come dovrebbe funzionare:

Per un'altra e selezione singola proprietà Elenco string devono essere non-vuoto, cioè avere alcuni contenuti. Ma è vuota di default quindi deve sempre essere definito.

In un'altra visualizzata (nell'elenco evidenziato) elemento è definito da due proprietà string (come matrice di celle di stringhe) e value (che è 1 di default).

Prendendo primo elemento di un array vuoto ovviamente non lavoro, quindi il controllo non può essere reso!

Il controllo Casella di riepilogo è a selezione singola - le sue proprietà min <max e value è scalare e> 0. Listbox (ma non un'altra) possono essere multi-selezione se la proprietà min> max, in questo caso value può essere un array (che implica anche vuoto) e string vuoto non provoca alcun problema.

Leggi MATLAB help per UIControl proprietà string, value, min, max, listboxtop

In pratica

  • dire che si manifesta dopo la modifica con guida. GUIDA crea code-behind. Dopo aver modificato vecchio code-behind a volte rimane in vigore.
  • A volte MATLAB è sensibile l'ordine all'interno di una dichiarazione, vale a dire set(hlist, 'value', 2, 'string', {'aa','bb'}) imposta value ingenuamente a 2 prima string è abbastanza lungo e invalida UIControl.
  • MATLAB è bacato, ogni nuova versione due volte l'anno rimuove vecchio e porta nuovi bug. Se si è certi che la modalità di debug non funziona come dovrebbe, allora è un caso per il supporto MATLAB. Ho lo stesso codice in esecuzione di M-code, p-code e exe compilato - stessi si comporta in modo diverso codice, soprattutto nel modo in cui funziona GUI
  • .

Altri suggerimenti

Nella mia esperienza, questo errore più spesso si verifica quando la proprietà value è più grande del numero di voci nella casella di riepilogo. Così, ogni volta che si ripopolare la casella di riepilogo, è necessario aggiornare la proprietà value -. Impostarlo su 1 per motivi di sicurezza

Oltre a questo, controllare gli ottimi commenti di @ Mikhail .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top