يختفي مرشد MATLAB GUI Listbox بشكل متقطع بخطأ قديم على ما يبدو
-
27-09-2019 - |
سؤال
أقوم ببناء دليل MATLAB المباشر باستخدام دليل. لدي قائمة من العناصر. في معظم الأوقات ، يعمل كما هو متوقع ، ولكن في بعض الأحيان (عادة بعد تحرير الشكل مع دليل) ، يؤدي ملء صندوق القائمة إلى اختفائه ، إلى جانب هذه الرسالة:
Warning: single-selection listbox control requires a scalar Value
Control will not be rendered until all of its parameter values are valid
هذا السلوك يتحدى تصحيح الأخطاء! عندما أتجول ، يعمل كما هو متوقع (أظن أنه نوع من سباق الخيوط أو شيء من هذا القبيل). علاوة على ذلك ، عادة ما يختفي بعد إعادة تشغيل بيئة MATLAB ، في ظل ظروف مماثلة.
تشير جميع الوثائق الموجودة في هذا الخطأ إلى الإصدارات السابقة/القديمة من MATLAB (أنا أستخدم R2010A).
أي أفكار أو معلومات حول هذا الموضوع سيكون موضع تقدير كبير!
تحرير: بفضل ميخائيل ، يبدو أنني حللت المشكلة. أقوم بنشر الكود الخاص بي هنا للرجوع إليه في المستقبل.
بعد الكثير من طباعة التصحيح والنقر فوق البرية ، وجدت أنه في بعض الأحيان عندما تسأل Listbox ما هو محدد ، ستحصل على نتيجة فارغة. هذه المشاكل وغيرها من المشاكل جعلت الأمور تسير على الأسرار. لقد نقلت جميع تفاعلات الكتابة الخاصة بي إلى صندوق القائمة إلى وظيفة مركزية ، وكتبت بعض رمز الاختبار لضمان بقاء الأمور بالطريقة التي ينبغي.
يرجى ملاحظة أنه تم اختبار هذا في بيئتي الخاصة (على R2010A) وليس على نطاق واسع. أيضا ، الكود زائد بعض الشيء ، لكنه جعلني أشعر أنني بحالة جيدة على أي حال. (بمعنى آخر. itemcount
لا يمكن أن يكون أقل من 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
المحلول
هذا هو برمجة معروفة ولا علاقة له بحالة العرق!
هذه هي الطريقة التي يجب أن تعمل بها:
لقائمة المنبثقة والرقص الفردي string
يجب أن تكون العقار غير فارغ ، أي أن لديك بعض المحتوى. لكنه فارغ بشكل افتراضي لذلك يجب أن يتم تعريفه دائمًا.
في المنبثقة المعروضة (في القائمة المميزة) ، يتم تعريف العنصر بواسطة خصائصين string
(كصفيف الخلايا من السلاسل) و value
(الذي 1
بشكل افتراضي).
من الواضح أن أخذ العنصر الأول في صفيف فارغ لا يعمل ، وبالتالي لا يمكن تقديم التحكم!
التحكم في صندوق القائمة الخاص بك هو اختيار واحد - خصائصه min
< max
و value
هو القياسي و> 0. يمكن أن يكون Listbox (ولكن ليس منبثقًا) متعدد الاختيار إذا كان الخاصية min
> max
, ، في هذه الحالة value
يمكن أن تكون صفيفًا (مما يعني أيضًا فارغًا) وفارغًا string
لن يسبب مشاكل.
اقرأ Matlab Help for Uicontrol Properties string, value, min, max, listboxtop
في براكسيس
- أنت تقول أنها تتجلى بعد التحرير مع دليل. دليل إنشاء رمز behind. بعد تحرير الكود القديم يبقى في بعض الأحيان في مكانه.
- في بعض الأحيان يكون Matlab حساسًا للطلب داخل بيان واحد ، أي
set(hlist, 'value', 2, 'string', {'aa','bb'})
مجموعات بسذاجةvalue
إلى2
قبلstring
طويل بما فيه الكفاية ويبطل uicontrol. - MATLAB هو عربات التي تجرها الدواب ، كل إصدار جديد مرتين في السنة يزيل القديم ويجلب الأخطاء الجديدة. إذا كنت متأكدًا من أن وضع تصحيح الأخطاء يعمل ليس كما ينبغي ، فهو حالة لدعم MATLAB. لدي نفس الرمز الذي يعمل كـ m-code و p-code و exe المترجمة-نفس الرمز يتصرف بشكل مختلف ، وخاصة في كيفية عمل واجهة المستخدم الرسومية.
نصائح أخرى
في تجربتي ، يحدث هذا الخطأ في أغلب الأحيان عندما يكون value
الخاصية أكبر من عدد الإدخالات في صندوق القائمة. وبالتالي ، كلما قمت بإعادة تخصيص مربع القائمة ، يجب عليك تحديث value
الممتلكات - اضبطها على 1 لأسباب تتعلق بالسلامة.
بخلاف ذلك ، تحقق من التعليقات الممتازة mikhail.