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 Menü in Abhängigkeit von vorherigen Popups

 

JohnnyChoclate
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 18.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2014, 20:38     Titel: Popup Menü in Abhängigkeit von vorherigen Popups
  Antworten mit Zitat      
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);


Ich hoffe mir kann jemand helfen.

Liebe Grüße

Impendanzen.fig
 Beschreibung:
Das figure

Download
 Dateiname:  Impendanzen.fig
 Dateigröße:  17.91 KB
 Heruntergeladen:  359 mal
Impendanzen.m
 Beschreibung:
Die m. Datei

Download
 Dateiname:  Impendanzen.m
 Dateigröße:  12.78 KB
 Heruntergeladen:  357 mal
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.02.2014, 23:33     Titel: Re: Popup Menü in Abhängigkeit von vorherigen Popups
  Antworten mit Zitat      
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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 18.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2014, 08:55     Titel:
  Antworten mit Zitat      
Sry dafür!

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
   
    Bauteil = get(hObject,'String');          
    handles.Bauteil = Bauteil;
    guidata(hObject, handles);
   
else
   set(handles.Material,'String',{'Fichtenstab', 'Eichenstab', 'Metallstab'})                 %Stabauswahl für Popupmenübauteil
    Bauteil = get(hObject,'String');          
    handles.Bauteil = Bauteil;
    guidata(hObject, handles);
end


Leider bekomme ich dabei eine Fehlermeldung.

Error while evaluating uicontrol Callback

Attempt to reference field of non-structure array.

Ich bin mir dabei aber nicht sicher ob der Fehler nicht schon auf den Zugriff hObject.Platte beruht.....
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.02.2014, 16:34     Titel:
  Antworten mit Zitat      
Zitat:
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);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2014, 10:06     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort!

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... Question

Ihr öffnet das GUI doch normalerweise auch über Doppelklick auf die fig-Datei, oder?

Liebe Grüße
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.02.2014, 14:36     Titel:
  Antworten mit Zitat      
Zitat:

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:
Code:
set(handle_deines_popups, 'String',{'Platte','Stab'})


Außerdem handles.Bauteil ist doch bei dir kein handle auf Popupmenu, oder? In deinem Bauteil_Callback überschreibst du das handle, hier bitte aufpassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
JohnnyChoclate
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 18.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2014, 14:38     Titel:
  Antworten mit Zitat      
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.
Code:
 Frequenzbereich = 50:5000;
Realteil = 8* (str_material(Material).Dichte * str_material(Material).Emodul * Dicke^4 /(12*(1-(str_material(Material).Poisson)^2)))^0.5;
    Imaginaerteil = 0;
    Betrag = abs(Realteil);
   
    %Erzeugung der Handles für die axes und der Plots
   
    axes(handles.Realteil);
    plot(Frequenzbereich, Realteil)  
   
    axes(handles.Imaginaerteil);
    plot(Frequenzbereich,Imaginaerteil)
   
    axes(handles.Betrag);
    plot(Frequenzbereich, Betrag)


Der Tag von den Axen ist im Property Inspector ist auch richtig hinterlegt. Die Zugriffe auf die Struct und die Dichte müsste auch funktionieren.

Zu Beginn des Pushbuttons führe ich sie auf:
Code:
Material = handles.Material;
Dicke = handles.Dicke;


Ich hoffe mir kann jemand bei diesen banalen Problem helfen!!

LG

Impendanzen.fig
 Beschreibung:

Download
 Dateiname:  Impendanzen.fig
 Dateigröße:  17.95 KB
 Heruntergeladen:  393 mal
Impendanzen.m
 Beschreibung:

Download
 Dateiname:  Impendanzen.m
 Dateigröße:  13.59 KB
 Heruntergeladen:  371 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.02.2014, 17:12     Titel:
  Antworten mit Zitat      
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.

Schaue noch die Antworten von oben um 14:36

Impendanzen.m
 Beschreibung:

Download
 Dateiname:  Impendanzen.m
 Dateigröße:  13.69 KB
 Heruntergeladen:  373 mal
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.