Frage

Ich baue eine einfache MATLAB gui GUIDE. Ich habe eine Listbox von Elementen. Die meiste Zeit, es funktioniert wie erwartet, aber manchmal (in der Regel, nachdem ich bearbeiten die Figur mit GUIDE) bevölkert das Listenfeld bewirkt, dass es verschwinden, zusammen mit dieser Nachricht angezeigt:

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

Dieses Verhalten trotzt Debuggen! Wenn ich Schritt für Schritt durch, es funktioniert wie erwartet (ich vermute, dass es eine Art Faden Rasse oder etwas ist). Weiterhin in die Regel, es geht weg, nachdem die MATLAB-Umgebung neu zu starten, die unter identischen Bedingungen.

Die gesamte Dokumentation zu diesem Fehler gefunden siehe vorherige / alte Versionen von MATLAB (Ich verwende R2010a).

Irgendwelche Ideen oder Informationen zu diesem Thema wäre sehr dankbar!


EDIT: Dank Mikhail, scheinen ich das Problem gelöst zu haben. Ich bin meinen Code hier für die Zukunft veröffentlichen.

Nach vielen Debug-Druck-und Wild Klicken, fand ich, dass manchmal, wenn Sie das Listenfeld fragen, welche ausgewählt ist, können Sie ein leeres Ergebnis. Diese und andere Probleme gemacht Dinge drunter und drüber gehen. Ich zog alle meine Schreib Interaktionen der Listbox in eine zentrale Funktion, und ich schrieb einige Tests Code, um sicherzustellen, dass die Dinge bleiben, wie sie sollten.

Bitte beachten Sie, dass diese (auf R2010a) in meiner eigenen Umgebung getestet wurde und nicht umfassend. Auch ist der Code ein wenig überflüssig, aber es hat mich trotzdem gut fühlen. (Dh. itemcount kann nicht weniger als 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
War es hilfreich?

Lösung

Dies ist ein bekannter Programmierfehler und es hat nichts mit Race-Bedingung zu tun!

Dies ist, wie es funktionieren soll:

Für Popup und Single-Auswahlliste string Eigenschaft darf nicht leer ist, das heißt, einige Inhalte haben. Aber es ist standardmäßig leer deshalb muss es immer definiert werden.

In Popup angezeigt (in Liste markiert) Element ist definiert durch zwei Eigenschaften string (als Zell Array von Strings) und value (die 1 Standardeinstellung).

Unter erstem Elemente in einem leeren Array offensichtlich nicht arbeiten, also die Steuerung nicht wiedergegeben werden kann!

Ihre Steuerelement List-Box ist mit Einzelauswahl - seine Eigenschaften min <max und value skalar und> 0. Listbox (aber nicht Popup) kann Multi-Auswahl sein, wenn Eigenschaft min> max, in diesem Fall value ein Array sein kann (die auch leer schon sagt) und leer string wird nicht zu Problemen führen.

Lesen Sie MATLAB-Hilfe für uicontrol Eigenschaften string, value, min, max, listboxtop

In der Praxis

  • Sie sagen, es manifestiert sich mit GUIDE nach der Bearbeitung. GUIDE erstellt Code-Behind. Nach dem alten Bearbeitung Code-Behind bleibt manchmal an seinem Platz.
  • Manchmal ist MATLAB empfindlich auf die Reihenfolge innerhalb einer Anweisung, das heißt set(hlist, 'value', 2, 'string', {'aa','bb'}) setzt naiv value zu 2 vor string lang genug ist, und Ungültigmachungseinträge UIControl.
  • MATLAB ist verwanzt, jede neue Version zweimal im Jahr alt entfernt und bringt neue Bugs. Wenn Sie sicher sind, dass Debugging-Modus funktioniert nicht, wie es soll, dann ist es ein Fall für MATLAB-Unterstützung. Ich habe denselben Code ausgeführt wird, wie m-Code, p-Code und kompilierte exe - denselben Code verhält sich anders, vor allem in wie GUI funktioniert
  • .

Andere Tipps

Nach meiner Erfahrung diese Fehler treten am häufigsten, wenn die value Eigenschaft größer als die Anzahl der Einträge in der Listbox ist. So, wenn Sie die Listbox besiedeln, sollten Sie die value Eigenschaft aktualisieren -. Auf 1 aus Sicherheitsgründen eingestellt

Other than that, überprüfen Sie die ausgezeichneten Kommentare von @ Mikhail .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top