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

Ergebnis automatisch bei Edit aktualisieren

 

h00

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2021, 14:19     Titel: Ergebnis automatisch bei Edit aktualisieren
  Antworten mit Zitat      
Guten Tag,

bin blutiger Anfänger und versuch mal mein Problem so gut es geht zu beschreiben:

Ich habe in meinem GUI eine 5x5 Tabelle. Beim Klick auf einen Button werden Spalte 1-3 über Matrizen mit Werten gefüllt in Spalte 4 soll ein Wert eingegeben werden und in Spalte 5 die Abweichung zu dem Wert in Spalte 3 berechnet werden.

Alles kein Problem, solange ich Werte für Spalte 3 vorgebe, allerdings möchte ich in Spalte 4 Werte editieren können und Spalte 5 rechnet automatisch mit den editierten Werten aus Spalte 4. (Wie in Excel: A5=(A4-A3)/A3*100))

Meine ersten Gehversuche dazu sehen so aus:

Code:
f = figure;
   
%Matrizen zum Füllen der Daten
C = [1 1; 2 2; 3 3; 4 4; 5 5]
phi = [21; 22; 23; 24; 25]
Abgelesen=[0; 0; 0; 0; 0]; %hier wie gesagt vorgegeben, sollen aber die Daten aus der editierten Spalte sein
Abweichung=((Abgelesen-phi)./phi)*100;

%daten für die Tabelle
d = [C phi Abgelesen Abweichung];

%Tabelle
t = uitable(f,'Data',d,'ColumnWidth',{50},...
    'ColumnEditable', [false false false true false]);
set(t, 'CellEditCallback', 'get(t,''Data'')');
 


Wie bekomme ich es nun hin, dass wenn ich einen Wert in Spalte 4 editiere, ENTER drücke, sich das Ergebnis in Zeile 5 aktualisiert? Im Prinzip müsste ja die Matrix Abgelesen geupdated und direkt neu eingelesen werden oder irgendwie so? Very Happy

Ich hoffe man versteht was ich meine.

Mit freundlichen Grüßen

h00


Harald
Forum-Meister

Forum-Meister


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

du müsstest eine Funktion schreiben, in der du das umsetzt, und diese als CellEditCallback angeben.
Ich frage mich aber, wieso du dir als Anfänger das befehlsorientierte Erstellen einer Oberfläche antust. Mit App Designer ist das deutlich einfacher.

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
 
h00

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2021, 15:32     Titel:
  Antworten mit Zitat      
Hallo,

Das ganze ist eben für ein Projekt für die UNI und ich hab mich mit Tutorials eben so durchgewurschtelt. Habe auch gelesen, dass es mit AppDesigner einfacher ist, allerdings bin ich jetzt soweit gekommen, dass mein Projekt fertig ist, abgesehen von dieser Funktion.

Was meinst du denn mit "das" umsetzten in meiner Funktion? worauf bezieht sich das? Soll diese Funktion die Berechnung durchführen oder das speichern der neu eingegeben Daten?

Tut mir leid ich weiß absolut nicht wie ich das umsetze.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.05.2021, 15:46     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ich hab mich mit Tutorials eben so durchgewurschtelt.

Leider sind solche "Tutorials" oftmals weit weg vom empfohlenen Weg, etwas zu tun. Meine Empfehlung wäre, beim nächsten Projekt erst zu schauen, was der beste Weg ist und dann für die Umsetzung nach Tutorials o.ä. suchen.

das = alles, was im Callback passieren soll:
1. Auslesen des aktuellen Werts (machst du ja schon)
2. Daraus den Wert der nächsten Spalte berechnen
3. Den Wert in die Spalte schreiben.

Zitat:
Habe auch gelesen, dass es mit AppDesigner einfacher ist,

Jep, und auch für App Designer gibt es Tutorials - eines ist sogar im App Designer integriert.

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
 
h00

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2021, 16:18     Titel:
  Antworten mit Zitat      
Ok, ich habe das ganze mal versucht:

Mein Problem ist natürlich, dass ich absolut keine Ahnung (von Notationen etc. z.B.) habe.

Wenn ich so das Programm laufen lasse und einen Wert ändere, speichert er diese neue Matrix der gesamten Tabelle im Workspace in "ans", wenn ich meine Funktion aber benutzen will, sagt er mir unbekannte Variable "ans".


Code:
f = figure;
   
%Matrizen zum Füllen der Daten
C = [1 1; 2 2; 3 3; 4 4; 5 5]
phi = [21; 22; 23; 24; 25]
Abgelesen=[0; 0; 0; 0; 0];
Abweichung=((Abgelesen-phi)./phi)*100;

%daten für die Tabelle
d = [C phi Abgelesen Abweichung];

%Tabelle
t = uitable(f,'Data',d,'ColumnWidth',{50},...
    'ColumnEditable', [false false false true false]);

set(t, 'CellEditCallback', 'get(t,''Data'')');

%set(t, 'CellEditCallback', @funktionX);

function funktionX(~,~)

Abweichung=((ans-phi)./phi)*100;

set(t, 'CellEditCallback', 'd = get(t,''Data'')');

