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

PopUp auslesen

 

Inferno87
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2012, 19:12     Titel: PopUp auslesen
  Antworten mit Zitat      
Hi Leute,

ich möchte ein Popup erstellen und die Auswahl dann auslesen.
Nur leider funktioniert das nicht ganz:

mit folgendem Code wird mir für Val immer 1 angezeigt, egal welches Element ich auswähle.

Code:

menu=uicontrol('Style','popupmenu','pos',[510 300 150 20]);
set(b, 'String',{'Eingabe1';'Eingabe2'})

Str = get(menu, 'String');
Val = get(menu, 'Value');

Str{Val};


HAbt Ihr eine Ahnung, woran das liegen könnte

Grüße
Inferno
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.12.2012, 23:23     Titel: Re: PopUp auslesen
  Antworten mit Zitat      
Hallo Inferno87,

Ich verstehe die Frage noch nicht. Wieso sollte nach der Ausführung dieses Codes Val denn einen anderen Wert haben? Was ist die Variable "b"?
An welcher Stelle testest Du denn den ausgewählten Index?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2012, 01:12     Titel:
  Antworten mit Zitat      
Hidiho,

b is falsch. Es sollte eigentlich wie folgt heissen:

Code:

 
menu=uicontrol('Style','popupmenu','pos',[510 300 150 20]);
set(menu, 'String',{'Eingabe1';'Eingabe2'})

Str = get(menu, 'String');
Val = get(menu, 'Value');

Str{Val};
 


Ich komm noch nicht mit Callbacks klar und hatte diesen Code hier im Forum gefunden. Deswegen hatte ich es erst mal damit versucht.

Im Grunde möchte ich ein Popupmenü, in dem ich 2 Dinge zur Auswahl habe (Eingabe1 und Eingabe2).

Diese möchte ich dann natürlich auslesen.
Wenn Eingabe 1 genommen wurde, bekommt Val den Wert 1 und wenn Eingabe 2 gewählt wurde, wird Val zu 2. Das kann ich dann in eine If- Bedingung schmeissen und damit weiterarbeiten.

Nur funktioniert es nicht, die im Popupmenü gewählten Optionen weiter zu verwenden. Val hat dann immer den Wert 1.

Danke und Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.12.2012, 08:50     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

Irgendwo liegt hier noch ein grundlegendes Missverständnis vor.
Was bedeutet "Ich komm noch nicht mit Callbacks klar"?
Ohne die Benutzung von Callbacks wird eine Aktion in einem UICONTROL-Objekt, z.B. das Auswählen eines Eintrages im Popup-Menü, keine Auswirkungen haben. "Val" wird sich also nicht auf magische Weise ferngesteuert ändern.

Zur Zeit funktioniert also alles genau wie im Programm angegeben.
Erstelle eine Callback-Funktion, so dass das Popup-Menü auch irgendetwas bewirken kann.
Beispiele findest Du dazu genügend im Netz und in der Dokumentation von Matlab.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.12.2012, 16:06     Titel:
  Antworten mit Zitat      
Hi Leute,
Danke für die Antworten.

Also ich hatte es vorher gemäß einiger Beispiele im Internet bzw. der Matlab Hilfe versucht:

Code:
menu=uicontrol('Style','popupmenu','Callback',@Callback,'pos',[510 300 150 20]);
set(menu, 'String',{'Eingabe1';'Eingabe2'})

function Callback(menu, eventdata, handles);
val = get(menu,'Value');
switch val
case 1
id=1;
case 2
id=2;
 


Da kommt nur leider die Fehlermeldung:
??? Error: File: Kopplung_umgekehrt.m Line: 102 Column: 1
Function definitions are not permitted in this context.


Dann hatte ich im Internet dem obigen Code gefunden und es damit versucht. Jedoch zeigt Matlab mir da immer den Wert 1 für Val an.

Danke und Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.12.2012, 00:01     Titel:
  Antworten mit Zitat      
HAllo Inferno87,

Die Fehlermeldung "Function definitions are not permitted in this context" bedeutet, dass man in einem Script keine Funktion definieren kann. Speichere die Funktion (also das Unterprogramm, welches mit "function" beginnt) in einem eigenen M-File oder wandele das Script in eine Funktion um (dafür also "function" in die erste Zeile einfügen und Inputs/Outputs geeignet ergänzen).

