Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Numerische Mathematik

Fachkräfte:
Entwicklungsingenieur (m/w) für modellbasierte Softwareentwicklung
Modellbasierte Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink
Elektronische Fahrwerksysteme GmbH - Ingolstadt

SW-Entwickler/in
Entwicklung mit Matlab/Simulink und der Programmiersprache "C"
Robert Bosch GmbH - Schwieberdingen

Softwareentwickler (m/w) für automatische Codegenerierung
Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink im Bereich Fahrwerkregelsysteme
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Ingenieur für Prüfstandssysteme und HiL-Testing (m/w)
Konzeptionierung neuer Hardware-in-the-Loop (HiL) Prüfstandssysteme
GIGATRONIK Köln GmbH - Köln

Resident-Ingenieur (w/m) Hardware-in-the-Loop-Simulation
Inbetriebnahme und Software-Anpassungen der HIL-Systeme
dSPACE GmbH - Wolfsburg

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

GUI mit Popupmenu

 

JanK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2017, 01:48     Titel: GUI mit Popupmenu
  Antworten mit Zitat      
Hallo zusammen,

ich versuche mich seit ein paar Wochen an Matlab und konnte mich mit der Hilfe von Dokumentationen einigermaßen zurechtfinden. Jetzt komme ich jedoch bei der Programmierung eines GUI einfach nicht weiter.

(Ich bin mit Fachbegriffen noch nicht so vertraut und bitte um Verständnis, falls ich den falschen verwende)

Ich lese aus einer Datei Überschriften aus, die in das cell array "name2" durch einen Druck auf "databutton" übergeben werden. Diesen Überschriften füllen dann das popupmenu1.

Code:

% --- Executes on button press in databutton.
function databutton_Callback(hObject, eventdata, handles)

name2={'Auto','Bahn','Fahrrad','Bus'};      %Einträge

set(handles.popupmenu1,'String',name2);  %Popupmenu

handles.name2=name2;                           %name2 an handle übergeben

guidata(hObject, handles);                       %Weitergabe an handles structure


Bei der Auswahl im "popupmenu1" von z.B. Bahn soll der entsprechende Indexwert 3 an handles.current_data übergeben werden, da ich damit später die entsprechende Spalte mit den Daten auslesen möchte.

Ich habe mich dabei an einem Beispiel orientiert und mir ist noch nicht ganz klar, was die ersten drei Zeilen genau machen.


Code:
function popupmenu1_CreateFcn(hObject, eventdata, handles)
 str = get(hObject, 'String');          % ?
 val = get(hObject,'Value');           % ?
  switch str{val};                          % ?

name2=handles.name2;              % name2 aus handle structure

    case 'Auto';
    handles.current_data=find(strcmp(name2,'Auto'));     % Index an current_data übergeben
           
    case 'Bahn';
    handles.current_data=find(strcmp(name2,'Bahn'));

    case 'Fahrrad';
    handles.current_data=find(strcmp(name2,'Fahrrad'));        

    case 'Bus';
    handles.current_data=find(strcmp(name2,'Bus'));    

end

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

guidata(hObject, handles);



Das führt jedoch zu einer Fehlermeldung.


Code:
ttempt to reference field of non-structure array.

