bin neu hier im Forum und komme nach langem Suchen nicht umher nun doch selbst zu fragen.
Ich stehe vor folgendem Problem:
Ich möchte die Position der Maus auslesen und abspeichern, wenn ich auf mein axes-Feld klicke. Dazu habe ich auch bereits einen brauchbaren Code gefunden. Das Problem liegt nun darin die Position anzeigen zu lassen.
Wenn ich bei der Funktion "druecken", die sich auf den Mausklick bezieht direkt den String meines Textfeldes ändern möchte, spuckt Matlab aus, dass das Ding nicht vorhanden sei.
Allgemein funktioniert der Code, nur die Ausgabe funzt eben nicht. Um das zu umgehen habe ich nen Button gesetzt, damit ich wenigstens die Position des letzten Klicks erhalte, aber das ist nun mal alles andere als komfortabel.
Danke schon mal für jede Antwort!
Code:
function disppos(hObject, eventdata, handles) global h pt
h.f = handles.axes1;
% grid on;
h.a=gca;
set(gcf,'WindowButtonDownFcn',{@druecken, h});
set(gcf,'WindowButtonUpFcn', {@loesen,h});
function druecken(hObject, eventdata, handles, h) global h pt
pt = get(h.a, 'CurrentPoint') print(hObject, eventdata, handles);
set(gcf, 'WindowButtonMotionFcn', {@ziehen,h});
function ziehen(hObject, eventdata, handles, h) global h pt
pt = get(h.a, 'CurrentPoint');
print(hObject, eventdata, handles);
function loesen(hObject, eventdata, handles, h) global h
set(gcf, 'WindowButtonMotionFcn', '');
... spuckt Matlab aus, dass das Ding nicht vorhanden sei.
Bitte poste eine Kopie der Fehlermeldung, anstatt sie nur ein paar Inhalte daraus zu interpretieren. Z.B. enthält sie die Zeile, in der das Problem auftrat. Dann müssen wir diese Zeile nicht erst aufwändig suchen. Danke!
Es ist überflüssing und stiftet Verwirrung, dass "h" sowohl als globale Variable als auch als Input-Argumetn übergeben wird. Entscheide Dich für eines von beiden - vorzugweise niemals für globals.
Ich rate mal, dass der handles-Struct, der an "print" (Nebenbei: das Überschreiben von Built-In Matlab Funktionen kann unerwartete Auswirkungen haben) übergeben wird, nicht vollständig ist. Mit dem debugger bekommst Du das leicht heraus:
Danke für die Antwort,
bin leider nur wenig vorwärts gekommen. Hab gar nicht dran gedacht, dass ich die build-in function überschreibe, das hab ich natürlich geändert.
Reference to non-existent field 'text_status'.
Error in gui_zone_editor>set_stuff (line 154)
set(handles.text_status,'String',num2str([pt(1,1) pt(1,2)]));
Error in gui_zone_editor>druecken (line 141)
set_stuff(hObject, eventdata, handles);
Error while evaluating figure WindowButtonDownFcn
Zeile 141 ist in diesem Fall die Zeile in der set_stuff aufgerufen wird. Also innerhalb der function druecken, als auch ziehen (Zeile 147).
Allerdings nicht in Zeile 157, also innerhalb der pushbutton-function.
text_status ist ein Textfeld im GUI.
Code:
function disppos(hObject, eventdata, handles) global pt h
h.f = handles.axes1;
% grid on;
h.a=gca;
set(gcf,'WindowButtonDownFcn',{@druecken, h});
set(gcf,'WindowButtonUpFcn', {@loesen, h});
function druecken(hObject, eventdata, handles) global pt h
pt = get(h.a, 'CurrentPoint')
set_stuff(hObject, eventdata, handles); %<--Zeile 141 set(gcf, 'WindowButtonMotionFcn', {@ziehen,h});
function ziehen(hObject, eventdata, handles) global pt h
pt = get(h.a, 'CurrentPoint');
set_stuff(hObject, eventdata, handles); %<--Zeile 147
function loesen(hObject, eventdata, handles) set(gcf, 'WindowButtonMotionFcn', '');
function set_stuff(hObject, eventdata, handles) global pt h
set(handles.text_status,'String',num2str([pt(1,1) pt(1,2)])); %<--Zeile 154
function pushbutton_call_Callback(hObject, eventdata, handles)
set_stuff(hObject, eventdata,handles)
Wie Jan schon angedeutet hat, liegts an den handles. Code-Stücke zu übernehmen ist
sinnvoll aber man sollte drauf achten sie sinnvoll in sein eigenes Programm einzubauen.
Der Name der Variablen zum Speichern von handles ist frei wählbar. (Man kann natürlich
zusätzlich auch eine Auswahl der handles in einer neuen Struktur speichern und diese an Funktion etc. übergeben).
Du übergibst den Funktionen die Variable h. Diese enthält, soweit es aus dem Code-Auszug hervor geht, nur das handle deiner Axes-Komp -> h.f = gca;
Deshalb kommt es zur Fehlermeldung; der Funktion sind die in der Struktur handles definierten Variablen nicht bekannt. -> {@ziehen, handles} etc...
Zudem sei erwähnt dass h.f tendenziell eher für das handle der Figure verwendet wird.
In deinem Fall enthalten beide Variablen h.a, h.f vrs. das selbe handle!! Wenn du nur eine Figure,Axes hast ist gca, gcf ausreichend - beides zu mischen nicht sehr übersichtlich!
vielen Dank für die Ratschläge. Hat super geklappt!
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.