end
 
Harald
Forum-Meister

Forum-Meister


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

es gibt nur einen Callback. In dem solltest du die zur Verfügung gestellte Information nicht ignorieren, weil du sonst nicht weißt, in welcher Zelle welcher Wert eingetragen wurde.

In der Hilfe findest du ein schönes Beispiel
https://de.mathworks.com/help/matla.....uiu91u-1-CellEditCallback
("Example: Evaluate User Input")
Statt eval würde ich aber str2double empfehlen.

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
 
h00

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2021, 17:18     Titel:
  Antworten mit Zitat      
Das Beispiel bzw. die Hilfe-Datei kenn ich, allerdings hilft mir das nicht weiter. Dort wird ja eine Rechnung evauliert die man in die Zelle eingibt. Ich möchte aber einen Wert ändern, der in einer anderen Zelle zur Berechnung genutzt wird, eben genau wie in Excel:

A5=(A4-A3)/A3*100) , wobei A3 die Zelle ist, wo man den Wert ändert.

Ich weiß einfach nicht, wie ich in meiner Callbackfunktion schreibe, dass er sich die editierten Werte nimmt und damit die Berechnung in der anderen Zelle ausführt.
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
allerdings hilft mir das nicht weiter.

Natürlich hilft das weiter.

Zitat:
Dort wird ja eine Rechnung evauliert die man in die Zelle eingibt. Ich möchte aber einen Wert ändern, der in einer anderen Zelle zur Berechnung genutzt wird, eben genau wie in Excel:

A5=(A4-A3)/A3*100) , wobei A3 die Zelle ist, wo man den Wert ändert.

Na, dann musst du halt die eine Zeile im Beispiel anpassen.

Code:
set(t, 'CellEditCallback', @converttonum);

function converttonum(hObject,callbackdata)
    numval = str2double(callbackdata.EditData);
    r = callbackdata.Indices(1);
    c = callbackdata.Indices(2);
    hObject.Data(r,c+1) = (numval - hObject.Data(r,c-1))./hObject.Data(r,c-1)*100;
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
 
h00

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2021, 18:21     Titel:
  Antworten mit Zitat      
Ah ok, super Danke! Jetzt versteh ich den Ablauf des ganzen Very Happy

Bekomme allerdings jetzt den Error:

"Operator '-' is not supported for operands of type 'cell'."

habe ein wenig mit cell2num rumprobiert, allerdings wollte das nicht ganz klappen.

Intuitiv hätte ich jetzt gesagt, hObject.Data ist hier das Problem.
 
Harald
Forum-Meister

Forum-Meister


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

in dem kleinen Beispiel funktioniert es ja.

Die Frage ist also, was an deinem wirklichen Beispiel anders ist. Meine Vermutung (und mehr ist es mangels Informationen nicht) wäre, dass du z.B. gemischte Daten hast und hObject.Data daher ein Cell Array ist. Dann müsstest du { } statt ( ) zur Indizierung in hObject.Data verwenden.

Sollte das nicht weiterhelfen, bitte ein reproduzierbares Beispiel zur Verfügung stellen, in dem das Problem auftritt.

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
 
h00

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2021, 20:19     Titel:
  Antworten mit Zitat      
Hallo,

ich habe zu Textzwecken genau das Beispiel genommen und es um die von dir vorgeschlagene Berechnung erweitert. Konkret also:

Code:
function myui
    f = figure;
    myData = { 'A '  31; 'B'  41; 'C'  5; 'D' 2.6};
    t = uitable('Parent',f,...
                'Position', [25 25 700 200], ...
                'Data',myData,...
                'ColumnEditable', [false true], ...
                'CellEditCallback',@converttonum);
        function converttonum(hObject,callbackdata)
             numval = str2double(callbackdata.EditData);
             r = callbackdata.Indices(1)
             c = callbackdata.Indices(2)
             hObject.Data(r,c+1) = (numval - hObject.Data(r,c-1))./hObject.Data(r,c-1)*100;
        end
end


Sowohl wenn ich () als auch {} verwende, kommt genannter Error. Nutze R2021a falls das wichtig ist, sollte es ja aber nicht.
 
Harald
Forum-Meister

Forum-Meister


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

in dem Beispiel ist das aber ja nicht sinnvoll, weil du links neben der editierbaren Spalte eine numerische Spalte und rechts daneben eine weitere Spalte brauchst.

Mit
Code:
hObject.Data{r,c+1} = (numval - hObject.Data{r,c-1})./hObject.Data{r,c-1}*100;
 

bekomme ich keine Fehlermeldung, aber auch kein wirklich sinnvolles Verhalten. Das ist aber meines Erachtens auch nicht zu erwarten - siehe oben.

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
 
h00

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2021, 21:12     Titel:
  Antworten mit Zitat      
Hallo,

an einem neuen Tag hat es dann auf einmal funktioniert. Konnte das Beispiel auch erfolgreich für meinen Fall in mein Programm übertragen und alles funktioniert prima.

Vielen herzlichen Dank

mit freundlichen Grüßen

h00
 
Neues Thema eröffnen Neue Antwort erstellen



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.