Error in Gui2015>popupmenu1_CreateFcn (line 89)
name2=handles.name2;

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in Gui2015 (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Gui2015('popupmenu1_CreateFcn',hObject,eventdata,guidata(hObject))


Hat jemand eine Idee wie ich diesen Fehler beheben kann und die Indizes korrekt übergeben werden?

Gruß
Jan


denny
Supporter

Supporter



Beiträge: 3.819
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.09.2017, 15:08     Titel:
  Antworten mit Zitat      
Hallo

CreateFcn werden bei der Erzeugung der GUI aufgerufen, also noch bevor eine GUI auf Monitor angezeigt wird. Hier kann nur einige Parameter für Erscheinungsbild von Popupmenu ändern, so was wie Farbe, Font....

Das was du erreichen möchtest, sollte dagegen in CallbackFcn von Popumenu gemacht werden. Dann sollte es auch funktionieren.

Zitat:
Ich habe mich dabei an einem Beispiel orientiert und mir ist noch nicht ganz klar, was die ersten drei Zeilen genau machen.


hObject erster Parameter bei Callback oder CreateFct, zeigt handle(es ist ein Zeiger/eine Adresse) den Graphischen Objekt welcher diese Funktion aufgerufen hat.z.B dein Popupmenu
Private Nachricht senden Benutzer-Profile anzeigen
 
JanK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2017, 22:53     Titel:
  Antworten mit Zitat      
Hallo denny,

vielen Dank für Deine Antwort. Ich hatte garnicht bemerkt, dass ich in CreateFcn gelandet bin und hätte den Fehler alleine wohl nie gefunden. Jetzt bin ich wieder ein Stück weitergekommen.

Meine Frage zu den ersten drei Zeilen bezog sich auf.

Code:
str = get(hObject, 'String');          
val = get(hObject,'Value');          
switch str{val};                          



Die Befehle hatte ich zwar nachgeguckt aber verstehe nicht genau was da gemacht wird und warum sie an dieser Stelle benutzt werden.
 
denny
Supporter

Supporter



Beiträge: 3.819
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.09.2017, 23:30     Titel:
  Antworten mit Zitat      
Hallo die Zeilen bedeuten folgendes:

Code:

% Gibt eine Liste mit Menueinträgen. Das ist eine Cell mit Strings
% kannst z.B disp(str) schreiben, da wirst in der Konsole sehen die Ausgabe
str = get(hObject, 'String');
 


Code:

% Gibt den für den aktuell selektierten Eintrag den Index, also Position in der Liste
val = get(hObject,'Value');
 


Code:

% jetzt muss mit dem Index, den aktuell selektierten Eintrag holen
% das wird mit den geschweiften Klammern gemacht str{val}
% und in der switch wird Bedingungen abgefragt, wenn Eintrag z.B Max lautet, dann mache folgendes, wenn Joh dann etwas anderes usw.
switch str{val}
   case 'Max'
   case 'Joh'
end



Ich hoffe, ich konnte es dir verständlich erklären. Du kannst z.B ein Breakpoint in der Funktion setzen und in der Konsole die Werte sich genauer anschauen. Einfach im Editor am Linken Rand die Zeile direkt nach Zeilennummer anklicken, wo Strich steht(das bedeutet das dort Breakpoint setzen kann). Und dann einfach dein Programm laufen lassen, etwas in Popupmenu auswählen und das Programm haltet dann an der Stelle.
Private Nachricht senden Benutzer-Profile anzeigen
 
JanK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2017, 00:22     Titel:
  Antworten mit Zitat      
Hallo denny,

vielen Dank für die ausführliche Erklärung. Jetzt kann ich das besser nachvollziehen und das Experimentieren macht sogar ein bischen Spaß Laughing

Gruß
Jan
 
JanK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2017, 15:12     Titel:
  Antworten mit Zitat      
Hallo,
ich habe doch noch eine Frage zu einem neu aufgetauchten Problem, welches sich mit dem Popupmenu ergab.

Zum testen ob die Auswahl richtig funktioniert habe ich mir diesen kleinen Code geschrieben, welcher bei Betätigen eines pushbuttons für einen gewählten Menueintrag entweder "EINS" oder "Rest" ausgeben sollte.

Code:
function pushbutton_Callback(hObject, eventdata, handles)

if handles.current_data == 1;              %%
mess=('EINS);
set(handles.text19, 'string', mess);
else
mess=('Rest');
set(handles.text19, 'string', mess);
end


Bei meinem Popupmenu muss ich den ersten aufgelisteten Eintrag jedoch noch einmal manuell auswählen, weil dieser - wenn ich es richtig verstanden habe - noch keine Zuweisung erhalten hat.
Nach ein wenigt Herumstöbern habe ich Ansätze gefunden, wobei ein weiterer Callback erzeugt werden soll. Leider weiß ich weder wie das gehen soll, wo ich den eintragen soll und ob dies überhaupt zum Erfolg führt.

Ist jemand vielleicht mit diesem Problem vertraut und weiß Abhilfe?

Gruß
Jan
 
denny
Supporter

Supporter



Beiträge: 3.819
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 18.09.2017, 17:09     Titel:
  Antworten mit Zitat      
Zitat:
Bei meinem Popupmenu muss ich den ersten aufgelisteten Eintrag jedoch noch einmal manuell auswählen, weil dieser - wenn ich es richtig verstanden habe - noch keine Zuweisung erhalten hat.

Nein du kannst den Eintrag durch setzen der Value auswählen
Code:

% z.B
%einfügen zusäztlicher Eintäge in die Popupmenu
strlist = set(handles.popupmenu, 'String');
strlist(end+1) = "Neuer Eintrag";
set(handles.popupmenu, 'String', strlist);
% Springen auf zuletzt eingefügten Eintrag
set(handles.popupmenu, 'Value', length(strlist));
 


Sonst musst du nochmal erklären, weil bin mir nicht sicher was unter deinem Problem meinst
Private Nachricht senden Benutzer-Profile anzeigen
 
JanK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2017, 23:33     Titel:
  Antworten mit Zitat      
Hallo,

ich versuche es noch einmal etwas genauer zu erklären.

Mein Popupmenu wird mit den Einträgen Auto,Bahn,Fahrrad und Bus gefüllt, die aus einer Datei gelesen werden. (Können also auch weniger oder mehr sein)
Auto steht dann z.B. an erster Stelle und sollte den Wert 1 haben, Bahn 2 usw..

Wenn ich jetzt einen Pushbutton drücke, soll der Wert über ein "static text" ausgegeben werden.

Drücke ich den Knopf, ohne im Popupmenu etwas ausgewählt zu haben, ist
"handles.current_data" aber unbekannt. Wähle ich jedoch "Auto" oder einen anderen Eintrag aus, funktioniert alles wunderbar.

Ich möchte jedoch, dass der erste Eintrag nicht noch einmal extra ausgewählt werden muss.

Code:

% --- Executes on button press in databutton.
function databutton_Callback(hObject, eventdata, handles)

name2={'Auto','Bahn','Fahrrad','Bus'};      %Einträge

set(handles.popupmenu1,'String',name2);  %Popupmenu

handles.name2=name2;                           %name2 an handle übergeben

guidata(hObject, handles);                       %Weitergabe an handles structure


function popupmenu1_CreateFcn(hObject, eventdata, handles)
 str = get(hObject, 'String');          
 val = get(hObject,'Value');          
  switch str{val};                          

name2=handles.name2;              % name2 aus handle structure

    case 'Auto';
    handles.current_data=find(strcmp(name2,'Auto'));     % Index an current_data übergeben
           
    case 'Bahn';
    handles.current_data=find(strcmp(name2,'Bahn'));

    case 'Fahrrad';
    handles.current_data=find(strcmp(name2,'Fahrrad'));        

    case 'Bus';
    handles.current_data=find(strcmp(name2,'Bus'));    

end

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

guidata(hObject, handles);



% --- Executes on button press in displaybutton.
function displaybutton_Callback(hObject, eventdata, handles)

set(handles.text1, 'string', handles.current_data);


Ich hoffe, dass mein Problem so besser zu verstehen ist.

Gruß
Jan
 
Jan S
Moderator

Moderator


Beiträge: 10.423
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.09.2017, 00:03     Titel:
  Antworten mit Zitat      
Hallo JanK,

Dann definiere einfach "handles.current_data" in der OpeningFcn als 1.

Bemerkung: Kannst Du statt der Suchen nach der Übereinstimmung des Strings nicht einfach "val" verwenden?
Code:
function popupmenu1_CreateFcn(hObject, eventdata, handles)
  str = get(hObject, 'String');          
  val = get(hObject,'Value');
  handles.current_data = val;
end

Oder vielleicht zumindest:
Code:
function popupmenu1_CreateFcn(hObject, eventdata, handles)
  str = get(hObject, 'String');          
  val = get(hObject,'Value');
  handles.current_data = find(strcmp(str{val}, handles.name2));
end

Das ist einfacher als ein Switch-Block in dem alle Strings hardcodiert wiederholt werden.

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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.