Verfasst am: 27.05.2021, 13:19
Titel: Ergebnis automatisch bei Edit aktualisieren
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))
%Matrizen zum Füllen der Daten
C = [11; 22; 33; 44; 55]
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', [falsefalsefalsetruefalse]);
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?
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 ;)
h00
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.05.2021, 14:32
Titel:
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.
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 ;)
h00
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.05.2021, 15:18
Titel:
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".
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.
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 ;)
h00
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.05.2021, 16:18
Titel:
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.
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.
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
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 ;)
h00
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.05.2021, 17:21
Titel:
Ah ok, super Danke! Jetzt versteh ich den Ablauf des ganzen
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.
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 ;)
h00
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.05.2021, 19:19
Titel:
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', [2525700200], ...
'Data',myData,...
'ColumnEditable', [falsetrue], ...
'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
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.
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 ;)
h00
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.05.2021, 20:12
Titel:
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
Einstellungen und Berechtigungen
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.