Verfasst am: 23.07.2015, 10:22
Titel: Callback- und Create-Functions zusammenfassen
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:
) , 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) ifispc && 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) ifispc && 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) ifispc && 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) ifispc && 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) ifispc && 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) ifispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');
end
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:
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:
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)
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.
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?
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:
% --- 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;
% UIWAIT makes test_export wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. functionvarargout = 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'.
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?
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)
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
Einstellungen und Berechtigungen
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.