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

Mit set Werte setzten

 

BlackDice
Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 06.04.2021, 10:30     Titel: Mit set Werte setzten
  Antworten mit Zitat      
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');
           
        end


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 = [0 160*v+5 348 55];
                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',[206 95 65 25],'FontSize',15,'ValueChangedFcn',@(Material_Field,event)
                                                   Material_FieldValueChanged(app));%,'Limits',[1 Inf]
 
                app.Material_DropDown(v) = uidropdown('Parent',app.Messung_Panel(v),'Position',[271 95 65 25],'FontSize',15,'Items',{'µm','mm','cm'});%,'Value','mm'
           end
        end


Spin.zip
 Beschreibung:

Download
 Dateiname:  Spin.zip
 Dateigröße:  52.51 KB
 Heruntergeladen:  143 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

du solltest doch gar kein set brauchen? Es sollte reichen zu schreiben

app.Material_Field(v) = uieditfield('numeric','Value', app.Material_Field_Zwischenspeicher.Value(v), 'Parent',app.Messung_Panel(v),'Position',[206 95 65 25],'FontSize',15,'ValueChangedFcn',@(Material_Field,event)
Material_FieldValueChanged(app));%,'Limits',[1 Inf]

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 06.04.2021, 17:35     Titel:
  Antworten mit Zitat      
Moin,

wenn ich das so schreibe:
Harald hat Folgendes geschrieben:

app.Material_Field(v) = uieditfield('numeric','Value', app.Material_Field_Zwischenspeicher.Value(v), 'Parent',app.Messung_Panel(v),'Position',[206 95 65 25],'FontSize',15,'ValueChangedFcn',@(Material_Field,event)
Material_FieldValueChanged(app));%,'Limits',[1 Inf]


Bekomme ich folgenden Fehler in dieser Zeile angezeigt:
Dot indexing is not supported for variables of this type.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.04.2021, 17:57     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 06.04.2021, 20:07     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
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);

                    if (strcmp(exception.identifier, 'MATLAB:minrhs'))
                        newException = MException(message('MATLAB:appdesigner:appdesigner:TooFewAppArgumentsError'));
                        newException = newException.addCause(appdesigner.internal.appalert.TrimmedException(exception));
                        callbackException = appdesigner.internal.appalert.TrimmedException(newException);
                    else
                        callbackException = appdesigner.internal.appalert.AppArgumentException(exception);
                    end

                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);

                throw(callbackException);
            end
        end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.04.2021, 20:24     Titel:
  Antworten mit Zitat      
Hallo,

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',[206 95 65 25],'FontSize',15,'ValueChangedFcn',@(Material_Field,event)
Material_FieldValueChanged(app));%,'Limits',[1 Inf]


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 06.04.2021, 20:37     Titel:
  Antworten mit Zitat      
Ok, danke. Also das steht in Wert "app.Material_Field_Zwischenspeicher: empty 0x0 double"

Da habe ich auch den Breakpoint gesetzt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.04.2021, 20:41     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 06.04.2021, 21:18     Titel:
  Antworten mit Zitat      
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:
               if isempty(app.Material_Field_Zwischenspeicher.Value(v))
                    app.Material_Field_Zwischenspeicher.Value(v) = 1;
                end
                Wert = app.Material_Field_Zwischenspeicher.Value(v);

                app.Material_Field(v) = uieditfield('numeric','Value',Wert,'Parent',app.Messung_Panel(v),'Position',[206 95 65 25],'FontSize',15,'ValueChangedFcn',@(Material_Field,event) Material_FieldValueChanged(app));%,'Limits',[1 Inf]
               
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.04.2021, 22:35     Titel:
  Antworten mit Zitat      
Hallo,

wie wäre es damit:
Code:
if isempty(app.Material_Field_Zwischenspeicher)
for v = ...
    app.Material_Field_Zwischenspeicher.Value(v) = 1;
end


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 06.04.2021, 22:56     Titel:
  Antworten mit Zitat      
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:
               if isempty(app.Material_Field_Zwischenspeicher)
                    app.Material_Field_Zwischenspeicher.Value(v) = 1;
                end
                Wert = app.Material_Field_Zwischenspeicher.Value(v);

                app.Material_Field(v) = uieditfield('numeric','Value',Wert,'Parent',app.Messung_Panel(v),'Position',[206 95 65 25],'FontSize',15,'ValueChangedFcn',@(Material_Field,event) Material_FieldValueChanged(app));%,'Limits',[1 Inf]
         



In den einzelnen Variablen steht:
Code:

Wert: 1x1 double = 1
app.Material_Field_Zwischenspeicher: struct with fields: Value: 1
app.Material_Field_Zwischenspeicher.Value: 1x1 double = 1
v: 1x1 double = 2
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.04.2021, 23:05     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 07.04.2021, 08:29     Titel:
  Antworten mit Zitat      
Moin, ich hab das jetzt so gemacht:
Code:
               if isempty(app.Material_Field_Zwischenspeicher)
                    for v = 1:value
                        app.Material_Field_Zwischenspeicher.Value(v) = 1;
                    end
                end
                Wert = app.Material_Field_Zwischenspeicher.Value(v);

                app.Material_Field(v) = uieditfield('numeric','Value',Wert,'Parent',app.Messung_Panel(v),'Position',[206 95 65 25],'FontSize',15,'ValueChangedFcn',@(Material_Field,event) Material_FieldValueChanged(app));%,'Limits',[1 Inf]
               


Aber auch da bekomme ich in der Zeile in der Wert gesetzt wird "Index exceeds the number of array elements (1).".

In den Variablen steht:
Code:
Wert: 1x1 double = 1
app.Material_Field_Zwischenspeicher: struct with fields: Value: 1
app.Material_Field_Zwischenspeicher.Value: 1x1 double = 1
v: 1x1 double = 2
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.04.2021, 08:44     Titel:
  Antworten mit Zitat      
Hallo,

du verwendest anscheinend in zwei geschachtelten for-Schleifen den selben Schleifenindex v. Das ist keine gute Idee.
Auch sollte sich das vereinfachen lassen:
Code:
              if isempty(app.Material_Field_Zwischenspeicher)
                     app.Material_Field_Zwischenspeicher.Value = ones(1, 20); % max. Anzahl Spinner
               end


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
BlackDice
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 08.12.20
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 07.04.2021, 09:55     Titel:
  Antworten mit Zitat      
Perfekt, das klappt schonmal ganz gut.

Wie kann ich ein Array anstatt mit Zahlen mit 'mm' füllen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  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 - 2024 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.