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

Edit Wert löschen und auf Inactive setzten

 

T_Meister
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 12.03.2012, 11:49     Titel: Edit Wert löschen und auf Inactive setzten
  Antworten mit Zitat      
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 dachte es könnte vielleicht mit einem Befehl wie clear handles.Wert1 funktionieren, aber leider gab es nicht den gewünschten Erfolg.

Gruß und Danke
Thorsten
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2012, 12:27     Titel:
  Antworten mit Zitat      
Hallo,

diese Fehlermeldung tritt typischerweise auf, wenn auf ein ungültiges Objekt verwiesen wird (das z.B. schon gelöscht oder noch nicht erstelllt wurde).

Kannst du ein lauffähiges Beispiel zur Verfügung stellen, an dem das Problem reproduziert werden kann?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T_Meister
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 12.03.2012, 12:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2012, 12:42     Titel:
  Antworten mit Zitat      
Hallo,

am besten wäre wie gesagt ein reproduzierbares Beispiel.
Wenn du deinen Code also hochladen kannst, wäre das gut.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T_Meister
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 12.03.2012, 12:47     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.


Gruß
Thorsten

Tool_v7.m
 Beschreibung:

Download
 Dateiname:  Tool_v7.m
 Dateigröße:  14.89 KB
 Heruntergeladen:  373 mal
Tool_v7.fig
 Beschreibung:

Download
 Dateiname:  Tool_v7.fig
 Dateigröße:  12.13 KB
 Heruntergeladen:  372 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2012, 13:18     Titel:
  Antworten mit Zitat      
Hallo,

das Problem liegt in Zeile 199
Code:
handles.Wert1 = Wert_1;


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:
Code:
set(handles.Wert1,'String,'');


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T_Meister
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 12.03.2012, 13:28     Titel:
  Antworten mit Zitat      
Hallo Harald,

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
if isnan(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

G
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2012, 14:02     Titel:
  Antworten mit Zitat      
Hallo,

wenn, dann so:

Code:
Wert_1 = str2double(get(hObject,'String'));
% Wenn keine korrekte Eingabe erfolgt ist
if isnan(Wert_1)
    set(hObject,'String','');
    errordlg('Die Eingabe muss eine Zahl sein !', 'Error')
end

Du kannst dir natürlich auch die letzte gültige Eingabe merken und bei falscher Eingabe auf die letzte gültige zurücksetzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T_Meister
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 12.03.2012, 14:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich hab jetzt einfach:

Code:
handles.Wert1 = Wert_1;


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:
Code:
str_2=get(handles.KP_Auswahl_2,'String');
ausgabe_2=str_2{get(handles.KP_Auswahl_2,'value')};
str_1=get(handles.KP_Auswahl_1,'String');
ausgabe_1=str_1{get(handles.KP_Auswahl_1,'value')};

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2012, 16:51     Titel:
  Antworten mit Zitat      
Hallo,

wie wärs damit?
Code:
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


Natürlich darauf achten, dass I und N nicht anderweitig verwendet werden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T_Meister
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 13.03.2012, 10:34     Titel:
  Antworten mit Zitat      
Hallo Harald,

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2012, 10:58     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T_Meister
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 13.03.2012, 11:25     Titel:
  Antworten mit Zitat      
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:

Code:
if     (strcmp(ausgabe_2,''))
        set(handles.KP_Auswahl_2,'');


aber es passiert leider nix. Hättest du dafür auch noch eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2012, 11:36     Titel:
  Antworten mit Zitat      
Hallo,

du vergleichst mit einem leeren Array. Solltest du nicht mit den anderen Vergleichen? Z.B.
Code:
if ismember(Ausgabe{2}, Ausgabe(setdiff(1:N,2)))


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T_Meister
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 85
Anmeldedatum: 14.12.11
Wohnort: BS
Version: 2013a&b, 2014a&b
     Beitrag Verfasst am: 13.03.2012, 12:03     Titel:
  Antworten mit Zitat      
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:

Code:
str_1=get(handles.KP_Auswahl_1,'String');
ausgabe_1=str_1{get(handles.KP_Auswahl_1,'value')};

if (strcmp(ausgabe_1,''))
    set(handles.KP_Auswahl_1,'');
elseif (strcmp(ausgabe_1,'Max. Beschleunigung'))
    set(handles.Aus_Besch,'String',Wert_1);
elseif (strcmp(ausgabe_1,'Regelungsdauer'))
     set(handles.Aus_Dauer,'String',Wert_1);
end


Meinst du also, dass die KP_Auswahl da gar nicht rein gehört, bzw dies nich möglich ist, wegen des Vergleichs mit einem leeren String?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3, 4  Weiter

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