Продолжаем добавлять элементы в listbox

#matlab #matlab-guide

#matlab #matlab-руководство

Вопрос:

Я использую listbox для отображения сообщений и журналов моей программы. Чтобы добавлять строки по мере выполнения программы, я определил глобальный индекс следующим образом

 function pushbutton_Callback(hObject, eventdata, handles)
global idx
%stuff
idx = idx   1;
logs_data(idx,1) = cellstr('First string');
set(handles.logs, 'String', logs_data); %Listbox
%other stuff
  

Используя global, я проверил, что на первой итерации (когда я нажимаю кнопку в первый раз), idx это пустая ячейка, которую я инициализирую 1 . Я написал строку, а затем, если я снова нажму на кнопку, idx появится 2 добавление новой строки под предыдущей. Единственная проблема заключается в том, что когда я делаю это, массив logs_data становится вектором с пустыми ячейками, кроме той, которая была добавлена в данный момент.

Например, если я нажму на кнопку 5 раз, я хочу иметь logs_data массив размером 5×1 со строками внутри

 Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
  

но вместо этого я получаю это

 []
[]
[]
[]
Iteration 5
  

Как я могу это решить? В другом случае я мог бы использовать for увеличивающийся idx цикл, но поскольку здесь я нахожусь внутри обратного вызова кнопки, я не могу использовать это решение.

Комментарии:

1. В настоящее время у меня нет доступа к MatLab, поэтому я не могу предоставить вам полный ответ, тем не менее, пара подсказок: согласно опубликованному вами коду, logs_data не является глобальной переменной и не была объявлена как persistent ; это означает, что при каждом обратном вызове она создается, а ее предыдущее содержимое теряется. Поскольку вы увеличиваете индекс при обращении к нему, вы получаете пустые ячейки. Каждый раз, когда вы вызываете обратный вызов, вы должны получить содержимое listbox в logs_data (используя get или dot notation ), добавить новый элемент и назначить его listbox.

2. Решаемая с вашим предложением. Просто добавляю get(handles.logs,'String') и вызываю logs_data(:,1) = list;