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

uimenu callback

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.01.2016, 15:17     Titel: uimenu callback
  Antworten mit Zitat      
Hallo goMatlab Forum,

ich habe eine Frage zum Thema uimenu . Ich habe folgendes Menu in meiner GUI und möchte nun wissen welche Option (Einheit) jeweils angeklickt wird.

Code:

function [] = TestUIMenu()

handles.MainWindow = figure(...
'Units','normalized',...
'Position',[0 0 0.3 0.6],...
'Visible',get(0,'defaultfigureVisible'),...
'Color',get(0,'defaultfigureColor'),...
'CurrentAxesMode','manual',...
'IntegerHandle','off',...
'MenuBar','none',...
'Name','TestUIMenu',...
'NumberTitle','off',...
'Resize',get(0,'defaultfigureResize'),...
'HandleVisibility','on',...
'Tag','MainWindow',...
'CreateFcn', {@movegui,'northwest'});

%% GUI menu
handles.Options = uimenu(...
'Parent',handles.MainWindow,...
'Label','Optionen');

% 5
handles.FreqUnit = uimenu(...
'Parent',handles.Options,...
'Label','Frequeneinheit');
% 5.1
handles.Hz = uimenu(...
'Parent',handles.FreqUnit,...
'Label','[Hz]',...
'Checked','on');
% 5.2
handles.w = uimenu(...
'Parent',handles.FreqUnit,...
'Label','[rad/s]',...
'Checked','off');
% 5.3
handles.Norm = uimenu(...
'Parent',handles.FreqUnit,...
'Label','normiert',...
'Checked','off');
% 6
handles.PhaseUnit = uimenu(...
'Parent',handles.Options,...
'Label','Einheit Phase');
% 6.1
handles.Deg = uimenu(...
'Parent',handles.PhaseUnit,...
'Label','[Grad]',...
'Checked','on',...
'Callback',{@PhaseUnit_Callback});
% 6.2
handles.Rad = uimenu(...
'Parent',handles.PhaseUnit,...
'Label','[rad]',...
'Checked','off',...
'Callback',{@PhaseUnit_Callback});

%% UImenu callbacks

    function PhaseUnit_Callback(varargin)
        if strcmp(get(handles.Deg,'Checked'),'on')
            set(handles.Deg,'Checked','off')
            set(handles.Rad,'Checked','on')
            handles.Data.PhaseUnit = 1;
        else
            set(handles.Deg,'Checked','on')
            set(handles.Rad,'Checked','off')
            handles.Data.PhaseUnit = 2;
        end            
    end
end
 


Hat die Option nur 2 Auswahlmöglichkeiten wie bei Phase, kann ich für beide eine Callback verwenden. Bei 3 Auswahlmöglichkeiten müsste ich wissen welche Einheit angeklickt wurde bzw. müsste für jede Einheit eine eigene Callback Funktion haben.

Gibt es evtl. eine andere Umsetzung ohne 3 callbacks erzeugen zu müssen? Eine Eigenschaft wie z.B. "Value" gibt es bei uimenu nicht.

Vielen Dank schon mal für eure Hilfe.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.02.2016, 13:19     Titel:
  Antworten mit Zitat      
Hallo,

hat niemand eine Idee oder ist mein Anliegen nicht verständlich?
Ich finde es doch etwas unsinnig für jede Einheit eine eigene Callback zu schreiben. Da "Optionen" nur ein Menu Punkt der GUI ist und noch weitere installiert werden sollen, würde das den Code ziemlich aufblähen. In der Callback muss ja nur die gewählte Einheit wie Hz gespeichert werden und die anderen beiden Auswahlmöglichkeit unckecked werden.

Gruß DSP
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.02.2016, 14:52     Titel:
  Antworten mit Zitat      
Hallo,

macht dein Ansatz denn bei zwei Elementen das gewünschte?
Wenn der Nutzer nämlich dasselbe Element nochmal anklickt, ändert sich die Einstellung trotzdem.

