Verfasst am: 20.02.2014, 20:38
Titel: Popup Menü in Abhängigkeit von vorherigen Popups
Hallo zusammen,
ich habe mich in den letzten drei Tagen in die GUI Programmierung eingearbeitet und stoße langsam aber sicher an meine Grenzen.
Meine GUI besteht aus drei Popupmenüs, bei denen die Auswahl des zweiten Popupmenüs in Abhängigkeit zum ersten Popup stehen sollte. In meinem Code (Zeile 90-102) habe ich versucht durch eine if- Abfrage die handles erst nach Wahl des ersten Popups zu belegen. Ohne Erfolg! Es kamen noch mehr Fehlermeldungen.
Eine weitere Frage meinerseits wäre die Ausgabe des Plots und das Ansprechen der Axes (Imaginaerteil, Realteil, Betrag) auch richtig sind. Bei mir gibt es dazu immer eine Fehlermeldung mit
Error in Impendanzen>Ausgabe_Callback (line 247)
Plotrealteil = axes(handles.Realteil);
Verfasst am: 20.02.2014, 23:33
Titel: Re: Popup Menü in Abhängigkeit von vorherigen Popups
Hallo JohnnyChoclate,
Es ist imm Allgemeinen effizienter, wenn Du Dich auf einen Codeabschnitt konzentrierst, ihn direkt im Forum postest und die vollständige Fehlermeldung anfügst.
Wie beschrieben habe ich zuerst ein Popup Menü mit der Auswahl Platte oder Stab.
Je nach Auswahl ob Stab oder Platte wollte ich mit dieser if- Abfrage die aufzuführenden Bauteile setzen.
Code:
function Bauteil_Callback(hObject, eventdata, handles)
if(strcmp(get(hObject.Bauteil,'String'),Platte)==1) set(handles.Material,'String',{'GKB', 'GKF','FPY','OSB','Stahl','Beton','Glas','BSP'}); %Plattenauswahl für Popupmenübauteil
Ich bin mir dabei aber nicht sicher ob der Fehler nicht schon auf den Zugriff hObject.Platte beruht....
.
Hallo deine Vermutung ist richtig, daran liegt dein Fehler,
hObject ist in diesem Fall eine Referenz(Adresse) auf den Graphischen Objekt, welcher diesen Callback ausgelöst hat. Das ist ein Skalarwert und keine Struktur
hier meintest du wohl handles.Bauteil weil später verwedest du das auch so
sollte wohl so sein:
Code:
function Bauteil_Callback(hObject, eventdata, handles)
% bei Popup bekommst Alle Einträge mit der Eigenschaft String
Bauteile_Liste = get(hObject, 'String');
% selektierten Beitrag bekommt durch Eigenschaft Value
sel_pos = get(hObject, 'Value');
Bauteil = Bauteile_Liste{sel_pos};
% IF kannst du mit SWITCH in der Fall ersetzen, ist etwas übersichtlicher switch(Bauteil) case 'Platte'
set(handles.Material, 'String', {'GKB', 'GKF','FPY','OSB','Stahl','Beton','Glas','BSP'}); %Plattenauswahl für Popupmenübauteil
otherwise set(handles.Material, 'String', {'Fichtenstab', 'Eichenstab', 'Metallstab'}) %Stabauswahl für Popupmenübauteil
end
da du das jedesmal machst kann man das auch einmal schreiben
handles.Bauteil = Bauteil;
guidata(hObject, handles);
Das "Witzige" ist jetzt das es keine Fehlermeldung mehr macht wenn ich das figure aus GUI Editor (Wo man die verschiedenen Pushbuttons, Textfelder, axes festlegt) mit RUN Figure starte. Wenn ich es aber direkt öffne bekomme ich wieder die selbe Fehlermeldung.
Kann es sein das ich es doppelt belege wenn ich im Property Inspector den String mit Platte und Stab eingebe und sie in der openingfct auch noch mit set(handles.Bauteil, String,'Platte','Stab') intialisiere? Bzw. ist das mein Fehler?
Habe schon einige Kombinationen getestet:
Wenn ich den String (Platte, Stab) im Property Inspector nicht eingebe und nur das figure öffne, wird mir nur die Eingabe im String gezeigt und nicht die von set(handles.Bauteil, String,'Platte','Stab') und ich bekomme wieder einen Fehler.
Wenn ich die set(handles.Bauteil, String,'Platte','Stab') aus meiner m.Datei lösche und die Strings nur im Property Inspector eingebe bekomme ich auch einen Fehler...
Ihr öffnet das GUI doch normalerweise auch über Doppelklick auf die fig-Datei, oder?
Ihr öffnet das GUI doch normalerweise auch über Doppelklick auf die fig-Datei, oder?
Nein, FIG-Datei ist nur ein Container, wenn du darauf klickst, wird nur die Figure geöffnet und die weiß nichts über M-File. Also Initialisierungsroutinen aus dem M-File werden nicht ausgeführt. Das wird zur Fehlern führen, wenn du Callbacks ausführst, weil handles Strukt existiert nicht usw..
Man muss entweder m-File in der Konsole aufrufen (ohne Endung), oder Rechtsklick auf die Datei => ausführen.
Zitat:
Kann es sein das ich es doppelt belege wenn ich im Property Inspector den String mit Platte und Stab eingebe und sie in der openingfct auch noch mit set(handles.Bauteil, String,'Platte','Stab') intialisiere? Bzw. ist das mein Fehler?
In der OpeningFcn wird einfach das was du in PropertyInspector eingegeben hast, überschrieben. Das ist aber kein Fehler.
Der Fehler ist nur in deinem Set-Befehl wenn du mehrere Einträge ins das Popupmenu einfügen möchtest, muss du ein Cell sein.
so ist richtig:
Außerdem handles.Bauteil ist doch bei dir kein handle auf Popupmenu, oder? In deinem Bauteil_Callback überschreibst du das handle, hier bitte aufpassen.
Leider habe ich vorhin gar nicht gemerkt, dass ich nicht eingeloggt war. Sry
Das GUI funktioniert soweit so gut, wenn ich es mit RUN GUI öffne. Probleme gibt es wenn ich nach der vollständigen Eingabe noch einmal das erste Popup Menüs verändere. Das liegt denke ich daran, dass das zweite Popup ja durch die Wahl des ersten geschaltet wird.. ?! Aber das ist zu verschmerzen...
Ein Problem, das mich als Anfänger auch nach langen Lesen im Forum noch verzweifeln lässt, sind meine drei Axis die ich mit Plots belegen möchte. Ich glaube sie werden von mir nicht richtig angesprochen.
Hallo
wie schon oben erwähnt, ist dein Fehler vor allem darin, dass du die handles(Referenzen zu graphischen Objekten) überschreibst. Speichere z.B deine Daten in handles.mydata.Bauteil oder handles.mydata.Dicke usw
Ich habe einige Fehler verbessert, dass jetzt etwas geplottet wird. Aber ich habe kein Zeit mir alles genau anzuschauen, habe deswegen nur schelle das Ganze überflogen. Es sind noch einige Fehler drinnen. Meist sind das Fehlern bei Interaktion mit der GUI. aber auch viele semantische Fehler. Also das muss du dir genauer dir alles durchschauen und überlegen was du machen möchtest. Die Werte muss du auch vorinitialisieren, weil der User nicht immer alle Werte möchte ja eingeben oder er kann auch vergessen etwas anzugeben. Na ja auf jedenfall darf das Programm dabei nicht abstürzen.
Ich empfehle dir das Getting Started in der Doku genauer durchzulesen. Weil da fehlt dir noch das grundlegende Verständnis, sogar STTRCMP machst du noch Vergleich welcher unnötig ist.
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
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.