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

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.853
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.853
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.853
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: 11.057
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
 
JanK

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2017, 02:53     Titel:
  Antworten mit Zitat      
Hallo und danke für die Antwort.

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


Hatte ich schon einmal probiert aber wahrscheinlich an der falschen Stelle eingefügt. Gehört dann vermutlich in die OpenningFCn vom Popupmenu. Werde es noch einmal probieren.

Zitat:
Bemerkung: Kannst Du statt der Suchen nach der Übereinstimmung des Strings nicht einfach "val" verwenden?


Ich bin nicht 100 %ig sicher ob Dein Vorschlag zum gewünschten Ergebnis führt oder vielleicht habe ich es falsch verstanden. Die Idee dahinter ist, dass die Überschriften aus einer Datei herausgelesen werden, wobei Anzahl und Reihenfolge variieren können. Hiermit möchte ich erreichen, dass nur die vorhandenen Überschriften 1-n durchnummeriert werden. Für das Beispiel hatte ich zur Vereinfachung nur diese 4 Überschriften fest vorgegeben, da der Code sonst sehr unübersichtlich wird.

Zitat:
Oder vielleicht zumindest:


Code:


Probiere ich morgen in Ruhe aus aber wenn ich das richtig interpretiere, dann ist Dein Vorschlag eine enorme Verbesserung. Danke dafür! Very Happy

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