Pregunta

Estoy construyendo una interfaz gráfica de usuario sencilla utilizando MATLAB GUÍA. Tengo un cuadro de lista de elementos. La mayor parte del tiempo, funciona como se espera, pero a veces (por lo general después de editar la figura con GUIDE) poblar el cuadro de lista provoca que desaparezca, junto con este mensaje:

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

Este comportamiento desafía depuración! Cuando me paso a través, funciona como se esperaba (sospecho que es una especie de carrera hilo o algo así). Además, por lo general desaparece después de reiniciar el entorno MATLAB, en condiciones idénticas.

Toda la documentación encontrada en este error se refieren a versiones anteriores / antigua de MATLAB (estoy usando R2010a).

Cualquier idea o información sobre este tema sería muy apreciada!


EDIT: gracias a Mikhail, que parecen haber resuelto el problema. Estoy publicar mi código aquí para referencia futura.

Después de un montón de impresión de depuración y haciendo clic salvaje, he encontrado que a veces cuando se pide el cuadro de lista de lo que se ha seleccionado, se obtiene un resultado vacío. Este y otros problemas hizo que las cosas se descontrolan. Me moví todos mis interacciones de escritura al cuadro de lista en una función centralizada, y escribí algo de código de pruebas para asegurar que las cosas permanecen como deberían.

Tenga en cuenta que esto ha sido probado en mi propio entorno (en R2010a) y no ampliamente. Además, el código es un poco redundante, pero me hizo sentir bien de todos modos. (Es decir. itemcount no puede ser inferior 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
¿Fue útil?

Solución

Esto es un error conocido de programación y no tiene nada que ver con la condición de carrera!

Ésta es la forma en que debería funcionar:

Para emergente y de selección única propiedad Lista string deben ser no-vacío, es decir, tener algo de contenido. Pero está vacío de forma predeterminada, por lo tanto hay que define siempre.

En emergente que aparece (en la Lista de resaltado) elemento está definido por dos propiedades string (como matriz de células de cadenas) y value (que es 1 por defecto).

Teniendo primer elemento de una matriz vacía, obviamente, no funciona, por lo tanto, el control puede no traducirse!

El control de cuadro de lista es la selección de un solo - sus propiedades min <max y value es escalar y> 0. Cuadro de lista (pero no Emergente) pueden ser múltiples de selección si min propiedad> max, en este caso value puede ser un array (que también implica vacío) y string vacío no causará problemas.

Leer MATLAB Ayuda para uicontrol propiedades string, value, min, max, listboxtop

En la praxis

  • Usted dice que se manifiesta después de editar con un GUÍA. GUÍA crea código subyacente. Después de la edición antigua de código subyacente a veces permanece en su lugar.
  • A veces MATLAB es sensible al orden dentro de una declaración, es decir, set(hlist, 'value', 2, 'string', {'aa','bb'}) establece value ingenuamente a 2 antes string es lo suficientemente largo e invalida uicontrol.
  • MATLAB está libre de errores, cada nueva versión elimina dos veces al año de edad y trae nuevos errores. Si está seguro de que el modo de depuración no funciona como debería, entonces es un caso para el apoyo de MATLAB. Tengo mismo código que se ejecuta como M-código, p-código y exe compilado - mismas se comporta de manera diferente de código, sobre todo en cómo funciona la interfaz gráfica de usuario
  • .

Otros consejos

En mi experiencia, este error se produce con mayor frecuencia cuando la propiedad value es mayor que el número de entradas en el cuadro de lista. Por lo tanto, cada vez que repoblar el cuadro de lista, debe actualizar la propiedad value -. Configurarlo a 1 por razones de seguridad

Aparte de eso, comprobar los excelentes comentarios por @ Mikhail .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top