Return value from 'get' into handles in GUI [R2017b, Windows7]

3 ビュー (過去 30 日間)
TJ
TJ 2018 年 1 月 9 日
コメント済み: Adam 2018 年 1 月 10 日
Hello,
This question stems off of another question but I thought it would add more value to have it as a spate question.
I have a GUI produced in GUIDE. It has an axes object. On the axes are three line plots:
handles.P(1) = line(handles.Plot1, 'XData', chunktime', 'YData', normChunk1, 'Color', 'Blue', 'Tag', 'Ch1Line');
handles.P(2) = line(handles.Plot1, 'XData', chunktime', 'YData', normChunk2, 'Color', 'Green', 'Tag', 'Ch2Line');
handles.P(3) = line(handles.Plot1, 'XData', chunktime', 'YData', normChunk3, 'Color', 'Red', 'Tag', 'Ch3Line');
These plots are produced in a push button callback. When I then click on one of the lines I want to select the line and make the 'tag' property available in the handles structure so that I can test which line was clicked and then reverse the phase of the line. So I have a separate line of code by itself (not inside any other call back):
set(handles.P, 'ButtonDownFcn', {@LineSelected, handles.P}) % Use set command with pointer to 'LineSelected' function which has argument handles.P.
I then have the LineSelected function:
function LineSelected(hObject, eventdata, AllLines)
set(AllLines, 'LineWidth', 0.5);
set(hObject, 'LineWidth', 2.5);
handles.clickedLine = get(hObject, 'Tag');
guidata(hObject, handles);
When I run my application handles.clickedLine is not available. In debug mode I have also manually checked the handles structure and this does not exist. Any ideas how to get some property of the clicked line that I can then use to detect which line was clicked, preferably building on from my code I already have?
Kind regards, TJ
  4 件のコメント
Guillaume
Guillaume 2018 年 1 月 9 日
編集済み: Guillaume 2018 年 1 月 9 日
@Adam, no, AllLines should exist since the callback is defined as {@LineSelected, handles.P}. It will receive the value of handles.P.
handles is more of an issue. Indeed it should be retrieved prior to setting it. As it is either a structure with just one field is created or, in the unlikely event that LineSelected is a nested function, an outdated handle variable will be used.
Adam
Adam 2018 年 1 月 10 日
Ah yes, I never use the cell array form of defining a callback so I forgot how it works. When using function handles I explicitly include src and evt arguments when I need to add a further argument so I imagined handles.p to be the only argument passed down, which would then become hObject!
handles = guidata( hObject );
will retrieve the handles, in this case.
Matlab's way of happily just creating a new struct with one field (well, actually even just creating a new double variable too) rather than throwing an error has caught me out a few times when I have made a typo in a class object name too!

サインインしてコメントする。

回答 (0 件)

カテゴリ

Help Center および File ExchangeInteractive Control and Callbacks についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by