Verfasst am: 03.07.2012, 10:38
Titel: Wert aus Callback-Funktion auslesen
Hallo zusammen
Kaum habe ich das erste Problem gelöst (siehe Frage eins vorher) habe ich schon das nächste Ich habe eine Checkbox, die, wenn angeklickt, eine Linie zeichnen soll. Dafür habe ich eine Mini-Callbackfunktion (in einem separaten m-File) geschrieben, die so aussieht:
Code:
%
function[handle, flag] = draw_line_am(hObject, eventdata,x, y, color, flag)
handle = line(x,y,'LineWidth', 2.0, 'LineStyle', '-', 'Color', color);
flag = 1;
end
Es funktioniert alles, meine Frage ist jetzt aber, wie ich die übergebene Variable flag, die in der Callback-Funktion auf 1 gesetzt wird, auch wieder im Hauptfile auslesen kann (und natürlich auch das handle)
Die Idee dahinter ist, dass mir die Variable "flag" anzeigt, dass diese Checkbox aktiviert wurde (diese Information brauche ich später im Code noch)
Und meine zweite Frage (aber bei weitem nicht so wichtig, wie das, was ich gerade beschrieben habe): Gibt es einen einfachen Weg, auszulesen ob die Checkbox nochmals angeklickt wurde (also das x wieder weg ist)? In dem fall sollte nämlich die Linie wieder verschwinden und das flag auf 0 gesetzt werden.
Verfasst am: 03.07.2012, 15:13
Titel: Re: Wert aus Callback-Funktion auslesen
Hallo BlackRose,
Zitat:
Kaum habe ich das erste Problem gelöst (siehe Frage eins vorher) ...
Wenn die vorhergehende Frage wichtig ist, poste bitte den Link dazu. Es ist beim Lesen im Forum kaum nachzuvollziehen, was "eins vorher" bedeuten könnte. Wenn die vorhergehende Frage nicht wichtig für diese Frage ist, lasse dies am besten weg - bevor es noch jemanden verwirrt. Je knackiger eine Frage, desto leichter lässt sie sich beantworten. Leider gibt es hier im forum nur gaaanz wenige Fragen, die ich mal mit "ja" oder "nein" beantworten konnte; das macht nämlcih wirklich Spaß!
Die Ausgaben der callbacks wandern verwaist in den Base-Workspace. Es ist deshalb besser, sie nicht zu verwenden. Besser:
Code:
function draw_line_am(hObject, eventdata,x, y, color)
handles = guidata(hObject);
if handles.flag == 1
handles.flag = 0;
delete(handles.LineH);
else
handles.LineH = line(x,y,'LineWidth', 2.0, 'LineStyle', '-', 'Color', color);
handles.flag = 1;
end guidata(hObject, handles);
end
% Und der Aufruf in der Main-Function:
handles.LineH = [];
handles.flag = 0;
h_lt1 = uicontrol(h,'Style', 'checkbox', 'String', 'Beispiel', 'Position', [725, 250, 100, 50], 'Callback', {@draw_line_am, [125, 537], [160, 160], 'r'});
... % Am Ende der Erstellung des GUIs: guidata(h, handles);
das Flag und der Handle des Line-Objekts werden also per GUIDATA gespeichert und upgedated. Dass die entsprechende Variable "handles" heißt, sollte nicht verwirren: "flag" passt da auch gut rein. Der Name "handles" ist nur üblich, weil darin oft auch die Handles der UICONTROLs etc. gespeichert werden.
GUIDATA ist übrigens ein Wrapper für SETAPPDATA und GETAPPDATA, die Structs in einem GUI speichern und auslesen. Im grunden ist das identisch zur Verwendung von "set(FigureH, 'UserData', handles)".
Gruß, Jan
BlackRose
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.07.2012, 17:12
Titel:
Hallo Jan,
Vielen, vielen Dank für deine ausführliche Antwort. Ich habe es mal bei mir eingefügt und es funktioniert sehr gut nur eines verstehe ich nicht: Wenn ich zum Schluss das flag im Hauptcode auslese (mit handles.flag) bekomme ich immer 0, egal, ob die Checkbox aktiviert wurde oder nicht. Die Linie zeichnet er aber bzw. lässt sie auch wieder verschwinden. Diese "Flag-Information" würde ich aber brauchen, um später noch etwas anderes zu machen...
Ansonsten steht in "handles" immer noch der Wert drin, der bei der ersten Erzeugung reingeschrieben wurde.
Gruß, Jan
BlackRose
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.07.2012, 10:34
Titel:
Hallo Jan,
Mit etwas basteln hat jetzt auch das funktioniert, vielen Dank Nun stehe ich aber vor dem Problem, dass diese draw_line_ap von 4 Checkboxes aufgerufen werden kann, die alle im gleichen Bild sind. Wenn ich jetzt die erste Checkbox anklicke, taucht die Linie wie gewünscht auf, wenn ich die zweite Checkbox anklicke, verschwindet sie aber wieder, statt eine weitere zu zeichnen etc. Gibt es einen Befehl wie ich überprüfen kann, welche der 4 Checkboxen diese Funktion aufruft? Oder sonst eine Möglichkeit, wie ich das verhindern kann?
HEUREKA!!! Das war, was ich gebraucht habe! Ich habe es zwar ähnlich probiert, in dem ich bei draw_line eine Switch-Anweisung für die einzelnen Checkboxes gemacht habe aber das Problem war trotzdem nicht gelöst, weil das mit der Datenausgabe nicht geklappt hat (logisch, es wurde von allen 4 Checkboxen die gleiche Variable überschrieben). Der einfache aber geniale Hinweis, dass man handles.LineH und handles.flag ja auch nocheinmal mehrdimensional anlegen kann, hat mich jetzt zum Ziel geführt. Eigentlich eine völlig einfache/logische Überlegung aber ich bin einfach nicht drauf gekommen, weil ich bisher immer um das Verwenden von Strukturen herum gekommen bin und keine Ahnung hatte, wie die genau funktionieren
Vielen, vielen, vielen Dank für deine Hilfe!!!!
Liebe Grüsse,
Black Rose
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.