1 van 1

Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: vr 21 mei 2010, 17:16
door robuLAB
Weet iemand hoe je kan detecteren of een gebruiker op het x-je geklikt heeft om het venster (GUI-venster, niet geheel Matlab) te sluiten? Zodoende je een melding kan geven en de gebruiken kan vragen of hij zeker is van zijn keuze.

Ik weet dat dit mogelijk is. Er stond een hele goeie tutorial hiervoor op Blinkdagger, maar helaas is die site momenteel offline.

Alvast Bedankt

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: vr 21 mei 2010, 18:14
door Bart

Code: Selecteer alles

fh = figure();



set(fh, 'CloseRequestFcn', @close_event);



function close_event(src,evnt)

% User-defined close request function 

% to display a question dialog box 

   selection = questdlg('Close This Figure?',...

	  'Close Request Function',...

	  'Yes','No','Yes'); 

   switch selection, 

	  case 'Yes',

		 delete(gcf)

	  case 'No'

	  return 

   end

end

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: di 25 mei 2010, 10:31
door robuLAB
Kan je mij ook zeggen waar ik deze code in mijn programma moet plaatsen? Als ik ze er op het einde bijplaats dan rekent matlab fh = figure() en de set-instructie tot de vorige functie. Ik heb geprobeerd in de openingsfunctie maar dat lukt ook niet.

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: di 25 mei 2010, 11:12
door physicalattraction
In principe maakt het niet uit waar je het plaatst. Bijvoorbeeld als je GUI een functie is:

Code: Selecteer alles

function myGUI

   [...]

   fh = figure();

   set(fh, 'CloseRequestFcn', @close_event);

   [...]

   function close_event(src,evnt)

  [...] % Bart's code here

   end

end	% of function myGUI
Het is vergelijkbaar met een callback function wanneer je op een button klikt, alleen heet hij hier niet CallbackFcn, maar CloseRequestFcn.

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: di 25 mei 2010, 11:46
door robuLAB
Het betreft idd en GUI-code. Het probleem is dat in de gegenereerde GUI-code de functies door matlab niet met een "end" afgesloten worden. Het gevolg is dat een functie blijft lopen tot hij een andere functie tegenkomt.

Als ik dus "function close_event(src,evnt)" gebruik dan rekent hij alles ervoor tot een andere functie (zoals fh en de set-instructie) waardoor ik er niet in slaag om bart's code te doen werken.

Ik kan natuurlijk al mijn functies met een "end" beƫindigen, maar ik vroeg mij af of er een mogelijkheid is om dit op te lossen zonder overal een "end" in te voegen.

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: di 25 mei 2010, 12:28
door physicalattraction
Hmm, dan zou ik het niet weten. Ik sluit altijd al mijn functies af met end. Ik dacht zelfs dat dit syntax-matig verplicht was, maar als jij het zonder doet klaarblijkelijk niet dus. Alles afsluiten met end lijkt me wel een nette(re) manier van programmeren.

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: di 25 mei 2010, 14:30
door robuLAB
Je kan werken zonder "end" enkel als je geen nested loops hebt. Om verwarring te vermijden laat matlab echter niet toe dat je de 2 notaties door elkaar gebruikt. Dus eens je nested loops hebt ben je verplicht alles af te sluiten.

Ik heb nu alles afgesloten maar krijg nog steeds niet het gewenste resultaat. Als ik bart's code gewoon onderaan mijn m-file plak krijg ik de foutmelding dat f = ... en de set-instructie niet in een function staan. Indien ik de code in een andere functie plaats dan krijg ik ofwel een endless loop wanneer ik het in de openingfcn plaats of een waslijst aan foutmeldingen wanneer ik het in een andere functie plaats.

Enig idee hoe ik dat kan oplossen?

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: di 25 mei 2010, 15:18
door physicalattraction
Begint de eerste regel van je m-file met het woord "function"? En eindigt het met "end"? Ik heb nu geen Matlab bij de hand, maar het volgende moet gewoon werken:

Code: Selecteer alles

function myGUI

   fh = figure()

   set(fh, 'CloseRequestFcn', @close_event);

   function close_event(src,evnt)

% User-defined close request function 

% to display a question dialog box 

  selection = questdlg('Close This Figure?',...

  'Close Request Function',...

  'Yes','No','Yes'); 

  switch selection, 

  case 'Yes',

 delete(gcf)

  case 'No'

  return 

   end

end
In je command window run je vervolgens myGUI en er moet een venster verschijnen. Let dus op dat je de functie close_event genest hebt in de functie myGUI.

Re: Matlab: detecteren wanneer men het venster wil sluiten

Geplaatst: di 25 mei 2010, 15:33
door robuLAB
Ik heb mijn GUI gemaakt met de GUIDE functie. Mijn m-file begint dus inderdaad met "function" en eindigt met "end". Maar de 2 zijn niet met elkaar verwant. het betreft hier geen nested functions, maar verschillende losse functies in 1 file

indien ik er wel nested functions van maak, krijg ik opnieuw een waslijst aan fouten. Fouten met betrekking tot lege functies en met betrekking tot fh=figure().

Ik vermoed dat ik figure(naam_van_mijn_m-file) moet schrijven (zonder .fig). Klopt dit?