Forum: PC-Programmierung Matlab: Status mehrerer Checkboxen abfragen


von Kevin K. (nemon) Benutzerseite


Lesenswert?

Hi,

ich bastel gerade meine erste GUI in Matlab zusammen und stehe gerade 
etwas auf dem Schlauch. Ich habe 10 Checkboxen. Immer, wenn eine sich 
ändert, soll eine Funktion aufgerufen werden, die der Reihe nach die 
Checkboxen nach ihrem Status abfragt und dementsprechend etwas macht. 
Also soll im zugehörigen M-File etwas stehen wie

function checkbox1_Callback(hObject, eventdata, handles)
    Auswerten();

...

function checkbox10_Callback(hObject, eventdata, handles)
    Auswerten();

...

function Auswerten
    if (get(handles.checkbox1,'Value')) == 1
        do_something_1;
    end
    if (get(handles.checkbox2,'Value')) == 1
        do_something_1;
    end


Leider geht das nicht. Matlab spuckt meistens Fehler aus wie "Input 
argument "handles" is undefined.". Ich schätze mal, dass die Funktion 
Auswerten "nicht weiß, zu welcher Figure sie gehört". Es wär echt toll, 
wenn mir jemand den entscheidenden Hinweis gibt. Ich muss mich zur Zeit 
leider etwas in einem Crashkurs in Matlab GUIs einarbeiten, daher bin 
ich da derzeit nicht wirklich fit drin.

von hp-freund (Gast)


Lesenswert?

Hallo Kevin,
hab zwar kein Matlab aber wie ich das sehe solltest Du für jede Checkbox 
ein handle erzeugen.
Siehe:
http://www.mathworks.com/help/techdoc/creating_guis/f15-998661.html#f15-1001600
und
Button Group

ich würde es so versuchen...

...
hp-freund

von Remote O. (remote1)


Lesenswert?

Ohne jetzt deinen ganzen code zu kennen, würde ich sagen, du musst erst 
einmal die handles Struktur anlegen und vor allem jedes mal, wenn du da 
was änderst, das auch global bekannt machen mit:

% Update handles structure
guidata(hObject, handles);

So mach ich das zumindest immer. Schau dir die Funktion guidata einfach 
mal genauer an.

Ich mache das immer in der Funktion ..._OpeningFcn. Da wird das handle 
ja von Matlab angelegt. Je nach dem was ich machen will, erweitere ich 
mir natürlich noch die Struktur - hier mal ein Auszug aus einer meine 
guis:
1
% --- Executes just before dspace is made visible.
2
function dspace_OpeningFcn(hObject, eventdata, handles, varargin)
3
% This function has no output args, see OutputFcn.
4
% hObject    handle to figure
5
% eventdata  reserved - to be defined in a future version of MATLAB
6
% handles    structure with handles and user data (see GUIDATA)
7
% varargin   command line arguments to dspace (see VARARGIN)
8
9
% Choose default command line output for dspace
10
handles.output = hObject;
11
% globale gui Variable, welche dSpace Varable enthält
12
handles.file   = []; 
13
% globale gui Variable, welche handles für dynamisch erstellte checkboxes
14
% enthält
15
handles.checkboxhandles=[];
16
17
% handles Initialisieren
18
handles.objects=[];
19
movegui('center');
20
21
% Units auf pixels umstellen um besseres rechnen mit Position zu
22
% ermöglichen (bei dynamisch erstellten checkboxes ist automatisch pixels
23
% eingestellt)
24
set(handles.figure1,'Units','pixels');
25
26
%set(handles.figure1,'Toolbar','figure');    % toolbar einblenden
27
pth=findall(gcf,'Type','uipushtool');       % handle von pushtools erhalten
28
set(pth(:,1),'Visible','off');              % pushtools verbergen
29
tts=get(pth,'TooltipString');               % TooltipString auslesen
30
set(pth(find(ismember(tts,'Hide Plot Tools')),1),'Separator','off');
31
tth=findall(gcf,'Type','uitoggletool');     % handle von toggletools erhalten
32
tts=get(tth,'TooltipString');               % TooltipString auslesen
33
set(tth(find(ismember(tts,'Edit Plot')),1),'Separator','off');
34
35
% icon=load('CDataDualcursor.mat');
36
% tbh=findall(gcf,'Type','uitoolbar');
37
% uipushtool(tbh,'CData',icon.CDataDualcursor,'TooltipString','Dual Data Cursor','ClickedCallback',{@MIDualCursor_Callback,handles});
38
39
% Update handles structure
40
guidata(hObject, handles);
41
42
% UIWAIT makes dspace wait for user response (see UIRESUME)
43
% uiwait(handles.figure1);

Wichtig ist hier, das du die struktur handles am Ende aktualisierst und 
damit global bekannt gibst
Also mit guidata(hObject, handles);
Dann kannst du in jeder Funktion darauf zugreifen und deine Struktur 
auch beliebig erweitern. Natürlich das Aktualisieren nicht vergessen.

Lies dir mal hier
http://www.mathworks.com/help/techdoc/ref/guidata.html
den Abschnitt "Using guidata in a GUIDE GUI" genau durch!!!!

von Kevin K. (nemon) Benutzerseite


Lesenswert?

Danke euch beiden, nach etwas Einlesungszeit und paar Versuchen hat es 
nun erfolgreich geklappt. Da lag doch wohl gestern Abend ein zu großes 
Nichtverständnis des Objekthandlings unter Matlab vor ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.