Springen naar inhoud

Matlab: detecteren wanneer men het venster wil sluiten


  • Log in om te kunnen reageren

#1

robuLAB

    robuLAB


  • 0 - 25 berichten
  • 12 berichten
  • Gebruiker

Geplaatst op 21 mei 2010 - 16:16

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

Veranderd door robuLAB, 21 mei 2010 - 16:17


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 21 mei 2010 - 17:14

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
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#3

robuLAB

    robuLAB


  • 0 - 25 berichten
  • 12 berichten
  • Gebruiker

Geplaatst op 25 mei 2010 - 09:31

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.

#4

physicalattraction

    physicalattraction


  • >1k berichten
  • 3103 berichten
  • Moderator

Geplaatst op 25 mei 2010 - 10:12

In principe maakt het niet uit waar je het plaatst. Bijvoorbeeld als je GUI een functie is:

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.

#5

robuLAB

    robuLAB


  • 0 - 25 berichten
  • 12 berichten
  • Gebruiker

Geplaatst op 25 mei 2010 - 10:46

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.

#6

physicalattraction

    physicalattraction


  • >1k berichten
  • 3103 berichten
  • Moderator

Geplaatst op 25 mei 2010 - 11:28

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.

#7

robuLAB

    robuLAB


  • 0 - 25 berichten
  • 12 berichten
  • Gebruiker

Geplaatst op 25 mei 2010 - 13:30

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?

#8

physicalattraction

    physicalattraction


  • >1k berichten
  • 3103 berichten
  • Moderator

Geplaatst op 25 mei 2010 - 14:18

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:

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.

#9

robuLAB

    robuLAB


  • 0 - 25 berichten
  • 12 berichten
  • Gebruiker

Geplaatst op 25 mei 2010 - 14:33

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?





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures