erst seit kurzem arbeite ich mit diesem mächtigen und vielseitigen Hilfsmittel und komme, Dank der eingebauten Hilfe und diesem Forum, zunehmend voran. Allerdings komme ich bei einer Sache noch nicht voran, obwohl ich hier schon mindestens 30 Beiträge durchforstet, die Suche bemüht ("function", "handles" usw.) und einiges ausprobiert habe: Ich schaffe es nicht, Variablen von einem Hauptprogramm (*.m) in eine GUI-Datei (auch *.m, aber mit zugehöriger, in GUIDE erstellter *.fig-Datei) zu übergeben und umgekehrt.
Konkret sieht das so aus:
im Hauptprogramm.m wird eine Datei eingelesen, aus der einige Variablen bestimmt werden, min_y, max_y, min_z und max_z.
Danach möchte ich, daß ein GUI namens Unterprogramm.m aufgeht, das mir diese Parameter anzeigt, in dem ich aber noch zusätzliche Werte und Optionen für die nachfolgenden Berechnungen eingeben kann.
Das GUI alleine funktioniert auch (wenn ich "Unterprogramm.m" im Editor-Fenster mit F5 starte).
Aufgerufen wird das GUI im Hauptprogramm mit der Zeile
PP=Unterprogramm(min_y, max_y, min_z, max_z);
uiwait(PP);
in der Hoffnung, daß das Feld "PP" alle Variablen enthält, die das Unterprogramm zurückgibt, in diesem Fall "y_min_neu", "y_max_neu", "z_min_neu" und "z_max_neu"). Ohne "uiwait" würde das Hauptprogramm einfach weiterlaufen, ohne sich um das Unterprogramm zu scheren.
Lasse ich im Hautprogramm probeweise "PP" ausgeben (disp(PP);), erscheint nur die Zahl "158.0281".
Dann habe ich es mit "FFF = getappdata(0,'Unterprogramm');" versucht, doch "disp(FFF);" gibt überhaupt nichts aus.
So, wie ich es verstanden habe, müßte "PP" sowieso ein Feld sein, das alle Variablen enthält, die das Unterprogramm zurückgibt, doch
der Versuch, eine dieser Variablen mit "disp(PP{2})" anzuzeigen, ergibt die Fehlermeldung "Cell contents reference from a non-cell array object."
Der Versuch "y_max_neu=PP{2};" liefert mir natürlich die gleiche Fehlermeldung.
Das Unterprogramm beginnt mit "function varargout = Unterprogramm(varargin)", dann folgt die GUI-Initialisierung. Bevor die einzelnen Callback-Funtionen auftauchen, hätte ich gerne die Variablen aus dem Hauptprogramm im Unterprogramm, damit sie dort (z. B. mit "set(handles.Y1, 'String', min_y);") in Textfeldern angezeigt oder anderweitig verwertet werden können.
Da nach meinem Verständnis das Feld "varargin" die Variablen aus dem Hauptprogramm enthalten, versuche ich es mit
"y_min = varargin{1}; y_max = varargin{2}; z_min = varargin{3}; z_max = varargin{4};", und zwar nach der Initialisierung und vor
"function Unterprogramm_OpeningFcn(hObject, eventdata, handles, varargin)" und
"function varargout = Unterprogramm_OutputFcn(hObject, eventdata, handles)", schließlich sollen die Variablen ja in der ganzen GUI gelten.
Doch diese Art der Zuordnung liefert unsinnige Werte für die Variablen und letztendlich die Fehlermeldung "Index exceeds matrix dimensions."
Das einzige was ich daraus schließen konnte, ist, daß die GUI anscheinend bei jeder Benutzeraktion (Anklicken eines Knopfen o. ä.) erneut komplett durchlaufen wird.
Beendet wird das GUI mit einem "Weiter"-Knopf und den Befehlen
guidata(hObject, handles);
setappdata(0,'handles_Eingabemaske6',handles);
delete(Eingabemaske6); %Schließen des Eingabefensters.
Im Anschluß findet Ihr das komplette Listing des Unterprogramms.
Danke im voraus für Eure Hilfe!
% --- Executes just before Eingabemaske6 is made visible.
function Eingabemaske6_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for Eingabemaske6
handles.output = hObject;
%Hinzufügen der Variablen zur handles-Struktur:
set(handles.Maximalknopf,'Value', 0); %nicht aktiviert
set(handles.Unveraendertknopf,'Value', 0); %nicht aktiviert
set(handles.Beliebigknopf,'Value', 1); % aktiviert
% Aktualisieren der handles-Struktur:
guidata(hObject, handles);
% UIWAIT makes Eingabemaske6 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% Übernahme der Variablen aus dem Hauptprogramm:
% disp(varargin{1}); disp(varargin{2}); disp(varargin{3}); disp(varargin{4});
%min_y=varargin{1};max_y=varargin{2};min_z=varargin{3};max_z=varargin{4};
% --- Outputs from this function are returned to the command line.
function varargout = Eingabemaske6_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% Ist wohl überflüssig, ich hatte bloß keine Lust mehr, die FIG-Datei neuzumachen:
function Auswahlmenu_Interpolation_CreateFcn(hObject, eventdata, handles)
% Auswahl des Interpolationsgrades in einem Runterklapp-Menü:
function Auswahlmenu_Interpolation_Callback(hObject, eventdata, handles)
% Korrektur des Gitternullpunktes in y-Richtung:
function y_Korrektur_Callback(hObject, eventdata, handles)
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
yKorrektur = get(hObject, 'string'); Komma = strfind(yKorrektur, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Y_Korrektur = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Y_Korrektur) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end
% Korrektur des Gitternullpunktes in z-Richtung:
function z_Korrektur_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
zKorrektur = get(hObject, 'string'); Komma = strfind(zKorrektur, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Z_Korrektur = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Z_Korrektur) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end
% Eingabemöglichkeit beliebiger Gittereckpunkte (frei wählbare Gittergröße):
function Ymin_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
YminEingabe = get(hObject, 'string'); Komma = strfind(YminEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Y_min_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Y_min_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end
function Ymax_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
YmaxEingabe = get(hObject, 'string'); Komma = strfind(YmaxEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Y_max_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Y_max_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end
function Zmin_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
ZminEingabe = get(hObject, 'string'); Komma = strfind(ZminEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Z_min_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl
if isnan(Z_min_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end
function Zmax_beliebig_Callback(hObject, eventdata, handles)
% Weiße Hintergrundfarbe im editierbaren Textfeld:
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Prüfen, ob als Dezimaltrennzeichen ein Komma eingegeben wurde:
ZmaxEingabe = get(hObject, 'string'); Komma = strfind(ZmaxEingabe, ',');
if norm(Komma)>0
errordlg('Bitte als Dezimaltrennzeichen hier einen Punkt statt einem Komma eingeben.','Bad Input','modal')
return
end
Z_max_neu = str2double(get(hObject,'string')); %Umwandlung der eingegebenen Zeichen in eine Zahl.
if isnan(Z_max_neu) % Prüft, ob fälschlicherweise Buchstaben eingegeben wurden.
errordlg('Bitte nur Zahlen eingeben','Bad Input','modal')
return
end
% Abfrage der gewünschten neuen Gittergröße über "Radioknöpfe":
function Maximalknopf_Callback(hObject, eventdata, handles)
Knopf2 = get(handles.Maximalknopf,'Value');
if (Knopf2 == 1)
handles.Y_min_neu=str2num(get(handles.y_minimal, 'String'));
handles.Y_max_neu=str2num(get(handles.y_maximal, 'String'));
handles.Z_min_neu=str2num(get(handles.z_minimal, 'String'));
handles.Z_max_neu=str2num(get(handles.z_maximal, 'String'));
% Aktualisierung der Textfelder für beliebige Gittergröße:
set(handles.Ymin_beliebig,'String', get(handles.y_minimal, 'String'));
set(handles.Ymax_beliebig,'String', get(handles.y_maximal, 'String'));
set(handles.Zmin_beliebig,'String', get(handles.z_minimal, 'String'));
set(handles.Zmax_beliebig,'String', get(handles.z_maximal, 'String'));
guidata(hObject, handles);
end
function Unveraendertknopf_Callback(hObject, eventdata, handles)
Knopf1 = get(handles.Unveraendertknopf,'Value');
if (Knopf1 == 1)
handles.Y_min_neu=str2num(get(handles.Y1, 'String'));
handles.Y_max_neu=str2num(get(handles.Y2, 'String'));
handles.Z_min_neu=str2num(get(handles.Z1, 'String'));
handles.Z_max_neu=str2num(get(handles.Z2, 'String'));
% Aktualisierung der Textfelder für beliebige Gittergröße:
set(handles.Ymin_beliebig,'String', get(handles.Y1, 'String'));
set(handles.Ymax_beliebig,'String', get(handles.Y2, 'String'));
set(handles.Zmin_beliebig,'String', get(handles.Z1, 'String'));
set(handles.Zmax_beliebig,'String', get(handles.Z2, 'String'));
guidata(hObject, handles);
end
function Beliebigknopf_Callback(hObject, eventdata, handles)
function Weiterknopf_Callback(hObject, eventdata, handles)
%uiresume;
% Abfragen des gewünschten Interpolationsgrades:
Interpolationsauswahl = get(handles.Auswahlmenu_Interpolation,'Value');
switch Interpolationsauswahl;
case 1 % ' kubisch'
handles.Interpolationsgrad = 3;
case 2 % ' quadratisch'
handles.Interpolationsgrad = 2;
case 3 % ' linear'
handles.Interpolationsgrad = 1;
case 4 % ' alle Werte auf Null'
handles.Interpolationsgrad = 0;
end
Dieser Teil dürfte die Ausgabeparameter regeln (varargout ist ein Cell-Array das die Ausgabewerte beinhält, nargout die Anzahl der Ausgabeparameter). Versuch mal mehr Ausgabevariablen mitanzugeben, vielleicht ändert sich ja da schon was.
Da ich mit GUIDE nicht programmiere, kenne ich leider die Syntax nicht wirklich (gui_mainfcn).
Falls dies nicht funktioniert (wovon ich mal ausgehe), musst du in der gui_mainfcn die Ausgabevariable varargout auch dementsprechend belegen.
Alternativ kannst du natürlich auch die Werte direkt in die GUI schreiben und auslesen. Alles was du dafür brauchst, ist das handle auf die GUI (oder ein Objekt in der GUI). Siehe dazu
Verfasst am: 31.07.2008, 13:57
Titel: EIn Beispiel möglich?
Hallo, dibor, Danke für Deine Antwort!
dib0r hat Folgendes geschrieben:
so wie es aussieht, wird dir ein Handle auf die GUI übergeben (sonst würde uiwait auch nicht funktionieren).
Und wo wird dieses Handle angelegt? Ich dachte, das macht erst das GUI?
Zitat:
Dieser Teil [s.o.] dürfte die Ausgabeparameter regeln (varargout ist ein Cell-Array, das die Ausgabewerte beinhält, nargout die Anzahl der Ausgabeparameter). Versuch mal mehr Ausgabevariablen mitanzugeben, vielleicht ändert sich ja da schon was.
Da ich mit GUIDE nicht programmiere, kenne ich leider die Syntax nicht wirklich (gui_mainfcn).
Falls dies nicht funktioniert (wovon ich mal ausgehe)
Ja, das funktioniert nicht. Es kommt dann die Fehlermeldung, ich hätte zu viele Ausgabevariablen ("Error using ==> Eingabemaske6>Eingabemaske6_OutputFcn
Too many output arguments."). Mein Unterprogramm heißt hier "Eingabemaske6", nicht, daß es zur Verwirrung kommt.
Füge ich in die Initialisierungssequenz des Unterprogramms die Zeile
und lasse das Unterprogramm testweise alleine laufen (das muß es ja können), erhalte ich wieder eine Meldung à la "zuviele Ausgabeargumente" und noch einen Rattenschwanz, der sich auf die gui_mainfcn bezieht.
Zitat:
musst du in der gui_mainfcn die Ausgabevariable varargout auch dementsprechend belegen.
Wie kann ich das tun? (Entschuldige diese, für erfahrene Anwender sicher triviale Frage.)
Wo und was ist eigentlich diese "gui_mainfcn", in der Hilfe steht dazu nichts?
Zitat:
Alternativ kannst du natürlich auch die Werte direkt in die GUI schreiben und auslesen. Alles was du dafür brauchst, ist das handle auf die GUI (oder ein Objekt in der GUI). Siehe dazu
wird ja, so wie ich verstanden habe, das Handles-Feld ("Cell-Array") aktualisiert, d. h. alle, in den Callbacks gewonnenen, Handles in diesem Feld abgespeichert.
Versuche ich nun, im Hauptprogramm mit
aus diesem Feld wieder eine Variable herauszuziehen und "KKK" zuzuordnen, kennt er kein "handles" mehr und dankt es mit der Fehlermeldung "??? Undefined function or variable 'handles'.
Error in ==> Hauptprogramm_7 at 93
KKK=guidata(handles.Y_min_neu);".
Die Hilfe hat mich über guidata nicht wirklich schlauer gemacht.
Wäre es möglich, mir einfach ein kurzes Beispiel zu geben à la:
Code:
Hauptprogramm
.
.
.
a=1; b=2; c=3;
% Aufrufen des Unterprogramms mit den zu übergebenden Variablen a, b und c und den "zurückerwarteten" Variablen a_neu, b_neu und c_neu: [a_neu b_neu c_neu]=Unterprogramm(a, b, c);
%Muß ich etwas an der Initialisierung ändern? Standardmäßig steht da immer "DO NOT EDIT!"
% Laden der Variablen aus dem Hauptprogramm:
a=???; % Was muß das stehen?
b=???;
c=???;
% Verrechnung dieser Variablen:
a_neu=a+1; b_neu=sqrt(b+2); c_neu=sin(b+c);
% Diverse Auswahlmenüs und Eingaben ergeben zusätzlich:
d=4; e=5;
% Übergabe in das Cell-Array "handles":
handles.a=a_neu;
handles.b=b_neu;
handles.c=c_neu;
handles.d=d;
handles.e=e;
guidata(hObject, handles); % Muß da immer "hObject" stehen?
function Weiterknopf_Callback(hObject, eventdata, handles)
Sorry, ich kann meinen Beitrag nicht editieren, es hat sich im Beispiel ein Fehler eingeschlichen:
Statt
Code:
% Aufrufen des Unterprogramms mit den zu übergebenden Variablen a, b und c und den "zurückerwarteten" Variablen a_neu, b_neu und c_neu: [a_neu b_neu c_neu]=Unterprogramm(a, b, c);
% Aufrufen des Unterprogramms mit den zu übergebenden Variablen a, b und c und den "zurückerwarteten" Variablen a_neu, b_neu, c_neu, d und e: [a_neu b_neu c_neu d e]=Unterprogramm(a, b, c);
nargout gleich 5 (normalerweise setzt man nargout nicht manuell, sondern überprüft nur wieviele Argumente reinkommen wenn man keine konstante Anzahl an Ausgabevariablen hat / haben will). Allerdings muss dann auch varargout von 1-5 gehen, d.h. varargout{5} muss existieren, ansonsten kommt die von dir beschriebene Fehlermeldung.
Sorry, ich meinte das handle wird zurückgegeben, nicht übergeben d.h. die GUI legt dies an und gibt dir das handle (eine Zahl) zurück, über die du die GUI ansprechen kannst.
z.B.
Nunja, die gui_mainfcn sollte eigentlich irgendwo in der m-Datei oder im Figure existieren. Wie gesagt, ich erstelle meine GUIs nicht mit GUIDE, sondern direkt als m-Datei.
besagt, dass wenn mindestens eine Ausgabevariable beim Funktionsaufruf existiert (nargout > 0), dann dienen alle Ausgabevariablen der Funktion "gui_mainfcn" auch als Ausgabe der Funktion Eingabemaske6. gui_mainfcn wird mit den Eingabevariablen gui_State, die ja weiter oben initialisiert wird, und varargin, praktisch den Eingabeparametern der Funktion Eingabemaske6, versehen.
Nun müsstest du eigentlich die Funktion suchen (evtll mal in GUIDE nachlesen wie dort GUIs erstellt werden) und die von dir gewünschten Variablen / Werte zurückgeben lassen.
liest Daten aus dem Object hObject und schreibt diese dann nach data. Falls du an irgendeiner Stelle mal Daten in die GUI (oder ein Objekt der GUI) schreibst, kannst du die an jeder beliebigen Stelle auslesen, vorausgesetzt du kennst das handle eines Objektes der GUI und die GUI exisitert noch.
jederzeit die Daten rausholen. data ist eine Struktur mit den Feldern A, U, S und V. Diese Werte sollten identisch sein mit denen, die du als Rückgabewerte erhälst. Falls du in die Funktion keine Daten übergibst (nargin = 0), werden zufällige Werte generiert. Alle Variablen, die du auf der linken Seite des Funktionsaufrufes angibst, werden auch belegt (maximal 5).
Ich hoffe dass es einigermaßen verständlich erklärt wurde. Wie erwähnt, GUIDE ist nicht mein Fall.
% Verrechnung dieser Variablen:
a_neu=a+1; b_neu=sqrt(b+2); c_neu=sin(b+c);
% Diverse Auswahlmenüs und Eingaben ergeben zusätzlich:
d=4; e=5;
% Übergabe in das Cell-Array "handles":
%%%%%%%%%%%%
handles ist eine Struktur, kein Cell-Array
%%%%%%%%%%%%
handles.a=a_neu;
handles.b=b_neu;
handles.c=c_neu;
handles.d=d;
handles.e=e;
guidata(hObject, handles); % Muß da immer "hObject" stehen?
%%%%%%%%%%%%%%%%
Nein, hObject existiert hier nicht. Hier sollte ein handle zu einem Objekt in deiner GUI stehen. Allerdings sehe ich hier irgendwie kein GUI-Objekt. z.B. figure_handle = figure;
Dann muss hier
guidata(figure_handle, handles)
stehen. Allerdings ist der Variablenname handles irgendwie schlecht gewählt. Nimm lieber s für struct oder data oder sonstwas (handles sind so eine Art Adressen bzw. Links für (graphische) Objekte).
%%%%%%%%%%%%%%%%
function Weiterknopf_Callback(hObject, eventdata, handles)
%%%%%%%%%%%%%%%%
hm, dir fehlt in dieser Funktion "varargout".
functionvarargout = Weiterknopf_Callback(hObject, eventdata, handles)
müsste das vermutlich heissen. Allerdings gibt es für Callback-Funktionen glaub ich keine Rückgabewerte.
%%%%%%%%%%%%%%%%
% Schließen des Unterprogramms: delete(Unterprogramm);
%%%%%%%%%%%%%%%%%%
Problem an dieser Sache: sobald deine GUI gelöscht wird, kannst du auch nicht mehr ansprechen bzw. alle Daten der GUI sind weg. Ausserdem ist Unterprogramm ja eine Funktion (und kein handle auf ein Objekt) und kann somit nicht gelöscht werden.
%%%%%%%%%%%%%%%%%%
Falls du die Zeile mit delete, die Zeile mit der Callback-Funktion und die Zeile mit dem guidata weglässt, sollte das ganze funktionieren. Allerdings erhälst du dann keine GUI, sondern eine "normale" Funktion, die Eingabewerte manipuliert und ausgibt.
MfG
Gorbi
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.08.2008, 10:26
Titel: Noch Fragen...
dib0r hat Folgendes geschrieben:
Entschuldige für Doppel-Post (ich könnte editieren )
Na und? Von mir aus könntest Du fünffach posten. Immerhin versuchst Du mir weiterzuhelfen.
ausgeben, wird sie interesanterweise mehrfach ausgegeben. Erst steht da unsinnigerweise
a=
Auswahlmenu_Interpolation_CreateFcn,
er setzt also die Variable a gleich dem Namen irgendeiner "weiter unten" eingebetteten GUI-Unterfunktion;
darunter erscheint erstaunlicherweise der korrekte Wert, z. B.
a=
1
und danach wird anscheinend das gesamte Unterprogramm jedesmal auf's neue durchlaufen, wenn ich im dem GUI irgendeine Aktion ausführe (einen Knopf anklicke o. ä.), wobei a bzw. varargin{1} nach jeder Aktion mit dem Namen des entsprechenden Callback versehen wird!
Mit vararg{2} habe ich auch nicht mehr Glück; hier wird der korrekte Wert ebenfalls "beim zweiten Mal" angezeigt, danach erscheinen kryptische Zahlen bei jeder Aktion in der GUI.
Dabei ist es völlig wurst, an welcher Stelle des Unterprogramms ich die Variablen aus varargin ziehe. Beim Anklicken des Weiter-Knopfes erscheint letztendlich die Fehlermeldung, der Index überschreite die Matrix-Dimension von varargin.
Was mich nicht wundert, da sich nargin und nargout anscheinend mehrfach ändern. (DAS wundert mich dann.)
Zitat:
guidata(hObject, handles); % Muß da immer "hObject" stehen?
%%%%%%%%%%%%%%%%
Nein, hObject existiert hier nicht. Hier sollte ein handle zu einem Objekt in deiner GUI stehen. Allerdings sehe ich hier irgendwie kein GUI-Objekt. z.B. figure_handle = figure;
Tja, so wurde es von GUIDE automatisch generiert, und in den Hilfe-Beispielen steht da auch immer "hObject" drin.
Die Figures stehen in der FIG-Datei, und wenn ich in der M-Datei zu viel verändere, geht gar nichts mehr, weil sie nicht mehr mit der FIG-Datei übereinstimmt. GUIDE erzeugt nämlich erst die FIG-Datei und daraus dann die M-Datei, in der wir uns gerade "bewegen".
Zitat:
Dann muss hier
guidata(figure_handle, handles)
stehen. Allerdings ist der Variablenname handles irgendwie schlecht gewählt. Nimm lieber s für struct oder data oder sonstwas (handles sind so eine Art Adressen bzw. Links für (graphische) Objekte).
Gut, doch auch diese Syntax steht so in den Beispielen bzw. wurde von GUIDE so generiert.
Zitat:
hm, dir fehlt in dieser Funktion "varargout".
function varargout = Weiterknopf_Callback(hObject, eventdata, handles)
müsste das vermutlich heissen.
Das habe ich jetzt so geändert, wie Du es vorgeschlagen hast. Es hat nicht geschadet, aber auch erst einmal nichts bewirkt. )
Zitat:
% Schließen des Unterprogramms:
delete (Unterprogramm);
%%%%%%%%%%%%%%%%%%
Problem an dieser Sache: sobald deine GUI gelöscht wird, kannst du auch nicht mehr ansprechen bzw. alle Daten der GUI sind weg. Ausserdem ist Unterprogramm ja eine Funktion (und kein handle auf ein Objekt) und kann somit nicht gelöscht werden.
Wie kriege ich die GUI dann weg? Mit 'Visible', 'off' nur unsichtbar machen?
Eigentlich wollte ich im Hauptprogramm die Variablen vor dem Befehl "uiwait" übernehmen - "handles" wird ja im Unterprogramm nach jeder Aktion aktualisiert - und dann das Unterprogramm weghaben ("delete").
Puh, diese GUI-Geschichte erscheint mir etwas unlogisch, oder ich bin zu blöd dazu. Ich probiere weiter, doch falls Dir noch ein guter Tip einfällt, bin ich immer dankbar. *g*
aha, anscheinend hat GUIDE das so gelöst, dass es "Unterprogramm" mehrfach aufruft, je nachdem was gemacht werden soll, werden einfach die Eingabeparameter angepasst (vermutlich dienen dazu die Namen der Funktion / Callbacks).
Nunja, da ich persönlich von GUIDE nicht viel halte, kann ich dich nur auf mein obiges Beispiel verweisen (das mit dem Sinus-Plot). Mit
kannst du dann manuell auch alle Elemente (Buttons, EditFelder usw.) hinzufügen. Ist zwar ein bisschen Arbeit, aber aus meiner Sicht lohnt sich das.
Ansonsten kann ich dir auch nicht mehr wirklich weiterhelfen, da ich das Konzept von GUIDE bzw. die Abhängigkeiten zwischen m-Datei und fig-Datei nicht so ganz nachvollziehen kann. Aber glaub mir, es gibt weitaus schlechtere GUI-Tools als GUIDE
ich hab mir jetzt nicht alles durchgelesen, aber alternativ könntest du auch über (temporäre) externe Zwischenspeicher nachdenken --> mat-files
Wenn nichts von den anderen Vorschlägen hier funktioniert, dann erstell doch einfach in dem einen m-file ein mat-file, welches dann von der GUI geladen wird und "ausgewertet" wird...
vielen Dank für den Hinweis. Ich habe es so gemacht, und es funktioniert!
Prima Sache, das mit dem "load" und "save".
Beste Grüße
Gorbi
Einstellungen und Berechtigungen
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.