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

UITable callback in anderer Funktion aufrufen

 

Krokodil
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 27.01.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 27.01.2013, 15:25     Titel: UITable callback in anderer Funktion aufrufen
  Antworten mit Zitat      
Hallo Leute,
ich möchte meine UITable mittel eines Refresh Button aktualisieren.

Ich rufe in meinen Refresh Callback die UITable Createfcn folgendermaßen auf:

uitable1_CreateFcn(hObject, eventdata, handles)

dies Produziert folgenden Fehler:

??? Error using ==> set
There is no 'Data' property in the
'uicontrol' class.

Error in ==>
Schneckenzonen>uitable1_CreateFcn at
562
set(hObject,'Data',Data, 'ColumnName',
colnames); %Data in Tabelle anzeigen


Hat jemand dafür eine passende Lösung?
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: 28.01.2013, 10:29     Titel: Re: UITable callback in anderer Funktion aufrufen
  Antworten mit Zitat      
Hallo Krokodil,

Offensichtlich ist "hObject" in diesem Callback nicht der Handle der UITABLE, sondern der eines UICONTROLs. Du kannst wahrscheinlich per "handles = guidata(hObejct)" einen handels Struct erhalten, der den gewünschten Handle enthält.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 27.01.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 30.03.2013, 17:20     Titel:
  Antworten mit Zitat      
Verstehe ich leider nicht ganz.
Muss ich in dem Callback, welchen ich aufrufen will etwas ändern oder an der Stelle, bevor ich ihn Aufrufe?
Kann mir jemand ein konkretes Beispiel geben?
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: 01.04.2013, 10:31     Titel:
  Antworten mit Zitat      
Hallo Krokodil,

Ich rate mal, und mehr ist nicht möglich solange Du nicht den entsprechen Code zeigst, dass es nich am Callback liegt, sondern an einem fehlerhaften Aufruf desselben. Die Fehlermeldung sagt, wie ich schon geschrieben hatte, dass das Objekt mit dem Handle "hObject" keine Eigenschaft "Data" hat. Dann ist es höchstwahrscheinlich der Handle der "Refresh"-Buttons. Erwartet wird aber der Handle des UITABLE-Objektes. Du möchtest ja die UITABLE ändern, und nicht den Button selbst.

Ein konkretes Beispiel zu geben ist enorm aufwändig, weil wir keine Ahnung haben können, was Du genau suchst. Wenn es Dir immer noch nicht weiter hilft, wäre es sinnvoll, wenn Du ein konkretes Beispiel gibst.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 27.01.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 01.04.2013, 11:50     Titel:
  Antworten mit Zitat      
Also der Callback, auf den ich zugreifen möchte:

Code:
function uitable1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to uitable1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
Zonen=getappdata(0,'Zonen');
S=getappdata(0,'SG');
for i=1:length(Zonen)   %Daten aus jeder Zone in Data speichern
    posstr=num2str(i);
    zn=strcat('Zone',posstr);   %Positionsnnummer in Zonennummer umwandeln
    Data(1,i)=S.(zn).LD.w/S.(zn).LD.f;
        s=char(Zonen(i));
        switch s
            case 'Feststofffoerderzone'
                Data(2,i)=S.(zn).h_0.w/S.(zn).h_0.f;
                Data(3,i)=S.(zn).h_0.w/S.(zn).h_0.f;
                Data(4,i)=S.(zn).tD.w/S.(zn).tD.f;
                Data(5,i)=S.(zn).e.w/S.(zn).e.f;
            case 'Meteringzone'
                Data(2,i)=S.(zn).h_0.w/S.(zn).h_0.f;
                Data(3,i)=S.(zn).h_0.w/S.(zn).h_0.f;
                Data(4,i)=S.(zn).tD.w/S.(zn).tD.f;
                Data(5,i)=S.(zn).e.w/S.(zn).e.f;
            case 'Sonderzone'
                Data(2,i)=0;
                Data(3,i)=0;
                Data(4,i)=0;
                Data(5,i)=0;
            otherwise
                Data(2,i)=S.(zn).h_0.w/S.(zn).h_0.f;
                Data(3,i)=S.(zn).h_1.w/S.(zn).h_1.f;
                Data(4,i)=S.(zn).tD.w/S.(zn).tD.f;
                Data(5,i)=S.(zn).e.w/S.(zn).e.f;
            end
   
   
    colnames(1,i)=Zonen(i);
