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

Zelle in uitable anklicken und im Edit-Fenster anzeigen

 

Krys
Forum-Anfänger

Forum-Anfänger



Beiträge: 33
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2018, 10:11     Titel: Zelle in uitable anklicken und im Edit-Fenster anzeigen
  Antworten mit Zitat      
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 Smile

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 Smile

Schon einmal ein dickes Dankeschön !

Code:
function Kennfeld

data = magic (round(4 + (5-4).*rand(1,1)));         % erstellen eines zufälligen Kennfelds
SizeKf = size(data);                                % ermitteln der Größe des Kennfelds


Kf_x = [150 180 200 250 270 290 310 330 350 370 400 500];           % Größen der x-Achse
Kf_y = [0 100 150 175 200 225 250 275 300 350 450 600];             % Größen der y-Achse


if SizeKf == 5                                          
   
    fig = figure('position',[550 550 400 160]);     % 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',[350 120 40 25],...
                     'string','',...
                     'fontweight','bold');
   
else    
   
    fig = figure('position',[550 550 350 110]);
   
        x = 10;
        y = 10;
        xx = 250;
        yy = 100;
           
        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',[270 80 40 25],...
                      'string','',...
                      'fontweight','bold');

end        
end
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.07.2018, 12:53     Titel: Re: Zelle in uitable anklicken und im Edit-Fenster anzeigen
  Antworten mit Zitat      
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... Smile
Was bedeutet "im Kennfeld markieren"?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 33
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2018, 13:19     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Antwort.

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.

P.S. optimal, optimaler, am optimalsten Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 33
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2018, 13:21     Titel:
  Antworten mit Zitat      
vergessen...

mit "markieren" meine ich folgendes....s. Anhang

Kennfeld_markieren.PNG
 Beschreibung:

Download
 Dateiname:  Kennfeld_markieren.PNG
 Dateigröße:  28.13 KB
 Heruntergeladen:  225 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Krys
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 33
Anmeldedatum: 05.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2018, 07:24     Titel:
  Antworten mit Zitat      
Moin liebes Forum,

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.

LG
Krys


Code:
function Kennfeld

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

assignin ('base','data',data);

Kf_x = [150 180 200 250 270 290 310 330 350 370 400 500];           % Größen der x-Achse
Kf_y = [0 100 150 175 200 225 250 275 300 350 450 600];             % Größen der y-Achse


if SizeKf == 5                                          
   
    fig = figure('position',[550 550 500 160]);     % 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',[450 120 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    vonZ = uicontrol('style','text',...
    'position',[380 113 60 25],...
    'string','von Zeile');

                 
                 
    bisZeile = uicontrol('parent',fig,'Style','edit',...        % erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll      
                     'Position',[450 90 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    bisZ = uicontrol('style','text',...
    'position',[380 86 60 25],...
    'string','bis Zeile');
                 
    vonSpalte = uicontrol('parent',fig,'Style','edit',...        % erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll      
                     'Position',[450 60 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    vonS = uicontrol('style','text',...
    'position',[380 54 60 25],...
    'string','von Spalte');
                 
    bisSpalte = uicontrol('parent',fig,'Style','edit',...        % erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll      
                     'Position',[450 30 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    bisS = uicontrol('style','text',...
    'position',[380 24 60 25],...
    'string','bis Spalte');

else    
   
    fig = figure('position',[550 550 450 110]);
   
        x = 10;
        y = 10;
        xx = 250;
        yy = 100;
           
        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',[false false false],...
                           'Cellselectioncallback',{@select_callback});
                       
                       
    vonZeile = uicontrol('parent',fig,'Style','edit',...        % erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll      
                     'Position',[340 86 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    vonZ = uicontrol('style','text',...
    'position',[280 80 60 25],...
    'string','von Zeile');

                 
                 
    bisZeile = uicontrol('parent',fig,'Style','edit',...        % erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll      
                     'Position',[340 58 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    bisZ = uicontrol('style','text',...
    'position',[280 52 60 25],...
    'string','bis Zeile');
                 
    vonSpalte = uicontrol('parent',fig,'Style','edit',...        % erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll      
                     'Position',[340 30 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    vonS = uicontrol('style','text',...
    'position',[280 26 60 25],...
    'string','von Spalte');
                 
    bisSpalte = uicontrol('parent',fig,'Style','edit',...        % erstellen des Edit-Fensters, in das der angeklickte Wert geladen werden soll      
                     'Position',[340 2 40 25],...
                     'string','',...
                     'fontweight','bold');
                 
    bisS = uicontrol('style','text',...
    'position',[280 0 60 25],...
    'string','bis Spalte');

end        


      function select_callback(hObject, eventdata)
     
        S.sel = eventdata.Indices;    
        %assignin ('base','sel',S.sel);
       
        selcols = unique(S.sel(:,2));  
        table = hObject.Data;
       
        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
     
        end
       
        set(vonZeile, 'string', S.sel(1,1));
        set(bisZeile, 'string', S.sel(end,1));
        set(vonSpalte, 'string', S.sel(1,2));
        set(bisSpalte, 'string', S.sel(end,2));
       
        end
    end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.07.2018, 14:48     Titel:
  Antworten mit Zitat      
Hallo Krys,

Prima - Danke!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
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.