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

Figures schließen, Callback

 

Martinuk
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2012, 13:40     Titel: Figures schließen, Callback
  Antworten mit Zitat      
Hallo,

ich arbeite gerade an einer GUI und möchte gerne folgendes wissen. Angenommen ich öffne über einen Button bspw. 4 Figures. Schließe ich nun ein Figure über das "x" rechts oben im Figurefenster passiert grundsätzlich ja nichts.

Ich möchte gerne wissen ob man das Schließen eines Figures detektieren kann, sprich das ein Callback ausgelöst wird. Es gibt sowas wie Deletefcn oder CloseRequestfcn soweit ich weiß, nur leider habe ich keine Idee wie man diese in Kombination mit einer GUI einsetzen kann.

Ich möchte gerne feststellen können, ob alle 4 Figures geschlossen sind oder nicht, dazu wäre es denke ich vorteilhaft wenn bei jedem Schließen eines Figures ein Callback ausgelöst wird (am besten immer derselbe).

Wäre super wenn dazu jemand eine Idee hätte.

Besten Dank.
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: 06.08.2012, 18:43     Titel:
  Antworten mit Zitat      
Hallo,

Code:
set(fig, 'CloseRequestFcn', @funktion)


Alternativ: Handles der Figures beim Öffnen speichern und dann mit ISHANDLE abtesten, ob das Handle noch gültig ist (wenn nicht, wurde die Figure geschlossen).

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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2012, 13:47     Titel:
  Antworten mit Zitat      
Hallo Harald,

zunächst danke für die rasche Antwort.

Ich habe deinen Vorschlag ausprobiert und hat soweit funktioniert allerdings habe ich Schwierigkeiten deinen Vorschlag mit meinen Gegebenheiten in Einklang zu bringen.

Die Situtation ist, ich habe eine Listbox erstellt wo die Files hinzugefügt werden können die später geplottet werden sollen. Für das Plotten habe ich einen eigenen Button erstellt.
Wird nun der Plot Button gedrückt, werden 4 Figures erstellt verteilt auf den Bildschirm (dabei rückt das MainGUI in den Hintergrund). Zu den Figures wird jeweils ein handle gespeichert, vereinfacht sieht das so aus

Code:

% Erstellen der Figures
for i=1:4
      handles.fig(i) = figure(x(i)); % x ist ein Vektor der Länge 4, ist aber für das Problem denke ich nicht so wichtig
      set(handles.fig(i)  'CloseRequestFcn', @CloseFcn)
... % Daten extrahieren
... % Subplots erstellen, usw.
end


Der Grund wieso ich die CloseRequestFcn brauche (zumindest glaube ich das) ist, dass wenn zumindest ein Figure geöffnet ist, die Daten praktisch on-the-fly aktualisiert werden können, sprich man zeigt sich entweder den Betrag/Phase oder Real/Imagteil an. Die Fenster werden dabei nicht neu erstellt sondern nur die XData und YData aktualisiert.
Die Listbox wird solange mindestens ein Figure offen ist (ausser das MainGUI selbst) disabled, sodass der Benutzer die Listbox nicht ändern kann. Sobald kein Figure mehr geöffnet ist, soll diese wieder enabled werden.
Natürlich habe ich einen "Close Figures"-Button, über welchen dies sehr einfach umgesetzt werden könnte, allerdings kann es ja passieren, dass der Benutzer die Figures eben alle praktisch per Hand schließt ('x'). In diesem Fall würde die Listbox disabled bleiben.

Nun habe ich gedacht könnte ich der CloseFcn die handles übergeben und immer wenn diese aufgefrufen wird, den jeweilgen Figure-handle löschen. Sobald alle leer sind kann die Listbox wieder enabled werden.
Gemacht wie folgt

Code:

% Erstellen der Figures
for i=1:4
      handles.fig(i) = figure(x(i));
      set(handles.fig(i)  'CloseRequestFcn', {@CloseFcn handles})
... % Daten extrahieren
... % Subplots erstellen, usw.
end


Der CloseFcn habe ich die handles mitübergeben, allerdings sind das nicht die GUIhandles (guidata) sondern die handles zum Zeitpunkt der Übergabe. Problem ist, dass sich die handles zum Zeitpunkt des Erstellen der Figures laufend ändern, aber auch nach nach der for-Schleife zu machen bringt nichts. Die handles können zwar gelöscht oder was auch immer werden, aber die eigentlichen handles (guidata) werden dabei nicht geändert, sprich der handles.figures den ich anfangs erstellt habe bleibt unverändert.

Also habe ich derweilen so "gelöst", indem ich die CloseFcn wie folgt editiert habe

Code:

function [] = CloseFcn(scr, evn, handles) % handles muss an dieser Stelle eigentlich nicht mehr übergeben werden
    h = guidata(NamedesMainGU) % richtige handles werden aufgerufen
    h.figures(find(h.figures == scr)) = [];
    % Abfrage handles wegen enable der Listbox noch nicht gemacht
    delete(gcbf) % Figure welches CloseFcn aufruft wird gelöscht
end
 


Dieser Ansatz funktioniert denke ich eigentlich nur störend dabei ist, dass guidata immer beim Schließen eines Figures das MainGUI in den Vordergrund holt.

Ich hoffe es ist soweit verständlich welches Problem ich habe, weshalb ich mich freuen würde wenn du mir dabei helfen könntest dieses bestmöglich zu lösen.
Generell stellt sich mir die Frage wie man ein Figure oder plot erstellen kann wo das Figure nicht in den Vordergrund gebracht wird.

Besten Dank.
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 - 2025 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.