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.
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?
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.
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
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));
ifisfield(S,(z));
ifisfield(S.(z),'L') ifisfield(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
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
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
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.
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)
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
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.