Verfasst am: 18.11.2011, 18:50
Titel: Benötige dringend Hilfe mit dem Befehl "menu(title, st
Hallo an Alle,
ich benötige dringend Hilfe für meine Abschlussarbeit.
Ich habe eine sehr umfangreiche GUI erstellt.
Nun hänge ich an einem einzigen Befehl und finde keine Lösung.
Problem:
Ich biete dem User per Radiobutton an zwischen zwei Optionen zu entscheiden. (Ja oder Nein).
Wählt der User "Ja", dann öffnet sich ein Fenster zur Auswahl von verschiedenen Gefahrenklassen. Nach der Auswahl schließt das Fenster wieder.
Alles klappt bis hier her super.
ABER wenn der User nichts wählt bleibt das Fenster geöffnet. Gerne möchte ich an einer anderen Stelle sagen, dass wenn nichts gewählt wurde wieder der Zusatnd "Nein" entstehen soll und das Fenster sich dann schließt.
Da ich leider erst seit ca. 2 Monaten mit Matlab zu tun habe fehlt es mir noch ein wenig an mancher Stelle. Habe auch schon das Netz und Bücher für das Problem durchforstet.
Nun hoffe ich auf eure Ideen / Hilfe!!!
Nachfolgend mein Code:
Code:
function Gefahrgut_SelectionChangeFcn(hObject, eventdata, handles)
das ist alleine schon deswegen schwierig, weil die Codeausführung in dem Moment ja angehalten ist. Zudem: wie willst du wissen, ob der Anwender nichts auswählen will oder noch nichts gewählt hat?
Ich würde es dem Anwender überlassen, das Fenster zu schließen, und evtl. eine Option "Ohne Eingabe weiter" einbauen, die einem Schließen des Fensters durch den Anwender gleichkommt.
erstmal herzlichen Dank für Deine schnelle Antwort.
Sollte der User nichts auswählen und drückt in meiner GUI den Start Button dann soll das Fenster schließen per eingebautem Befehl.
Will der User nix ausfüllen und bedient das "x" zum schließen des Fensters, dann ist alles kein Problem. Aber wenn der User das Fenster öffnet und nichts auswählt, aber trotzdem den Startbutton drückt, dann soll das Fenster schließen.
Leider weiß ich nicht wie ich das "Fenster" ansprechen um den Befehl zum schließen zu geben. Habe keine Syntax gefunden und "close( Gefahrenauswahl) funktioniert nicht. Auch "exit" hat nicht geklappt.
blöde Frage: passiert überhaupt etwas, wenn der User den Start-Button drückt? Eigentlich sollte ja die Ausführung erst mal angehalten sein, bis die Auswahl getroffen oder das Fenster geschlossen wird?
Selbst wenn es also einen Code dafür gibt, ist die Frage, wie man ihn zur Ausführung bekommt. Was ich versuchen würde: den Code von menu.m kopieren und so modifizieren, dass nach dem Öffnen regelmäßig abgefragt wird, ob in der Hilfs-GUI ein Button gedrückt wurde oder ob in der Haupt-GUI der Start-Button gedrückt wurde. Oder natürlich gleich eine zweite, selbst geschriebene GUI.
als Erstes möchte ich mich bei Dir für Deine Hilfe recht herzlich bedanken.
Ich bin schon sehr freudig überrascht wie schnell man hier gute Antworten bekommt.
Habe soeben Deinen Vorschlag ausprobiert und es hat wunderbar funktioniert. Genau solch einen Befehl habe ich gesucht. Mit "findobj" habe ich auch schon probiert, aber der Syntax war immer falsch.
Deine Lösung ist perfekt.
Gerne hätte ich Dir dafür ein Bier spendiert. Nochmals DANKE SEHR.
Nun habe ich mein größtes Problem gelöst.
Dürfte ich noch eine weitere Frage stellen?
Ich versuche krampfhaft folgenden Code zusammenzufassen, aber es klappt nicht ohne eine Fehlermeldung.
Code:
%% Speichern der Daten mit Symbol "Diskette"
function Datei_speichern_ClickedCallback(hObject, eventdata, handles)
switch(questdlg('Wollen Sie die gesetzten Eingaben speichern?','Zwischenspeichern','Ja','Nein','Nein'));
case 'Nein';
return;
case 'Ja';
Zwischenspeicher = findobj('style','edit'); % alle Edit-Boxen suchen u. handles in Zwischenspeicher schreiben for i = Zwischenspeicher' % alle handles durchgehen
Tag_namen = get(i,'tag'); % Tag lesen
Einlesen = get(i,'string'); % Inhalt der Edit-Box lesen var.(Tag_namen) = Einlesen; % Inhalt per indirekter Adressierung in struct "var" schreiben end save content_edit_boxes var;
Zwischenspeicher = findobj('style','radiobutton'); % alle Radiobutton suchen u. handles in Zwischenspeicher schreiben for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = get(i,'Value'); % Wert lesen. D. h. wenn "1" dann ist der Button ausgewaehlt worden. Wenn "0" dann ist er nicht ausgewaehlt worden. var.(Tag_namen) = Einlesen;
end save content_radiobutton var;
Zwischenspeicher = findobj('style','text'); % alle Textausgabefelder suchen u. handles in Zwischenspeicher schreiben for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = get(i,'string');
var.(Tag_namen) = Einlesen;
end save content_text var;
Zwischenspeicher = findobj('style','checkbox'); % alle Checkboxen suchen u. handles in Zwischenspeicher schreiben for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = get(i,'Value');
var.(Tag_namen) = Einlesen;
end save content_checkbox var;
Zwischenspeicher = findobj('style','popupmenu');% alle Popupmenus suchen u. handles in Zwischenspeicher schreiben for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = get(i,'Value');
var.(Tag_namen) = Einlesen;
end save content_popupmenu var;
load content_edit_boxes;
Zwischenspeicher = findobj('style','edit'); % alle Edit-Boxen suchen u. handles in h schreiben for i = Zwischenspeicher' % alle handles durchgehen
Tag_namen = get(i,'tag'); % Tag lesen
Einlesen = var.(Tag_namen); % passenden Inhalt aus struct lesen set(i,'string',Einlesen); % diesen Inhalt in Edit-Box schreiben end
load content_radiobutton;
Zwischenspeicher = findobj('style','radiobutton');
for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = var.(Tag_namen);
ifstrcmp(Tag_namen, 'Eigene_Auswahl')% Wenn die Strings gleich sind, dann fragen ob, if Einlesen == 1% der Wert gleich "1" ist. Wenn Ja, dann set(handles.Auswahl_Abgangsort,'enable','off');
set(handles.Auswahl_Abgangsort,'Value',1);
set(handles.Entfernung_nach_HH,'enable','on')
Fotodatei = imread('LKW_Hongkong.jpg');
image(Fotodatei);
set(gca,'DataAspectRatio',[10.91]);
set(gca,'Visible','on','Units','Pixels','Position',[402,172,456,430]);
set(gca,'XTick',[]),set(gca,'YTick',[]);
end
elseifstrcmp(Tag_namen, 'Vorgabeliste') if Einlesen == 1 load content_popupmenu;
Zwischenspeicherpop = findobj('style','popupmenu');
for k = Zwischenspeicherpop'
Tag_namenpop = get(k,'tag');
Einlesenpop = var.(Tag_namenpop);
if Einlesenpop == 1 set(handles.Ausgabe_Entfernung,'FontWeight','normal','ForegroundColor','red','string','0,00');
set(handles.Entfernung_nach_HH,'enable','off');
set(handles.Auswahl_Abgangsort,'enable','on');
set(handles.Entfernung_nach_HH,'string','0');
Fotodatei = imread('DB_Schenker_Logo.jpg');
image(Fotodatei);
set(gca,'DataAspectRatio',[1.73511]);
set(gca,'Visible','on','Units','Pixels','Position',[229,443,800,136]);
set(gca,'XTick',[]),set(gca,'YTick',[]);
elseif Einlesenpop == 6 set(handles.Ausgabe_Entfernung,'FontWeight','normal','ForegroundColor',[1,0,0],'string',EntfernungnachHHfest(5));
Fotodatei = imread('Wiesbaden.jpg');
image(Fotodatei);
set(gca,'DataAspectRatio',[11.131]);
set(gca,'Visible','on','Units','Pixels','Position',[402,172,456,430]);
set(gca,'XTick',[]),set(gca,'YTick',[]);
end set(k,'Value',Einlesenpop);
end end end set(i,'Value',Einlesen);
end
load content_text;
Zwischenspeicher = findobj('style','text');
for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = var.(Tag_namen);
set(i,'string',Einlesen);
end
load content_checkbox;
Zwischenspeicher = findobj('style','checkbox');
for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = var.(Tag_namen);
set(i,'Value',Einlesen);
end
Ich sehe höchstens die Möglichkeit, Code in eine Funktion auszulagern und diese wiederholt aufzurufen. Das könnte so aussehen:
Code:
function DatenSpeichern(style, property)
Zwischenspeicher = findobj('style',style); % alle Textausgabefelder suchen u. handles in Zwischenspeicher schreiben for i = Zwischenspeicher'
Tag_namen = get(i,'tag');
Einlesen = get(i,property);
variablen.(Tag_namen) = Einlesen;
end save(['content_' style], 'variablen');
erstmals möchte ich mich gerne für Deine erneute Antwort bedanken.
Habe natürlich Deinen Vorschlag dankend ausprobiert und bin daran nun echt verzweifelt. Ich bekomme das einfach nicht hin.
Es reicht auch aus, eine .mat-Datei zu Speichern. Diese Speicherung hat nur den Zweck, dass die gestezten Eingaben zwichengespeichert werden können und gegebenfalls wieder aufgerufen werden können.
Diese Zwischenspeicherung soll auch beim erneuten "Zwischenspeichern" wieder überschrieben werden.
Gerne möchte ich den langen Code fürs Speichern und laden verkürzen, aber nich bekomme es einfach nicht zum laufen.
ich kann das ja schlecht ausprobieren, da ich den Rest der GUI nicht habe. Ich würde dich also bitten, deinen Versuch und die dabei auftretenden Fehlermeldungen zu posten.
Wenn du ein Element in GUIDE erstellst, kannst du die Tag-Eigenschaft per Doppelklick auf das Objekt ändern.
Wenn das Element anderweitig erstellt wird, kannst du
bzgl. des langen Codes:
"ich kann das ja schlecht ausprobieren, da ich den Rest der GUI nicht habe. Ich würde dich also bitten, deinen Versuch und die dabei auftretenden Fehlermeldungen zu posten."
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.