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

Problem mit guidata()

 

Laura2go
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2012, 15:16     Titel: Problem mit guidata()
  Antworten mit Zitat      
Hallo,
ich habe mal wieder ein kleines Problem.

In meiner GUI wird über ein Button eine Funktion gestartet. Das klappt soweit auch, da ich in der Funktion über handles=guidata(gcf) auf meine Variablen zugreifen kann.

Jetzt habe ich in meiner GUI ein java Figure erstellt, das bei einem klick ebenfalls die selbe Funktion starten soll. Da gcf sich jetzt offensichtlich auf das java figure bezieht, kann ich nicht auf die handles Variablen meiner GUI zugreifen.

Ich habe über die Forensuche leider keine Lösung gefunden. Was muss in der Funktion statt handles=guidata(gcf) stehen? Ich hätte vermutet, dass dort handles=guidata(hObject) stehen muss. Leider hat das nicht funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen


Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 19.03.2012, 19:59     Titel:
  Antworten mit Zitat      
Hey,
Zitat:

Jetzt habe ich in meiner GUI ein java Figure erstellt

Was heist das genau? Du hast doch sicherlich ein Javaobjekt mit javacomponent in deiner figure platziert oder? Denn ein JFrame in einer Figure geht meines erachtens nicht.

Gibt es eine Fehlermeldung oder ist das handles Struct was du mit
Code:

einliest einfach nicht auf dem aktuellen Stand oder ist es leer weil du eine GUI ohne GUIDE geschrieben hast und du keine handles definiert hast? Ich glaube es wäre hilfreich, wenn du hier dein code oder den relevanten Bereich posten könntest.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2012, 20:18     Titel:
  Antworten mit Zitat      
Also ich versuche es mal die wichtigen Abschnitte zusammenzufassen:

Zunächst erzeuge ich meine Java Oberfläche mit:
Code:

graph = com.mxgraph.view.mxGraph;
parent = graph.getDefaultParent();
edge = com.mxgraph.view.mxEdgeStyle;
...
guidata(gcf,handles)
 


Dann erzeuge ich eine Celle über eine Funktion einer definierten Klasse:
Code:

parent = handles.graph.getDefaultParent();
handles.graph.getModel().beginUpdate;
knoten=handles.graph.insertVertex(parent,'','A',10,10,80,60,'defaultVertex;strokeColor=red;fillColor=yellow;resizable=0');
pause(0.2)
handles.graph.getModel().endUpdate;
guidata(gcf,handles);
 


Die Callbacks habe ich so definiert, dass ich mit einem Rechtsklick auf die Celle folgende Funktion ausgeführt wird:
Code:
function CB_Information(obj,evd,fig)
handles = guidata(fig);
if ~isempty(handles.ausgewaeltes_Objekt)
    temp=get(handles.ausgewaeltes_Objekt,'Value');
     handles.test(str2num(temp(2))).Information;
end


Die Funktion 'Information' aus der definierten Klasse gestartet.

Code:
function Information(obj)
            handles=guidata(gcf);
            set(handles.st_Info_1a,'String','Bezeichnung:');

Hier tritt nun das eigentliche Problem auf. Ich weiß nicht, wie ich statt handles=guidata(gcf) das figure handle angeben muss. Ich bekomme folgende Fehlermeldung:
Code:
??? Attempt to reference field of non-structure array.

... und ein leeres Figure Fenster öffnet sich. Wenn ich über ein Button die Funktion 'Information' der Klasse xxx starte, funktioniert alles einwandfrei.
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 19.03.2012, 21:19     Titel:
  Antworten mit Zitat      
Hey,
mmhh du schreibst, dass du eine Klasse geschrieben hast? Also mit classdef in der du einige Parameter ablegst? Warum übergibst du dieser Klasse nicht auch dein Figure Handle als Propertie? Dann kannst du auch das gcf weglassen und z.B.
Code:

handles = guidata(obj.Window);
 

auslesen (Wenn Window der Propertiename ist).
gcf macht nicht mehr als die aktuell fokussierte Figure auszulesen, was unter umständen auch nicht so gut ist. Ich glaube das gleiche wie get(0,'CurrentFigure'). Wenn keine figure offen ist, dann erstellt gcf eine leere Figure, was erklären würde warum bei dir eine Fehlermeldung erzeugt wird und eine neue Figure geöffnet wird. Die Fehlermeldung besagt, dass deine handles kein Struct ist. Ich denke das es ist leer. Ich würde dir empfehlen die funktion Information mal zu debuggen. Dann müsstest du erkennen woran es liegt.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2012, 22:01     Titel:
  Antworten mit Zitat      
Hallo Marco,
ich bin mir nicht ganz sicher, ob ich dich richtig verstanden habe. Aber jetzt funktioniert es schon fast!

Ich habe eine definierte Klasse xxx mit der Property Window. Jetzt erstelle ich ein Objekt:
Code:


Jetzt habe ich in meinen methods drin:

Code:
function obj = xxx
obj.Window =gcf
...


Wenn ich die Funktion 'Information' start (a.Information) komme ich an meine Variablen:
Code:
function Information(obj)
 handles= obj.Window;
set(handles.st_Info_1a,'String','Bezeichnung:');
...
 

Es funktioniert! Jetzt weiß ich nur nicht, was ich zum Schluss bei der Funktion 'Information' schreiben muss, damit die Daten aktualisiert werden. guidata(obj.Window,handles) geht nicht.

Zitat:
guidata(object_handle,data) stores the variable data as GUI data.
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 19.03.2012, 23:07     Titel:
  Antworten mit Zitat      
Hey,

1. du kannst deiner Klasse xxx auch das figure handle direkt übergeben
Code:

a=xxx(figure_handle);
% dann im Konstruktor
function obj = xxx(fig);
obj.Window = fig;
end
 

Das macht gcf erstmal überflüssig. So mach ich es lieber, da man Matlab nicht die Möglichkeit gibt etwas zu machen was man nicht möchte (ist eindeutig).
Zitat:

guidata(obj.Window,handles)

warum das nicht geht weiß ich gerade nicht genau, eigentlich muss das gehen. Versuch mal folgendes:
Code:

function Information(obj)
fig = obj.Window;
handles = guidata(fig);
% irgendetwas machen
guidata(fig,handles)
end
 

Kommt denn bei dir ne Warnmeldung oder ein Error? Leitest du deine Klasse xxx von der handle Klasse ab oder ist das ne Value Klasse?

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2012, 09:24     Titel:
  Antworten mit Zitat      
Das ist die Lösung, vielen Dank!!!
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.