end

set(hObject,'Data',Data, 'ColumnName', colnames);   %Data in Tabelle anzeigen

Hiermit wollte ich ihn aufrufen:

function pushbutton_refresh_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_refresh (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

uitable1_CreateFcn(hObject, eventdata, handles);

S = getappdata(0,'SG');
axes1_CreateFcn(hObject, eventdata, handles);
list_entries = get(handles.listbox_istzonen,'String');  %String vorhandener Zonen auslesen
L=0;
for i=1:length(list_entries)                            %Zonenlänge aller Zonen auslesen
    z=strcat('Zone',num2str(i));
    if isfield (S,(z));
        if isfield (S.(z),'L')
            if isfield (S.(z).L,'w')
                L=L+S.(z).L.w/S.(z).L.f;                %Zonenlänge aufaddieren        
            end  
        end
    end
end
guidata(hObject,handles); %handles aktualisieren
set(handles.edit_Lges,'String',L); %Gesamtlänge in Lges anzeigen


[EDITED, Jan, Bitte Code-Umgebung benutzen - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Krokodil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 27.01.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 02.04.2013, 16:05     Titel:
  Antworten mit Zitat      
Btw würde es mir auch völlig ausreichen, wenn es einen Befehl gibt, welcher die M File schließt und neu startet, damit würde meine Creatfcn ja ordnungsgemäß Aufgerufen werden
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich würde nicht die CreateFcn zur Initialisierung nutzen, sondern die OpeningFcn.

Wenn du das so lassen willst: Wie Jan schon angedeutet hat, liegt das Problem in hObject, das ja immer ein Handle auf das Objekt ist, das das Ereignis auslöst. D.h. einmal auf den table, einmal auf den Pushbutton.
Wenn du, wie ich vermute, in
Code:
set(hObject,'Data',Data,...

immer den Table ansprechen willst, dann könntest du den Callback wohl so aufrufen:
Code:
uitable1_CreateFcn(handles.uitable1, eventdata, handles);

Das gefällt mir allerdings nicht wirklich.

Ich fände es wie gesagt besser, die OpeningFcn zu nutzen. Alternativ den Code in der CreateFcn in eine andere Funktion auslagern, und diese mit hObject bzw. handles.uitable1 aufrufen.

GUI schließen: delete(handles.figure1)
GUI wieder öffnen: <Name der GUI>
Das fände ich allerdings einen noch unschöneren Ansatz als alles andere.

Grüße,
Harald
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: 03.04.2013, 10:57     Titel:
  Antworten mit Zitat      
Hallo Krokodil,

Ich habe es nun schon zwei Mal geschrieben. Jetzt versuche ich es noch ein drittes Mal: die uitable1_CreateFcn benötigt als ersten Input den Handle des UITABLE-Objekts. Wie in Deinem Code nachzulesen ist, das ist sogar explizit dokumentiert, rufst Du die Funktion mit dem Handle des Pushbuttons auf:
Code:
function pushbutton_refresh_Callback(hObject, eventdata, handles)
% ...
% hObject    handle to pushbutton_refresh (see GCBO)

uitable1_CreateFcn(hObject, eventdata, handles);
...

Besser:
Code:
function pushbutton_refresh_Callback(hObject, eventdata, handles)
% ...
% hObject    handle to pushbutton_refresh (see GCBO)

uitable1_CreateFcn(handles.uitable1, eventdata, handles);

Den Namen des Feldes habe ich geraten, so dass Du "uitable1" anpassen musst.

Ich gebe im Forum einen Rat nicht gerne mehrfach und es freut mich immer, wenn die Fragenden meine Antworten auch gründlich durchlesen. Aber ich weiß, dass die von GUIDE automatisch erzeugten Codes alles andere als klar und übersichtlich sind, so dass man als Beginner schnell den Überblick verliert. Deswegen benutze ich GUIDE grundsätzlich nie.

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 - 2025 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.