Verfasst am: 31.05.2011, 19:46
Titel: Funktionsaufruf in OpeningFcn
Hallo Zusammen,
ich stehe gerade mit der opening function etwas auf Kriegsfuß. Und zwar habe ich jetzt zum 2.mal versucht einen Befehl oder eine Funktion in der OpeningFcn auszufühern und beide male Probleme damit gehabt. Vielleicht könnte mir jemand die mir unbekannten Besonderheiten der OpeningFcn erklären. Wäre echt super!
1.Situation:
uicontrol(buttonhandle)
-> soll eigentlich den Fokus auf einen bestimmten Button legen. Funktioniert einfach nicht. Keine Fehlermeldung
2.Situation:
Ich starte eine Funktion in der ein Timer erzeugt und gestartet wird. Die handle zum Timer wird mit guidata übergeben
-> Timer wird korrekt gestartet und in der OpeningFcn kann auch noch einwandfrei auf de Timer zugegriffen werden. Möchte ich jedoch außerhalb der OpeningFcn auf den Timer zugreifen ist er invalid. Die handle wird aber eigentlich korrekt übergeben.
Beide Sachen funktionieren in einen Button gepackt ohne Probleme. Vielleicht haben beide Situationen ja auch nichts gemeinsam. Aber ich als Matlab Neuling vermute, dass es da irgendwas zu beachten gibt. Wie kann ich also die 2 oben genannten Sachen beim Start einer GUI aufrufen ohne einen extra Button einzubauen?
das Problem mit der GUI opening function ist, daß sie bei dem ganzen GUI-Initialisierungsprozess sehr früh aufgerufen wird und danach noch alle möglichen anderen Sachen ablaufen, die vom User nicht kontrolliert werden können (u.a. der Befehl movegui, der mühevolle GUI-Positionierungen in der opening function wieder zunichte macht...).
Daher mein Rat: Wenn ihr am GUI noch etwas ändern wollt oder sonstige Funktionen starten/initialiseren wollt, dann tut dies am besten in der output function (also _OutputFcn). Das klingt absurd, aber dieser Code-Teil wird bei der GUI-Initialisierung als letztes aufgerufen. Danach kann also keine "schädliche" Funktion seitens Matlab mehr ablaufen.
Das Prinzip lässt sich auch für das Problem der GUI-Maximierung anwenden.
das mit der output function ist eine einfache und gute Idee. Bei der erwähnten 1. Situation und Ähnlichem ist das Problem damit gelöst.
ABER bei dem Timer tritt leider das gleiche Problem auf wie schon in der opening function. Nachdem output function fertig durchlaufen ist ist der Timer ungültig.
Irgendwelche Ideen? Den Timer est mit einem Button zu starten ist schon recht unschön...
das mit dem timer sollte auf jeden Fall funktionieren, auch in der opening function. Wahrscheinlich gibt es ein anderes Problem. Wie sieht denn deine Timer-Deklaration genau aus? Werden evtl. die timer-Callbacks zur Laufzeit nicht gefunden?
So, hat etwas gedauert, weil ich die ganze Sache erst mal auf das Wesentliche kürzen musste. Ein paar Sachen mögen aus dem Zusammenhang gerissen sinnlos wirken...
Meine Main_GUI: hier wird der Timer Deklariert und die sub_GUI aufgerufen in der der Timer automatisch starten soll
Code:
% --- Executes on button press in pb_start_sub. function pb_start_sub_Callback(hObject, eventdata, handles) % hObject handle to pb_start_sub (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) if ~isfield(handles,'sub_GUI')% check ob sub_GUI in handles entahlten ist.
handles.sub_GUI = sub_GUI(handles.main_GUI,@start_timer); %die Funktion sub_GUI starten,handles übergeben und zurückgegebene handles speichern
guidata(hObject,handles)% guidata aktualisieren else figure(handles.sub_GUI); % bringt sub_GUI in den Vordergrund end
%--------------------------------------------------------------------------
function start_timer(delta_t,vis_fcn_h, outputplace_h,handle_to_main_GUI)
Meine sub_GUI: Hier wird der Timer in der openingFcn gestartet. In der Opening kann ich wie beschrieben noch auf den Timer zugreifen, später aber nicht mehr. Gleiches passiert wie gesagt auch wenn ich es in die outputFcn packe. Über einen Button gestartet läuft aber alles
Code:
% --- Executes just before sub_GUI is made visible. function sub_GUI_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 sub_GUI (see VARARGIN)
handles.main_GUI = varargin{1}; % handle auf die figures des Hauptprogramms in handlestruktur des sub_GUI_preload GUIs kopieren
handles.fcn_handle = varargin{2};
% Choose default command line output for sub_GUI
handles.output = hObject;
Sorry für die späte Antwort! War im Urlaub... Aber vielleicht kannst du mir ja dennoch weiter helfen.
Also die feval-Funktion löst die von der main_GUI übergebene Funktion (in diesem Fall 'start_timer') aus (die sich auch in der main_GUI befindet).
Die Funktionen aus dem m-file der main_GUI raus nehmen bringt übrigens auch keine Besserung.
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.