Zitat:
Jedoch zeigt Matlab mir da immer den Wert 1 für Val an.

Das sagt mir immer noch nichts. Wann zeigt Matlab dies an? Du hast bisher noch keinerleit Code gezeigt, der den Wert von Val ändern könnte. Dann bleibt der Wert natürlich beim Anfangswert.

An welcher Stelle erwartest Du aus welchem Grund, dass sich der Wert von Val ändert?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.12.2012, 16:08     Titel:
  Antworten mit Zitat      
Hi Jan,

Code:

menu=uicontrol('Style','popupmenu','pos',[510 300 150 20]);
set(menu, 'String',{'Eingabe1';'Eingabe2'})

Str = get(menu, 'String');
Val = get(menu, 'Value');

Str{Val};


Ich dachte, durch den Befehl "get" wird der Wert (Value) vom Popupmenu genommen.

Bei einer uitable funktioniert das ganz gut:

Code:
cnames = {'Point','Name','Zuordnung'};
 columnformat = {'char','char',choices};  
 columneditable =  [false false true];
 t=uitable('Data',name_dummy_lesen, 'Position',[0 100 480 600],'ColumnName',cnames,'ColumnFormat', columnformat,'ColumnEditable', columneditable,'ColumnWidth',{100 250});

Back=get(t,'Data');
 


Deshalb dachte ich, das funktioniert bei nem Popupmenu auf die selbe Art und Weise.Dabei hätte Eingabe1 den Wert 1 und Eingabe2 den Wert 2.
Jedoch hat Val immer den Wert 1...egal ob ich Eingabe1 oder Eingabe2 markiert habe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.12.2012, 02:04     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

Offenbar reden wir massiv aneinander vorbei.

Natürlich liest GET den aktuellen Wert aus. Aber der Code, den Du hier gepostet hast, liest "Val" aus, direkt nachdem Du das Popup-Menü erstellt hast. Eine Auswahl triffst Du dann aber erst später. Wenn du danach wieder "Val = get(menu, 'Value')" ausführen würdest, z.B. im Callback des UICONTROLs, würdest du auch einen anderen Wert bekommen. Aber bisher hast Du keinen Code gezeigt, der später tatsächlich die Eigenschaft "Value" neu auslesen würde.

Versuche es einfach mal:
Code:
figure;
uicontrol('Style', 'popupmenu', 'String', {'Eingabe1';'Eingabe2'}, ...
   'Callback', @myCallback)

function myCallback(ObjectH, EventData)
Str = get(ObjectH, 'String')
Val = get(ObejctH, 'Value')

"Str" bleibt nun gleich, "Val" ändert sich je nach ausgewähltem Menü-Eintrag.

Nebenbei ist "menu" als Variablen-Namen tückisch, da dies auch der Name einer Toolbox-Funktion ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.01.2013, 11:33     Titel:
  Antworten mit Zitat      
Hi Jan,

Danke für die Antwort und frohes neues Jahr erst einmal.

Also ich habs jetzt mal in ein separates m-file kopiert, ums besser zu verstehen.
Dein Code müsste ja dort auch klappen. Ich hätte nur eine kleine Verständnisfrage:

was bei deinem Code das uicontrol macht, ist klar.

Dann rufst du die function auf, die den Namen Callback hat. Mit den Inputs ObjectH und EventData, oder!? Aber wo kommen die jetzt her?

Ich versteh nicht ganz, wie das mit den functions und Callbacks funktioniert.

Zitat:
der wandele das Script in eine Funktion um (dafür also "function" in die erste Zeile einfügen und Inputs/Outputs geeignet ergänzen).


Das müsste ja dann so aussehen:
Code:
function[Str,Val] = myCallback (Eingabe1, Eingabe2);
figure;
uicontrol('Style','popupmenu','String',{'Eingabe1';'Eingabe2'},'Callback',@myCallback)

function myCallback(ObjectH, EventData);
Str = get(ObjectH, 'String')
Val = get(ObejctH, 'Value')


