Verfasst am: 25.07.2018, 10:11
Titel: Zelle in uitable anklicken und im Edit-Fenster anzeigen
Hallo liebe Matlabianer,
ich habe ein Problem, das ich leider alleine nicht lösen konnte. Ich habe versucht mich im Forum und im Internet schlau zu machen aber leider konnte ich nichts finden, was mir weiterhelfen konnte. Ich hoffe, dass ich nicht zu doof für eine vernünftige Recherche bin.
Ich versuche euch mal mein Problem ausführlich zu erläutern.
Da ich ein sehr sehr langes Skript geschrieben habe, werde ich es an dieser Stelle nicht zeigen sondern versuchen das Problem anhand eines von mir erstellten Beispiels erklären.
In einer GUI erstelle ich mittels
uitable
eine Tabelle, in die ein Kennfeld geladen wird. Nun möchte ich eine Zelle im Kennfeld anklicken und den Wert der Zelle in einem Edit-Fenster anzeigen lassen. Optimal wäre es, wenn ich in einem weiteren Fenster anzeigen lassen könnte wo die Zelle sich befindet. Also in welcher Spalte und welcher Zeile. Ich hatte einige ähnliche Probleme im Internet gefunden, die dann anscheinend mit mehreren functions gelöst worden sind. Bei mir kommt das Problem hinzu, dass die Tabelle sich in Abhängigkeit zum Kennfeld ändern soll. D.h. also, dass die Tabelle in einer if-Bedingung erstellt wird und das arbeiten mit
function
nicht möglich ist bzw. komplizierter ist.
Ob der Code effizient oder sinnvoll ist, soll hier erst mal unwichtig sein. In meinem Beispiel-Code macht die gewünschte Funktion vielleicht wenig Sinn aber in meinem Programm brauche ich das.
Nun weiß ich nicht, ob das überhaupt möglich ist. Mich würde dies allerdings wundern. Im Forum hatte ich mal einen Moderator schreiben sehen, dass alles möglich ist, wenn man es richtig programmiert
Noch optimaler wäre es, wenn ich einen Bereich im Kennfeld markieren könnte, und mir dann in einem Fenster angezeigt wird wo sich der markierte Bereich befindet.
D.h. von Zeile x bis Zeile y und von Spalte a bis Spalte b. Dementsprechend würde es dann vier Fenster geben. Allerdings könnte ich mir vorstellen, dass Matlab hier auch wirklich an seine Grenzen stößt und das zu viel verlangt ist.
Ich hoffe, dass ich mich verständlich genug ausgedrückt habe
fig = figure('position',[550550400160]); % erstellen der figure
x = 40; % Position und Größe der Tabelle definieren (soll abhängig von der Größe des Kennfelds sein)
y = 30;
xx = 300;
yy = 120;
S.table = uitable('parent',fig,'data',data,...% erstellen der Tabelle
'ColumnWidth',{50},...
'position',[x y xx yy],...
'ColumnName',{Kf_x(1,1),Kf_x(1,2),Kf_x(1,3),Kf_x(1,4),Kf_x(1,5)},...
'RowName',{Kf_y(1,1),Kf_y(1,2),Kf_y(1,3),Kf_y(1,4),Kf_y(1,5)});
val = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[3501204025],...
'string','',...
'fontweight','bold');
S.table = uitable('parent',fig,'data',data,...
'ColumnWidth',{50},...
'position',[x y xx yy],...
'ColumnName',{Kf_x(1,1),Kf_x(1,2),Kf_x(1,3),Kf_x(1,4)},...
'RowName',{Kf_y(1,1),Kf_y(1,2),Kf_y(1,3),Kf_y(1,4)});
val = uicontrol('parent',fig,'Style','edit',...
'Position',[270804025],...
'string','',...
'fontweight','bold');
Verfasst am: 25.07.2018, 12:53
Titel: Re: Zelle in uitable anklicken und im Edit-Fenster anzeigen
Hallo Krys,
Wieso kannst Du nicht direkt das
uitable
Objekt benutzen? Da hast Du doch eine Möglichkeit zu editieren und siehst auf Anhieb, wo die Zelle positioniert ist.
Weitere Fenster zu öffnen klingt sehr unübersichtlich - kennst Du ein anderes leicht bedienbaren Programm, das so etwas macht?
Zitat:
Noch optimaler wäre es, wenn ich einen Bereich im Kennfeld markieren könnte,
"Optimaler" als optimal? Sachen gibt's...
Was bedeutet "im Kennfeld markieren"?
Ja ich weiß, dass ich auf Anhieb sehe, wo die Zelle positioniert ist. Allerdings habe ich einen Optimierer gebastelt, der die Werte im gewählten Bereich optimieren soll. Ich möchte dem Optimierer nicht händisch vorgeben, welchen Bereich im Kennfeld er optimieren soll. Dies ist nämlich aktuell der Fall.
Und "Fenster" war das falsche Wort. Ich meinte ein Edit-Feld.
Primär möchte ich, dass der Wert einer angeklickten Zelle als Variable abgespeichert wird. Zusätzlich wäre es schön, die Position der Zelle zu erhalten und diese als Variable zu hinterlegen.
nach viiiiel Recherche und vielen verbrannten Hirnzellen bin ich zum gewünschten Ergebnis gekommen. Da ich nicht immer nur "nehmen" möchte, will ich gerne auch mal etwas "geben" und den Code mit euch teilen.
Wie gesagt ist der Code nur ein Beispielcode, so dass die GUI nicht tip top aussieht.
data = magic(round(4 + (5-4).*rand(1,1))); % erstellen eines zufälligen Kennfelds der Größe 5x5 oder 4x4
SizeKf = size(data); % ermitteln der Größe des Kennfelds
fig = figure('position',[550550500160]); % erstellen der figure
x = 40; % Position und Größe der Tabelle definieren (soll abhängig von der Größe des Kennfelds sein)
y = 30;
xx = 300;
yy = 120;
S.table = uitable('parent',fig,'data',data,...% erstellen der Tabelle
'ColumnWidth',{50},...
'position',[x y xx yy],...
'ColumnName',{Kf_x(1,1),Kf_x(1,2),Kf_x(1,3),Kf_x(1,4),Kf_x(1,5)},...
'RowName',{Kf_y(1,1),Kf_y(1,2),Kf_y(1,3),Kf_y(1,4),Kf_y(1,5)},...
'CellSelectionCallback',{@select_callback});
vonZeile = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[4501204025],...
'string','',...
'fontweight','bold');
bisZeile = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[450904025],...
'string','',...
'fontweight','bold');
vonSpalte = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[450604025],...
'string','',...
'fontweight','bold');
bisSpalte = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[450304025],...
'string','',...
'fontweight','bold');
bisS = uicontrol('style','text',...
'position',[380246025],...
'string','bis Spalte');
S.table = uitable('parent',fig,'data',data,...
'ColumnWidth',{50},...
'position',[x y xx yy],...
'ColumnName',{Kf_x(1,1),Kf_x(1,2),Kf_x(1,3),Kf_x(1,4)},...
'RowName',{Kf_y(1,1),Kf_y(1,2),Kf_y(1,3),Kf_y(1,4)},...
'ColumnFormat', {'numeric', 'numeric', 'numeric'},...
'ColumnEditable',[falsefalsefalse],...
'Cellselectioncallback',{@select_callback});
vonZeile = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[340864025],...
'string','',...
'fontweight','bold');
bisZeile = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[340584025],...
'string','',...
'fontweight','bold');
vonSpalte = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[340304025],...
'string','',...
'fontweight','bold');
bisSpalte = uicontrol('parent',fig,'Style','edit',...% erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll
'Position',[34024025],...
'string','',...
'fontweight','bold');
bisS = uicontrol('style','text',...
'position',[28006025],...
'string','bis Spalte');
for idx = 1:numel(selcols)
col = selcols(idx);
xvals = S.sel(:,1); % Angabe der Zeile
xvals(S.sel(:,2) ~= col) = [];
yvals = table(xvals, col)'; % Angabe des Wertes in der Zelle
zvals = col*ones(size(xvals)); % Angabe der Spalte
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.