WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Wert aus Callback-Funktion auslesen

 

BlackRose

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2012, 10:38     Titel: Wert aus Callback-Funktion auslesen
  Antworten mit Zitat      
Hallo zusammen Smile

Kaum habe ich das erste Problem gelöst (siehe Frage eins vorher) habe ich schon das nächste Embarassed 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
 


Diese wird bei mir im Hauptfile folgendermassen aufgerufen

Code:
%
h_lt1 = uicontrol(h,'Style', 'checkbox', 'String', 'Beispiel', 'Position', [725, 250, 100, 50], 'Callback', {'draw_line_am', [125, 537],[160, 160], 'r', flag});
 


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.

Vielen Dank und liebe Grüsse Very Happy


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.07.2012, 15:13     Titel: Re: Wert aus Callback-Funktion auslesen
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackRose

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2012, 17:12     Titel:
  Antworten mit Zitat      
Hallo Jan,

Vielen, vielen Dank für deine ausführliche Antwort. Very Happy 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...

Liebe Grüsse
BlackRose
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.07.2012, 00:20     Titel:
  Antworten mit Zitat      
Hallo BlackRose,

Wenn Du den aktuellen Wert des Flags benötigst, musst Du den "handles"-Struct updaten:
Code:
handles = guidata(FigureHandle);

Ansonsten steht in "handles" immer noch der Wert drin, der bei der ersten Erzeugung reingeschrieben wurde.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackRose

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2012, 10:34     Titel:
  Antworten mit Zitat      
Hallo Jan,

Mit etwas basteln hat jetzt auch das funktioniert, vielen Dank Smile 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?

Viele Grüsse
BlackRose
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.07.2012, 13:42     Titel:
  Antworten mit Zitat      
Hallo BlackRose,

Was hast Du denn bisher versucht und welches konkrete Problem ist aufgetreten?

Du kannst in den Index der Checkbox als Parameter an die Callbacks weitergeben:
Code:
function draw_line_am(hObject, eventdata,x, y, color, index)
  handles = guidata(hObject);
  if handles.flag(index) == 1
    handles.flag(index) = 0;
    delete(handles.LineH);
    handles(LindH(index)) = NaN;
  else
    handles.LineH(index) = line(x,y,'LineWidth', 2.0, 'LineStyle', '-', 'Color', color);
    handles.flag(index) = 1;
  end
  guidata(hObject, handles);
end

% Und der Aufruf in der Main-Function:
handles.LineH = NaN(1,4);
handles.flag = zeros(1,4);
for i = 1:4
  uicontrol(h,'Style', 'checkbox', 'String', 'Beispiel', 'Position', [725, 250 - i*20, 100, 50], 'Callback', {@draw_line_am, [125, 537], [160, 160], 'r', i});
end
...
guidata(h, handles);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackRose

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2012, 14:19     Titel:
  Antworten mit Zitat      
Hallo Jan,

HEUREKA!!! Very Happy 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 Embarassed Embarassed Embarassed

Vielen, vielen, vielen Dank für deine Hilfe!!!! Very Happy
Liebe Grüsse,
Black Rose
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.07.2012, 13:30     Titel:
  Antworten mit Zitat      
Hallo BlackRose,

Schön, dass ich Dir helfen konnte.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.