Verfasst am: 12.03.2012, 11:49
Titel: Edit Wert löschen und auf Inactive setzten
Hallo,
ich habe eine Frage bzgl. des Setzten eines Edits auf Inactive. Solange ich in dem Editfeld noch keine Eingabe getätigt habe, funktioniert es. Nach dem ein Wert aber eigegeben wurde geht es leider nicht mehr und es kommt die Fehlermeldung.
??? Error using ==> set
Invalid handle object.
Error in ==> Kennparametertool_v7>KP_Auswahl_1_Callback at 161
set(handles.Wert1,'Enable','off');
Error in ==> gui_mainfcn at 96
feval(varargin{:});
Error in ==> Kennparametertool_v7 at 42
gui_mainfcn(gui_State, varargin{:});
Error in ==> @(hObject,eventdata)Kennparametertool_v7('KP_Auswahl_1_Callback',hObject,eventdata,guidata(hObject))
??? Error while evaluating uicontrol Callback
Der Code in dem das Problem auftritt:
Code:
if(strcmp(ausgabe_1,'')) set(handles.Wert1,'Enable','off');
elseif(strcmp(ausgabe_1,ausgabe_2)) set(handles.Wert1,'Enable','off');
errordlg('Der Kennparameter wird schon verwendet !', 'Error') else set(handles.Wert1,'Enable','on');
ich weiß nicht ob ich dich ganz richtig verstehe, aber ich versuchs mal.
Ich habe ein Popup, in dem Begriffe (wie z.B. Dauer) als String ausgewählt werden können. Dieser Güte habe ich mehrere Popup. Zwischen diesen wird ein Abgleich gemacht, ob in einem anderen Pop-Up, dieser String schon ausgewählt wurde oder nicht. Das danebenliegende Editfeld soll gelöscht werden bzw. auf inactive gesetzt wenn werden, wenn der Popupeintrag wieder verändert wird, bzw dieser nicht gültig ist, da er schon in einem anderen Popup gewählt wurde. Als Wert habe ich z.B. 10 eingeben. Steht dieser Wert drin funktioniert es nicht, steht nix drin geht`s. Hilft dir das weiter oder soll ich die Sourcedateien kurz hochladen?
wie gewünscht, die Sourcedatei. Beispielhaft kann man im Popup1 Regelungsdauer auswählen, gibt im Edit Wert 10 ein, wählt danach unten Max. Beschl. aus und gibt 20 ein. Soweit so gut. Wenn man jetzt Popup1 ebenfalls auf Max. Beschl. setzt kommt der Fehler. Dabei soll er eigentlich nur die Fehlermeldung ausgeben, den Wert quasi löschen und das Feld auf inaktiv setzten. Ich hoffe, du kannst mir weiterhelfen.
Damit überschreibst du das Handle in der handles-Struktur! handles.Wert1 beinhaltet danach die eingebenen Daten, nicht mehr den Verweis auf das Textfeld.
Wenn man Daten zur Handles-Struktur hinzufügt, sollte man in jedem Fall darauf achten, hier nicht Feldnamen zu verwenden, die bereits als Tags in Gebrauch sind.
Was ist die Absicht hinter den clear-Befehlen in Zeile 121 und 124? Wenn der String gelöscht werden soll, würde ich das so machen:
zunächst einmal vielen Dank für deine Bemühungen. Ich werde das gleich alles ausprobieren. Jetzt habe ich aber noch eine Frage zur Zeile 199, brauche ich die denn so überhaupt. Der Hintergrund ist ja die Abfrage:
Code:
Wert_1 = str2double(get(hObject,'String'));
% Wenn keine korrekte Eingabe erfolgt ist ifisnan(Wert_1)
Wert_1 = NaN;
set(hObject,'String',Wert_1);
errordlg('Die Eingabe muss eine Zahl sein !', 'Error') end ... if(strcmp(ausgabe,'Max. Beschleunigung')) set(handles.Aus_Besch,'String',Wert_1);
Damit soll ja geprüft werden ob die eingabe konform ist und die Zahl korrekt an das Ausgabeedit übergeben werden kann. Vielleicht ist es auch einfach nur ein Versändisproblem meinerseits.
Gruß
Thorsten
Wert_1 = str2double(get(hObject,'String'));
% Wenn keine korrekte Eingabe erfolgt ist ifisnan(Wert_1) set(hObject,'String','');
errordlg('Die Eingabe muss eine Zahl sein !', 'Error') end
entfernt und es funktioniert in Kombination mit deiner Idee, über set(handles.Wert1,'String',''), perfekt, nochmals vielen Dank für deine Hilfe.
Vielleicht kannst du mir noch bei einer Kleinigkeit helfen. Wie du gesehen hast, habe ich bisher 2 Popups, dies soll später noch erweitert werden. Für den Vergleich zwischen den Popups ist der Code:
verantwortlich. Jetzt summiert sich dieser mit Ansteigender Anzahl von POP-Ups immer weiter auf. Kennst du eine Möglichkeit dies allgemein für alle gültig in eine Art Kopfzeile zu schreiben?
ausgabe = cell(1,N);
str = cell(1,N);
for I = 1:N
feld = ['KP_Auswahl_' num2str(I)];
str{I}=get(handles.(feld),'String');
ausgabe{I}=str{I}{get(handles.(feld),'value')};
end
vielen Dank für die sehr hilfreiche Antwort. Ich habe es gerade ausprobiert. Die einzige Frage die ich noch dazu habe ist, muss ich in jedem Callback dies einfügen, so wie bisher geschehen, oder ist es möglich diese Konstruktion für alle Callbacks, z.B. aus der Opening Function, verfügbar zu machen?
Überings wenn ich dies in den Callback so reinschreibe, sagt matlab, dass N nicht definiert ist (??? Undefined function or variable N), muss ich die noch genauer definieren?
N ist die Anzahl dieser Felder - die du wohl kennst, ich aber nicht. Du solltest N also geeignet (er)setzen.
Die entscheidende Frage ist: wann soll dieser Code ausgeführt werden?
Einmalig beim Öffnen der GUI --> Opening Fcn
Immer genau derselbe Code für alle, wenn sich Status des jeweiligen Elements ändert --> Callback der Elemente anpassen
Ähnlicher Code (d.h. dieser, aber doch Anpassungen), wenn sich Status des jeweiligen Elements ändert --> den mehrfach verwendeten Code in eine Funktion schreiben und diese Funktion aus dem Callback jedes Elements heraus ausführen.
Perfekt, sehr schöne und nachvollziehbare Antwort/Erklärung, vielen Dank. Da sich der Status des Elements ändern kann, ist es somit besser im Callback aufgehoben, denke ich...
Das mit dem N war mein Fehler, hatte gerade nicht dran gedacht.
Mir ist noch aufgefallen, dass ich es gerne hätte wenn eine Dopplung in den Popup ergibt, dass sich dann das Popup, welches die Dopplungs auslöst, zurück auf "" setzt. Aktuell ist es so, dass das Wert Fenster auf "" gesetz wird und danach die beabsichtigte Fehlermeldung erscheint. Meine Idee dazu war:
Das habe ich jetzt so noch nicht ganz verstanden, ich habe zuvor deine Idee für die Vereinfachung der POPups erfolgreich umgesetzt. Das Wert-Feld 1 wird aber nur mit Popup1 verglichen, sodass ich es dort nicht für notwendig erachte die Struktur zu ändern. Also der Code für Wert_1 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.