Oder?

Grüße
Inferno
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.01.2013, 01:41     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

Ein Callback ist eine Funktion, die ausgeführt wird, wenn ein UICONTROL aktiviert wird. Bei einem Button also beim Klicken, bei einer Listbox oder einem Menü, wenn man ein Element daraus aktiviert. Dann wird die Funktion aufgerufen mit mindestens zwei Argumenten: Zuerst der Handle des aufrufenden Objektes, und zweitens den EventData, die Informationen über die Art des Events enthalten.

Callbacks werden in der Dokumentations umfassend erklärt. Hast Du dies schon mal gelesen?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Inferno87
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 31.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2013, 11:38     Titel:
  Antworten mit Zitat      
Hi Jan,
Zitat:
Callbacks werden in der Dokumentations umfassend erklärt. Hast Du dies schon mal gelesen?


Jupp, aber grad aus dem Thema callbacks werd ich noch nicht so richtig schlau draus.

Denn das, was ich im letzten Post geschrieben habe, klappt auch nicht so richtig.

Ich habs jetzt mal anders versucht, was auch funktioniert. Und zwar in Kombination mit einem Pushbutton:

Code:
f=figure('Position',[100 100 800 800]); %Fenster
Sys=uicontrol('Style','popupmenu','pos',[510 300 150 20]);
set(Sys, 'String',{'Eingabe1';'Eingabe2'})
uicontrol(f,'Style','pushbutton','String','Fertig','Position',[30 20 100 20],'Callback','uiresume(gcbf)');
 
 uiwait(gcf);
 Val = get(Sys, 'Value')
 close(f);


Jedoch würde ich die andere Sache gerne mit dem Callback gerne verstehen und Anwenden können.

In der Dokumentation fehlt bei den Beispielen jeweils auch die von dir angesprochene Umwandlung des Skripts in eine function, weshalb da auch immer der selbe Fehler angezeigt wird ("function definition...").

Wenn ich nun folgendes schreibe:
Code:

function[Str,Val] = myCallback (Eingabe1, Eingabe2);
figure;
uicontrol('Style','popupmenu','String',{'Eingabe1';'Eingabe2'},'Callback',@myCallback)

function myCallback(ObjectH, EventData);
Str = get(ObjectH, 'String')
Val = get(ObejctH, 'Value')
 


Dannwird doch als output Str und Val definiert und als Input Eingabe1 und Eingabe2. Dann das Uicontrol erzeugt und dann die function "myCallback" aufgerufen, welche ObjectH als die Eingabe des PopUps definiert, versteh ich das richtig?

Gruß
Inferno
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.01.2013, 14:18     Titel:
  Antworten mit Zitat      
Hallo Inferno87,

Das Umwandeln eines Scripts in eine Funktion ist einfach: Füge die Zeile "function [Output1, Output2, ...] = FunctionName(Input1, Input2, ...)" als erste in das Script ein, wobei die Input- und Output-Listen entsprechend angepasst werden müssen.

Zitat:
Code:
function[Str,Val] = myCallback (Eingabe1, Eingabe2);
figure;
uicontrol('Style','popupmenu','String',{'Eingabe1';'Eingabe2'}, 'Callback', @myCallback)

function myCallback(ObjectH, EventData);
Str = get(ObjectH, 'String')
Val = get(ObejctH, 'Value')

Hier gibt es zunächst zwei Funktionen mit dem gleichen Namen "myCallback". Ich vermute, die Hauptfunktion soll "myGUI" oder ähnlich benannt werden.

Die Hauptfunktion (also die erste) läuft durch, erzeugt aber nirgendwo die Outputs "Str" und "Val". Falls man diese als Outputs verwendet, bekommt man eine Fehlermeldung.
Der Callback "myCallback" wird dann aufgerufen, wenn man das Popup-Menü betätigt, nicht aber, während das Hauptprogramm durchläuft. Ein Callback ist also die Funktion, die darauf reagiert, dass ein GUIObjekt aktiviert wurde.

In dem obigen Beispiel erscheinen die Werte für Str und Val im Commandwindow, wenn das Popup betätigt wird.

Gruß, Jan
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.