Wenn du die Funktion so schreibst, hat sie das Verhalten, das ich erwarten würde:
Code:
   function PhaseUnit_Callback(hObject, ~)
        if strcmp(get(hObject,'Label'), '[rad]')
            set(handles.Deg,'Checked','off')
            set(handles.Rad,'Checked','on')
            handles.Data.PhaseUnit = 1;
        else
            set(handles.Deg,'Checked','on')
            set(handles.Rad,'Checked','off')
            handles.Data.PhaseUnit = 2;
        end            
    end

... und über elseif oder switch/case kann man auch bei mehreren Wahlmöglichkeiten auch die anderen abfragen.

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

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.02.2016, 14:59     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Wenn der Nutzer nämlich dasselbe Element nochmal anklickt, ändert sich die Einstellung trotzdem.


Das ist wohl war! Nein, das ist natürlich so nicht gewünscht.

An die Idee das Label des gewählten Objektes abzufragen, habe ich nicht gedacht.

Wieder mal vielen Dank Harald!

Gruß DSP
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.02.2016, 17:21     Titel:
  Antworten mit Zitat      
Hallo,

gerne doch, gerade auch weil du sonst eher ein "Fragenbeantworter" bist.

Ohne die genaue Anwendung zu kennen ein Gedanke noch dazu: wäre es vielleicht einfacher, mit Popupmenüs oder Radiobuttons zu arbeiten? Wenn der Platz ausgeht, könnte ich mir es auch als sinnvoll vorstellen, die Einstellungen in eine separate GUI auszulagern.

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

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.02.2016, 17:57     Titel:
  Antworten mit Zitat      
Das uimenu ist für folgende GUI (siehe Bild erster Post)

http://www.gomatlab.de/rekursiver-aufruf-einer-subgui-t40076.html

Bisher sieht man auf dem Bild nur das Menu Optionen, wobei es hier eben um die phys. Einheiten von x und y Werten geht. Die SignalViewer GUI dient zur Darstellung von Signalen im Zeit- und Frequenzbereich und ist an Matlab's sptool angelehnt, ohne jedoch Toolboxen zu benötigen. Nachdem ich hier immer wieder die gleichen Fragen zur Darstellung von Signalen im Frequenzbereich beantworte, dachte ich mir, es wird mal Zeit einen Anzeiger dafür zu erstellen. Angefangen habe ich vor über einem halben Jahr, wobei mir zwischendrin auch einfach die Zeit fehlte. Momentan kann ich mal wieder etwas mehr machen und hoffe bald mal eine erste Version hier zu veröffentlichen. Allerdings habe ich beim Programmieren immer wieder neue Ideen was noch fehlen könnte, so dass ich irgendwie nicht fertig werde Smile

Lange Rede, kurzer Sinn...ich denke, diese Einstellungen in ein uimenu zu packen, ist sinnvoll. Es sind ja keine Settings die man ständig ändert und sie werden auch beim Verlassen der gui gespeichert.

Was mich etwas nervt ist die Tatsache, dass der Code der Maingui über die Hälfte nur mit dem Erstellen von Objekten der GUI zu tun hat. Das macht es halt etwas unübersichtlich und standiges Scrollen nötig. Am liebsten würde ich das Menu und die Toolbar in eine eigene Funktion packen. Aber dann müsste ich deren Callbacks ja auch jeweils einzeln in einen seperate Funktion auslagern, was ich fürs Debuggen etwas nervig finde.

Oder gibt es da noch eine andere Lösung?
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.02.2016, 18:23     Titel:
  Antworten mit Zitat      
Hallo,

eine Erwägung wäre, zumindest das Layout der GUI mit GUIDE zu erstellen, und im Code mit openfig die Figure zu öffnen, mit guihandles die Handles-Struktur erstellen zu lassen, und dann nur die Callbacks passend zu setzen.

Langfristig wird GUIDE ja durch den App Designer ersetzt werden, hier als Tech Preview:
http://www.mathworks.com/matlabcent.....change/48142-app-designer
Allerdings funktioniert dieser Tech Preview ausschließlich mit R2014b, und es gibt beispielsweise auch noch keinen Ersatz für uimenus.

Grüße,
Harald
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 - 2024 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.