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

Eventlistener mit Parameterübergabe

 

stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 13.03.2015, 15:21     Titel: Eventlistener mit Parameterübergabe
  Antworten mit Zitat      
Hallo zusammen,

ich habe einen Slider mit einem Eventlistener sodass, ich fließend Simulationsverläufe betrachten kann. Nun habe ich das Problem, dass ich in dem GUI ein lokales Handles (localhandle) habe um auf alle Figureinternen Objekte zuzugreifen und ein Projekthandles, welches GUI übergreifend arbeitet. Auf dem Projekthandles möchte ich natürlich nicht den lokalen Kram ablegen.

Das Problem ist jetzt, dass normalerweise ja beim Callback immer das handles der aktuellen Figure an die Callbackfunktion übergeben wird (hier das src in der Callback Methode, was natürlich meine Projektdaten nicht beinhaltet).
Wenn ich ohne Eventlistener arbeite kann ich dem Callback Projekthandles (hObject, oder eben guidata(hObject)) übergeben und habe keine Probleme. Aber es kommt immer eine Fehlermeldung, wenn ich versuche dem Eventlistener mitzuteilen, dass er Projekthandles ebenfalls überreichen soll. Matlab meckert natürlich wenn ich im Eventlistener nichts übergebe, da die Methode function SliderAnimation_Callback(src,~,hObject) "hObject" erwartet.

Beispiel:

Code:

% Lokaler Speicher
localHandle = guihandles(figObj);
% hObject wird dem GUI übergeben und beinhaltet die Projektdaten
projectHandle = guidata(hObject)

localHandle.SliderAnimation = uicontrol(...
    'Style',            'slider',...
    'Callback',         {@SliderAnimation_Callback,hObject});
% FEHLER
addlistener(localHandle.SliderAnimation,'ContinuousValueChange',{@SliderAnimation_Callback,hObject});

...

function SliderAnimation_Callback(src,~,hObject)
% Lokaler Speicher
h = guidata(src)
% Projektdaten
projectHandles = guidata(hObject)
 


Die Fehlermeldung lautet:
Code:
No method 'addlistener' with matching signature found. Callback must be a function handle.


Habe dazu im Internet leider nicht die Lösung gefunden.
Es gebe natürliche die Möglichkeit das Projekthandles in den lokalen Speicher zu legen und immer wieder zu aktualisieren, aber das wäre dann meines Erachtens nach Krücken bauen

Was mache ich falsch?
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.03.2015, 22:56     Titel: Re: Eventlistener mit Parameterübergabe
  Antworten mit Zitat      
Hallo stealth_mx,

Der Callback muss ein FunctionHandle sein. Cells sind nicht erlaubt. Hier hilft eine anonyme Funktion:
Code:
addlistener(localHandle.SliderAnimation, 'ContinuousValueChange', @(src, evt) SliderAnimation_Callback(src, evt, hObject));

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 16.03.2015, 09:45     Titel:
  Antworten mit Zitat      
Hi,

nun funkioniert es!

Was ich allerdings nicht ganz verstehe ist, wieso es funkioniert.

Ich erstelle einen Button und weise dem einen Callback zu. Nun wenn ich den Slider verschoben habe greift der Callback und führt die Funktion aus.

Beim Eventlistener verhält es sich ja etwas anders.

Wer ruft wen wie auf.

Ich sehe ja, dass die anonyme Funktion zwei Eingabewerte hat. Das würde ja bedeuten, dass mein Button mit dem Callback den Event triggert und an den standardmäßig src und evt übergibt. Und der EventlistenerCallback fügt dem ganzen nur noch das hObject zu und ruft dann die eigenliche Funktion auf.

Ist das irgendwo korrekt? Rolling Eyes
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.03.2015, 12:04     Titel:
  Antworten mit Zitat      
Hallo stealth_mx,

Zitat:
Beim Eventlistener verhält es sich ja etwas anders.
Wer ruft wen wie auf.

Der Event-Listener verhält sich ganz genauso wie der Callback.
Der Callback wird aufgerufen, denn man auf die Buttons des Slider klickt, in den Slider-Balken, oder den Slider mit der Maus verschiebt und die Maus wieder loslässt. Der Callback wird also durch diese 4 verschiedenen Events getriggert.
Zusätzlich wird nun ein Listener an das ContinuousValueChange-Event angehängt, also einfach ein weiterer callback von einem anderen Event ausgelöst, nämlich dem Verschieben des Sliders während die Maus noch gedrückt ist.

Zitat:
Ich sehe ja, dass die anonyme Funktion zwei Eingabewerte hat. Das würde ja bedeuten, dass mein Button mit dem Callback den Event triggert und an den standardmäßig src und evt übergibt. Und der EventlistenerCallback fügt dem ganzen nur noch das hObject zu und ruft dann die eigenliche Funktion auf.

Ganz genau so.

Bei den "normalen" Callbacks kann man als Vereinfachung ein Cell angeben statt der anonymous function. Das dient aber nur zur besseren Lesbarkeit. Es ist schade, dass das bei den ADDLISTENER-Methoden (noch) nicht geht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 17.03.2015, 13:22     Titel:
  Antworten mit Zitat      
Super danke für die Antwort! Wink
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 - 2024 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.