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

Callback- und Create-Functions zusammenfassen

 

MatlabErlerner
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 10:22     Titel: Callback- und Create-Functions zusammenfassen
  Antworten mit Zitat      
Hallo zusammen,

ich habe gerade mal ganz flott eine GUI mit GUIDE erstellt. Dabei habe ich ganz viele (in meinem Codeauszug hier nur ein Teil der ganzen Popupmenüs) Popupmenüs (insgesamt 40) erzeugt. Dadurch werden natürlich auch 40 callback-functions und 40 create-functions erzeugt. Jetzt meine Frage: Da in jeder CallbackFcn und in jeder CreateFcn immer der selbe Befehl steht (in den Callback-functions immer:
Code:
update_Popupmenu(hObject, handles)
und in den Create-Functions immer:
Code:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
) , würde ich gerne all diese Functions (also callbacks und createFcn) zusammenfassen, so dass ich nicht mehr 40 callback und 40 createFcn habe, sondern nur noch einen kompakten Code (bspw. über eine Schleife) für die callback- und einen kompakten Code für die create-functions. Ist dies grundsätzlich möglich? Und wenn ja, wie könnte ich das am besten umsetzen?
Hier der Auszug aus den (wiegesagt insgesamt 40) callback und create-Functions:
Code:
function popupmenu1_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)

function popupmenu1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
 

function popupmenu2_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)
 
function popupmenu2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function popupmenu3_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)
 
function popupmenu3_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function popupmenu4_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)
 
function popupmenu4_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function popupmenu5_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)
 
function popupmenu5_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

 
function popupmenu6_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)
 
function popupmenu6_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


Grüße
Max
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.07.2015, 10:31     Titel:
  Antworten mit Zitat      
Hallo,

du kannst ähnlich wie bei uicontrol-Befehlen die Callback-Eigenschaft setzen.
Wenn eine externe Funktion aufgerufen werden soll, kann man das "wie gewohnt" machen.

Wenn die Funktion als lokale Funktion in der GUI enthalten sein soll, kann man folgendes abwandeln:
Code:
@(hObject,eventdata) GUINAME('CONTROLNAME_Callback',hObject,eventdata,guidata(hObject))

(die Ausdrücke in Großbuchstaben müssen angepasst werden)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 12:58     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe es noch nicht ganz verstanden. Ich versuche mal zu erklären, was ich verstanden habe.
Also meine Callback-Funktion in einem Popupmenu (hier dem Ersten), sprich in dem uicontrol-Befehl, ist wie folgt festgelegt:
Code:
'Callback',@(hObject,eventdata)TestZusammenfassung(popupmenu1_Callback'),hObject,eventdata,guidata(hObject))

Sprich sie ist mit der callback-Function des ersten Popupmenüs verbunden:
Code:
function popupmenu1_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)


Genau so sind auch die weiteren 39 Popupmenüs aufgebaut.
Dein Vorschlag ist es jetzt (wenn ich das ganze richtig verstehe), dass ich eine callback-Function schreibe, bspw. so:
Code:
function popupmenu_Callback(hObject, eventdata, handles)
update_Popupmenu(hObject, handles)

