Verfasst am: 06.04.2021, 09:30
Titel: Mit set Werte setzten
Moin zusammen,
ich meinem Programm im Anhang erzeuge ich mit einer Schleife ein Panel in dem sich Eingabefelder und Dropdownmenüs befinden. Jedes mal, wenn ich die Anzahl der Panels ändere werden alle vorhandenen Panels gelöscht und neue erzeugt. Ich möchte mir die vorher händisch eingetragenen Werte zwischenspeichern und nach der Erzeugung der neuen Panels wieder einfügen. Dafür habe ich mir erstmal für ein Eingabefeld das hier programmiert:
Code:
function Material_FieldValueChanged(app)
value = app.Spinner.Value;
v = 1:value;
app.Material_Field_Zwischenspeicher.Value = get(app.Material_Field(v),'Value');
Die Werte werden aus den Eingabefeldern ausgelesen und dann in ein n x 1 Array gespeichert. Ich habe mir überlegt, dass in die Schleife, also da wo die Eingabefelder erzeugt werden, ein set Befehl stehen müsste der die Werte aus dem Zwischenspeicher in die erzeugten Eingabefelder schreibt. Ich weiß allerdings nicht wie ich den set Befehl aufbauen muss. Kann mir da jemand helfen oder gibt es da vielleicht sogar eine einfachere Methode?
Viele Grüße
Fabian
Hier nur ein kleiner Ausschnitt aus dem Programm:
Code:
function drei(app)
value = app.Spinner.Value;
delete(app.Messung_Panel)
app.Messung_Panel = [];
for v = 1:value
Pos = circshift(app.Messung_Pos,value);
app.Messung1_Panel.Position = [0160*v+534855];
app.Material_Label(v) = uilabel('Parent',app.Messung_Panel(v),'Position',[31,95,170,25],'Text','Materialdicke','FontSize',15,'HorizontalAlignment','right');
app.Material_Field(v) = uieditfield('numeric','Parent',app.Messung_Panel(v),'Position',[206956525],'FontSize',15,'ValueChangedFcn',@(Material_Field,event)
Material_FieldValueChanged(app));%,'Limits',[1Inf]
app.Material_DropDown(v) = uidropdown('Parent',app.Messung_Panel(v),'Position',[271956525],'FontSize',15,'Items',{'µm','mm','cm'});%,'Value','mm'
end end
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
dann wie immer: debuggen und app.Material_Field_Zwischenspeicher bzw. app.Material_Field_Zwischenspeicher.Value ansehen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
debuggen und app.Material_Field_Zwischenspeicher bzw. app.Material_Field_Zwischenspeicher.Value ansehen.
Wenn ich mit dem App Designer in der Zeile einen Breakpoint setzte und dann einen Step weiter gehe öffnet sich "AppManagementService.m" Damit kann ich aber gar nicht anfangen. Der Pfeil steht auf Zeile 367 und das folgende steht da:
Code:
catch exception
% Query app's fullfilename from the map of fullfilename to % the running app within the service object
appFullFileName = obj.getAppFullFileName(app);
if(obj.isBadNumberOfArguments(app, exception)) % check if the startup function is being executed with too % many or too few arguments and rethrow that error with an % additional cause % remove the app so the figure will not remain open delete(app);
else if ~isvalid(app) % If app is not valid, which is a very subtle case, % that the user could put a break point on the code, % and when hitting, the user closes the running % app manually, and then continue debugging. [appFullFileName, ~] = which(class(app));
callbackException = appdesigner.internal.appalert.TrimmedException(exception);
else % When startup method called in app's constructor has a % non-syntax parsing error, for example, reference a % undefined variable: disp(undefinedVariable), the app will % still be created, but not populated, so put the app into % exception to let the caller get it
callbackException = appdesigner.internal.appalert.CallbackException(exception, app);
end end
% Fire callback errored event to notify clients
obj.fireCallbackErroredEvent(callbackException, appFullFileName);
du brauchst ja gar keinen Step weiter zu gehen, sondern in dem Moment dir die Inhalte der Variablen anschauen. Vielleicht hilft es, das in zwei Schritte aufzuspalten:
Code:
Wert = ...% Auslesen des Zwischenspeichers an Stelle v
app.Material_Field(v) = uieditfield('numeric','Value', Wert, 'Parent',app.Messung_Panel(v),'Position',[206956525],'FontSize',15,'ValueChangedFcn',@(Material_Field,event)
Material_FieldValueChanged(app));%,'Limits',[1Inf]
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
dann wirst du zuvor nichts dort abgespeichert haben.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Ok, wenn ich den Zwischenspeicher zu erst in der for Schleife beschreibe bekomme ich keine Fehlermeldung mehr.
Dann habe ich ja aber jedes Mal wenn ich den Wert im Spinner ändere auch wieder die 1 in meinem Zwischenspeicher. Ich möchte ja aber nur wenn der Zwischenspeicher leer ist eine 1 rein schreiben sonst soll der Wert aus dem Zwischenspeicher genommen werden.
Kann mir da die eine if Bedingung und isempty helfen? Wenn ich das so schreibe bekomme ich in der Zeile mit if aber auch den Fehler "Dot indexing is not supported for variables of this type." angezeigt und "app.Material_Field_Zwischenspeicher.Value(v)" steht auch wieder empty 0x0 double drin.
Code:
ifisempty(app.Material_Field_Zwischenspeicher.Value(v))
app.Material_Field_Zwischenspeicher.Value(v) = 1;
end
Wert = app.Material_Field_Zwischenspeicher.Value(v);
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Moin, danke. Das klappt jetzt schonmal wenn ich eine 1 im Spinner stehen habe aber sobald ich 2 oder höher eintrage bekomme ich folgenden Fehler: "Index exceeds the number of array elements (1)." und zwar in der Zeile in der ich Wert setzte.
Code:
ifisempty(app.Material_Field_Zwischenspeicher)
app.Material_Field_Zwischenspeicher.Value(v) = 1;
end
Wert = app.Material_Field_Zwischenspeicher.Value(v);
der Vorschlag war, eine for-Schleife in die if-Abfrage zu schreiben.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
ifisempty(app.Material_Field_Zwischenspeicher) for v = 1:value
app.Material_Field_Zwischenspeicher.Value(v) = 1;
end end
Wert = app.Material_Field_Zwischenspeicher.Value(v);
du verwendest anscheinend in zwei geschachtelten for-Schleifen den selben Schleifenindex v. Das ist keine gute Idee.
Auch sollte sich das vereinfachen lassen:
Code:
ifisempty(app.Material_Field_Zwischenspeicher)
app.Material_Field_Zwischenspeicher.Value = ones(1, 20); % max. Anzahl Spinner end
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.