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

Callbacks innerhalb einer Klassen definieren

 

Martinuk
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2019, 16:29     Titel: Callbacks innerhalb einer Klassen definieren
  Antworten mit Zitat      
Hallo Leute,

ich möchte mittels einer Klasse Steuerelemente für eine GUI erstellen. In diesem einfachen Beispiel einfach 1x Pushbutton (uicontrol) dem ich eine Callback-Funktion zuweise.

Nun für gewöhnlich ruft meine eine Callback-Funktion mit
Code:

pushbutton = uicontrol(...
 'Callback', @callThisFcn);
 

auf. Der Funktion wird dann automatisch das Objekt welches den Callback abfeuert übergeben.
Code:

function callThisFcn(obj, ~) %keine evnt, keine weiteren Input Argumente
    obj
    disp('Hello World')
end  
 


Nun in meiner Klasse (ClassA) wie gesagt funktioniert das scheinbar nun etwas anders.

Code:
classdef ClassA
    properties
        propA
        propB
    end
   
    methods
        function obj = ClassA()
            hFig = figure('Position', [500 500 300 200]);
            pushbutton = uicontrol(hFig, 'Style', 'pushbutton', ...
                                   'String', 'Push me', ...
                                   'Units', 'Normalized', ...
                                   'Position', [.3 .4 .4 .2], ...
                                   'Callback', @(src, evnt) obj.callThisFcn);
        end
       
        function outputArg = callThisFcn(obj, ~)
            clc
            disp('Function called')
            obj
            disp('Hello World')
        end
    end
end


1. Wieso muss man denn hier nun 'Callback', @(src, evnt) obj.callThisFcn schreiben?
Ist src, evnt als Name eigentlich richtig? - ich habe nur diese Namen gewählt weil diese in der Regel so gewählt werden.
Ist das generell innerhalb von Klassen so oder ist das erst ab einer bestimmten MATLAB Version eingeführt worden?

2. Wieso wird dann in der Funktion selbst mit obj die Klasse mit ihren Eigenschaften ausgegeben? Wie zuvor beschrieben wird doch normalerweise das Objekt das den Callback aufruft an die Funktion übergeben...?
Wie kann ich den handle des pushbuttons an die Funktion zusätzlich übergeben?

3. callThisFcn(obj, ~)
Wenn ich ~ durch evnt ersetze dann erhalte ich aber keine eventdaten, da erhalte ich eine Fehlermeldung. Wieso gibt es hier keine eventdata?

Würde mir ungemein helfen wenn ihr mir zu diesen Fragen eine Hilfestellung geben und Licht ins Dunkel bringen könntet.

Vielen Dank.
Private Nachricht senden Benutzer-Profile anzeigen


Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2019, 17:05     Titel:
  Antworten mit Zitat      
Hallo nochmal,

ein Stückchen bin ich weitergekommen aber ganz verstehen tue ich das nicht.

Ich habe den Callback geändert auf

Code:
'Callback', @(src, evnt) obj.callThisFcn(src, evnt)


und die Funktion selbst angepasst auf

Code:
function outputArg = callThisFcn(obj, hObject, evntdata)
%obj ... Klasse/Instanz
%hObject ... handle des UI controls (Pushbutton)
%evntdata ... ist auch eine Klasse/Struktur mit ActionItems
...
...
end


Aber wie geht das zusammen, ich übergebe der Funktion nur 2 Argumente (src, evnt) und die Funktion selbst übernimmt aber 3 Argumente (obj, hObject, eventdata)? Ich bin verwirrt...

Aber es funktioniert zumindest Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.01.2019, 17:46     Titel:
  Antworten mit Zitat      
Hallo,

in der Syntax
Code:
obj.callThisFcn(src, evnt)
 

wird obj implizit als erstes Argument übergeben. Es entspricht also dem Aufruf
Code:
callThisFcn(obj, src, evnt)
 
und das passt ja zur Funktion.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2019, 18:24     Titel:
  Antworten mit Zitat      
Hallo Harald,

ah, das macht Sinn.

Die Zeilen
Code:
'Callback', @(src, evnt) obj.callThisFcn(src, evnt)

Code:
'Callback', @(src, evnt) callThisFcn(obj, src, evnt)

liefern dasselbe Ergebnis.

Ich hätte zu diesem aber noch 2 Fragen

1. Warum liefert mir
Code:
'Callback', @(src, evnt) obj.callThisFcn(src, evnt)

und
Code:
'Callback', @obj.callThisFcn

dasselbe Ergebnis? Werden von MATLAB implizit die 3 Argumente obj, src, evnt übergeben? Wofür dann src, evnt als Argument mitgeben?

2. Wieso funktioniert
Code:
'Callback', @callThisFcn(obj, src, evnt)

als Solches nicht?

Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.01.2019, 18:48     Titel:
  Antworten mit Zitat      
Hallo,

zu 1.:
die zweite Syntax nimmt die von außen übergebenen Argumente (bei Callbacks src und event) und ruft damit obj.callThisFcn auf. Dabei wird obj wieder als erstes Argument übergeben und was auch immer von außen kommt als weitere Argumente.
Beides ist äquivalent, du kannst verwenden was du möchtest.

zu 2.:
wenn beim Aufruf explizite Argumente übergeben werden sollen, dann muss man auch Eingabeargumente definieren, also
Code:
@(src, evnt) callThisFcn(obj, src, evnt)


Das wäre die von mir bevorzugte weil für mich klarste Syntax.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2019, 19:01     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die Erklärung. Jetzt ist es mir klar.
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.