und dann in jedem uicontrol-Befehl die Callback-Funktion angebe, bspw. so:
Code:
'Callback',@(hObject,eventdata)TestZusammenfassung(popupmenu_Callback'),hObject,eventdata,guidata(hObject))
'Callback',@(hObject,eventdata)TestZusammenfassung(popupmenu_Callback'),hObject,eventdata,guidata(hObject))
'Callback',@(hObject,eventdata)TestZusammenfassung(popupmenu_Callback'),hObject,eventdata,guidata(hObject))
'Callback',@(hObject,eventdata)TestZusammenfassung(popupmenu_Callback'),hObject,eventdata,guidata(hObject))


Habe ich das richtig verstanden?

Grüße
Max
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 13:15     Titel:
  Antworten mit Zitat      
Code:
'Callback',@(hObject,eventdata)TestZusammenfassung('popupmenu_Callback',hObject,eventdata,guidata(hObject))
'Callback',@(hObject,eventdata)TestZusammenfassung('popupmenu_Callback',hObject,eventdata,guidata(hObject))
'Callback',@(hObject,eventdata)TestZusammenfassung('popupmenu_Callback',hObject,eventdata,guidata(hObject))
'Callback',@(hObject,eventdata)TestZusammenfassung('popupmenu_Callback',hObject,eventdata,guidata(hObject))


So habe ich es jetzt versucht, leider erfolglos. Ich erhalte zwar keine Fehlermeldung, aber leider wird die update_Popupmenu - Funktion auch nicht ausgeführt. Also so scheint das Zusammenfassen nicht zu funktionieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.07.2015, 21:39     Titel:
  Antworten mit Zitat      
Hallo,

woher soll das Programm erahnen, dass du update_Popupmenu ausführen willst, wenn das im Befehl nirgends vorkommt?
Code:
'Callback',@(hObject,eventdata)TestZusammenfassung('update_Popupmenu',hObject,eventdata,guidata(hObject))


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2015, 16:14     Titel:
  Antworten mit Zitat      
Hallo Harald,
entschuldige die reichlich verspätete Antwort, aber ich habe erst jetzt Zeit gefunden, da ich die letzte Woche mit Prüfungen beschäftigt war.
Ich habe es ausporbiert, allerdings funktioniert seltsamerweise dein letzter Vorschlag auch nicht. Es gibt wieder keine Fehlermeldung, aber die GUI scheint die 'update_Popupmenu'-Funktion nicht zu finden. Sie liegt im selben Ordner, sprich daran kann es eig. nicht liegen. Ich bin etwas ratlos, kannst du Dir erklären, woran dies liegen kann, dass die Funktion allem Anschein nach nicht gefunden wird?

Grüße Max
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.08.2015, 16:36     Titel:
  Antworten mit Zitat      
Hallo,

mein Vorschlag wird nur klappen, wenn update_Popupmenu eine lokale Funktion in TestZusammenfassung.m ist. Falls es eine Funktion im momentanen Verzeichnis ist, würde ich sowas versuchen:
Code:
'Callback',@(hObject,eventdata) update_Popupmenu (hObject,eventdata,guidata(hObject))


Im Zweifelsfall bitte wieder ein reproduzierbares Beispiel.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2015, 08:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

genau das ist mein Problem, ich möchte die Callback-Funktion 'auslagern'. Sprich es ist keine lokale Funktion mehr!

Ich habe anbei mal ein kleines Beispiel erstellt, was die Problematik glaube ich ganz gut darstellt:
Code:
function varargout = test(varargin)
% TEST MATLAB code for test_export.fig

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @test_OpeningFcn, ...
                   'gui_OutputFcn',  @test_OutputFcn, ...
                   'gui_LayoutFcn',  @test_LayoutFcn, ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before test_export is made visible.
function test_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to test_export (see VARARGIN)

% Choose default command line output for test_export
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes test_export wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = test_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% % % % --- Executes on button press in pushbutton1.
% % % function pushbutton1_Callback(hObject, eventdata, handles)
% % % % hObject    handle to pushbutton1 (see GCBO)
% % % % eventdata  reserved - to be defined in a future version of MATLAB
% % % % handles    structure with handles and user data (see GUIDATA)
% % % pushbutton_hallo(hObject, handles)

% --- Creates and returns a handle to the GUI figure.
function h1 = test_LayoutFcn(policy)
% policy - create a new figure or use a singleton. 'new' or 'reuse'.

persistent hsingleton;
if strcmpi(policy, 'reuse') & ishandle(hsingleton)
    h1 = hsingleton;
    return;
end

appdata = [];
appdata.GUIDEOptions = struct(...
    'active_h', [], ...
    'taginfo', struct(...
    'figure', 2, ...
    'text', 2, ...
    'pushbutton', 2), ...
    'override', 0, ...
    'release', [], ...
    'resize', 'none', ...
    'accessibility', 'callback', ...
    'mfile', 1, ...
    'callbacks', 1, ...
    'singleton', 1, ...
    'syscolorfig', 1, ...
    'blocking', 0);
appdata.lastValidTag = 'figure1';
appdata.GUIDELayoutEditor = [];
appdata.initTags = struct(...
    'handle', [], ...
    'tag', 'figure1');

h1 = figure(...
'PaperUnits','inches',...
'Units','characters',...
'Position',[135.8 36.6923076923077 136.2 36.1538461538461],...
'Visible',get(0,'defaultfigureVisible'),...
'Color',get(0,'defaultfigureColor'),...
'IntegerHandle','off',...
'MenuBar','none',...
'Name','test',...
'NumberTitle','off',...
'Resize','off',...
'PaperPosition',get(0,'defaultfigurePaperPosition'),...
'PaperSize',[8.5 11],...
'PaperSizeMode',get(0,'defaultfigurePaperSizeMode'),...
'PaperType','usletter',...
'PaperTypeMode',get(0,'defaultfigurePaperTypeMode'),...
'PaperUnitsMode',get(0,'defaultfigurePaperUnitsMode'),...
'ScreenPixelsPerInchMode','manual',...
'ParentMode','manual',...
'HandleVisibility','callback',...
'Tag','figure1',...
'CreateFcn', {@local_CreateFcn, blanks(0), appdata} );

appdata = [];
appdata.lastValidTag = 'pushbutton1';

h2 = uicontrol(...
'Parent',h1,...
'FontUnits',get(0,'defaultuicontrolFontUnits'),...
'Units','characters',...
'String',{  'Push Button' },...
'Style',get(0,'defaultuicontrolStyle'),...
'Position',[9.8 20.6923076923077 13.8 1.69230769230769],...
'Callback',@(hObject,eventdata)pushbutton_hallo(hObject,eventdata,guidata(hObject)),...
'Children',[],...
'ParentMode','manual',...
'Tag','pushbutton1',...
'CreateFcn', {@local_CreateFcn, blanks(0), appdata} );


hsingleton = h1;


In dem Code habe ich absichtlich die pushbutton-Callbackfunktion auskommentiert. Dann habe ich die 'externe' Funktion pushbutton_hallo wie von dir beschrieben in den Callbackfunktion geschrieben. Allerdings bekomme ich dann immer die Fehlermeldung:
Zitat:
Error using pushbutton_hallo
Too many input arguments.

Error in test>@(hObject,eventdata)pushbutton_hallo(hObject,eventdata,guidata(hObject))
(line 148)
'Callback',@(hObject,eventdata)pushbutton_hallo(hObject,eventdata,guidata(hObject)),...
Error while evaluating UIControl Callback


Ich habe beide Dateien angefügt. Hast du eine Lösung oder eine Idee?

Grüße Max

test.m
 Beschreibung:

Download
 Dateiname:  test.m
 Dateigröße:  15.37 KB
 Heruntergeladen:  420 mal
pushbutton_hallo.m
 Beschreibung:

Download
 Dateiname:  pushbutton_hallo.m
 Dateigröße:  123 Bytes
 Heruntergeladen:  376 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.08.2015, 15:47     Titel:
  Antworten mit Zitat      
Hallo,

ich würde das Erstellen einer GUI mit GUIDE und das Erstellen mit UICONTROL nicht in dieser Form mischen. Meines Erachtens ist das sehr schwierig zu durchschauen.

Zum Fehler an sich:
in der Callback-Eigenschaft definierst du, dass du pushbutton_hallo mit 3 Argumenten aufrufen willst ( hObject,eventdata,guidata(hObject) ). pushbutton_hallo nimmt aber nur 2 Argumente entgegen. Also anpassen der Deklarationszeile:
Code:
function pushbutton_hallo(hObject, eventdata, handles)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2015, 18:50     Titel:
  Antworten mit Zitat      
Danke für deine schnelle Antwort Harald. Ich habe es angepasst und es funktioniert jetzt. Ich werde aber in Zukunft auf die 'händische' Programmierung ohne GUIDE zurückgreifen. Das Mischen führt in der Tat nur zu Fehlern.

Grüße
Max
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.