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

Einstellungen in neuem figure.

 

ppirokke
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 20.12.2010, 19:33     Titel: Einstellungen in neuem figure.
  Antworten mit Zitat      
Hallo,

wie realisiert Ihr ein Programm, das aus mehreren Fenstern besteht (z.B. um Einstellungen zu bearbeiten usw.)? Ich würde gerne der Einfachheit halber "einen" global workspace haben in dem die Einstellungsvariablen liegen und von der zusätzlichen figure bearbeitet werden können. Ich kenne z.B. getappdata und setappdata, allerdings ist das finde ich bei einem vollen Worspace recht umständlich.
Gibt es da eine elegantere Methode?


Gruß und frohe Weihnachten! Smile
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 20.12.2010, 20:56     Titel:
  Antworten mit Zitat      
Die Handles-Variablen kannst du vektorisieren und dann gleichzeitig ansprechen.

Code:
h(1) = figure;
h(2) = figure;

set(h, 'Name', 'blablubb')
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: 21.12.2010, 01:13     Titel:
  Antworten mit Zitat      
Hi,

ja das ist mal ne Frage. Ich denke es kommt immer auf den jeweiligen Anwendungsfall an. Ich meine was sollen die GUIs alle machen? Wenn beispielsweise eine "ChildGUI" lediglich die "MainGUI" in Farben oder Texteigenschaften verändern soll dann kann man dieser "ChildGUI" ja einfach die handles der "MainGUI" beim Aufruf übergeben und diese entsprechend bearbeiten.

Ich selber benutze ziemlich oft setappdata und getappdata. Wobei ich damit eigentlich zum größten Teil selbstgeschriebene Handleklassen Vektorisiert speichere die ich ggf aufrufen kann und die passende Handleklasse mit findobj finden und ändern kann. Nur hab ich in diesen Handleklassen auch listener integriert, die die entsprechende GUI so automatisch setzen...

Es ist ab und an auch ganz hilfreich beim "x-sen" (schließen einer GUI) diese einfach mit visible 'off' dem user unsichtbar zu machen anstatt diese zu löschen. Beim neuaufruf einfach wieder visible 'on' und alle Settings sind erhalten geblieben. So spart man zwischenspeichereien und bei größeren GUIs erscheinen diese auch wesentlich schneller, da sie nicht wieder neu erstellt werden müssen...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
ppirokke
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 21.12.2010, 05:16     Titel:
  Antworten mit Zitat      
Also ein Fall den in zum Beispiel letztens hatte ist, dass ein Datensatz an CAN-Nachrichten geladen wird und verarbeitet wird. Nun kann man beispielsweise benutzerdefinierte Einstellungen vornehmen um die Ausgabe anzupassen. Das sollte der Übersicht halber in einer extra GUI geschehen, wobei die standard Einstellungen in der Main-GUI verarbeitet werden sollten.

Dabei jetzt die ganzen CAN-Signale zu übergeben oder gar neu zu laden ist in dem Fall recht Umständlich dachte ich mir, daher die Suche nach einer anderen Lösung.
Meist dreht es sich also bei mir um einen Bedienungsfaktor, ich bin es einfach gewöhnt von Delphi alles in unterschiedliche Fenster zu packen und diese dann "visible" und "invisible" zu schalten, damit der Nutzer nicht gleich mit allen Einstellmöglichkeiten überflutet wird.

Die Idee, mit handles zuzugreifen kann ich ja leider nur dann anwenden, wenn ich in der Main GUI ein entsprechendes Objekt in Form eines Buttons, Labels etc. habe das ich in seiner Einstellung abändern möchte.
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: 21.12.2010, 09:20     Titel:
  Antworten mit Zitat      
Hi,
Zitat:

Die Idee, mit handles zuzugreifen kann ich ja leider nur dann anwenden, wenn ich in der Main GUI ein entsprechendes Objekt in Form eines Buttons, Labels etc. habe das ich in seiner Einstellung abändern möchte.

Nee warum das denn? Im enteffekt ist es doch dem Programmierer überlassen was er in die Handlesstruktur mittels guidata abspeichert. Da müssen ja nicht nur die standard Sachen drin stehen, die z.B. GUIDE erstellt...
Es ist eben in Matlab so, dass jede Funktion ihren eigenen WS hat. Ich persönlich finde es auch ganz sinnig. Für einen globalen WS würde mir spontan nur der Matlab WS einfallen, Daten mittels setappdata(0,...)/getappdata(0,...) oder globale Variablen. Wobei ich globale Variablen schonmal ausschließen würde, da sie schwierig zu kontrollieren sind...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
ppirokke
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 21.12.2010, 17:53     Titel:
  Antworten mit Zitat      
Du meinst also ich kann den Workspace einer Funktion zugänglich machen über ein Handle? Ich dachte bisher immer mit Handles kann man nur auf Objekte zugreifen, wie z.B. figures, axes oder all die Sachen aus der GUI. Gibt es bezüglich der Thematik irgendwo Tutorials? Ganz so tief konnte ich bisher leider nicht in MATLAB eintauchen, da ich mir alles selbst beibringen muss und das etwas Zeit braucht, habe ja erst vor ca. 1 Jahr richtig damit angefangen zu arbeiten Smile
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: 21.12.2010, 18:16     Titel:
  Antworten mit Zitat      
Hey,

also mit Handlestruktur meinte ich die vom GUIDE erstellte handles die du ja immer in deinen Callbacks der einzelnen Guielemente übergeben bekommst...
Beispiel:
Code:

function figure1_OpeningFcn(hObject, eventdata, handles, varargin)
handles.a = 1;
handles.b = 2;
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);

function pushbutton1_Callback(hObject, eventdata, handles)
handles.c = handles.a + handles.b;
guidata(handles.figure1,handles)
 


So hat der Programmierer freie Hand dabei Variablen GUI - intern zu verwalten etc... Im enteffekt kann man dort alles reinschreiben...

Du kannst ja einfach mal in der Hilfe unter guidata nachschauen. Wobei guidata intern glaube ich auch nur mittels setappdata dem übergebenen handle das Struct handles speichert...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
ppirokke
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 21.12.2010, 18:24     Titel:
  Antworten mit Zitat      
Achso, das ist eine Möglichkeit, die ich bisher noch garnicht gesehen habe. Theoretisch könnte ich mir dann ja auch eine Structure erstellen, mit dem Namen "globalVars" und dort alles reinspeichern / an die Funktionen übergeben beim Aufruf wenn ich Zugriff benötige. Kann ich das dann auch irgendwie realisieren beim Aufruf der zweiten figure oder muss ich dann die Structure über setappdata und getappdata übergeben? Wäre dann ja keine große Sache, da ich keine einzelnen globalen Variablen habe sondern eine einzige Structure. Smile
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: 21.12.2010, 21:29     Titel:
  Antworten mit Zitat      
Das kannst du machen wie du willst. Sicherlich kannst du aus einer GUI eine Childgui aufrufen und einfach die handles oder was du halt möchtest übergeben...
Beispiel:
Code:

function MainGui_pushbutton1_Callback(hObject, eventdata, handles)
ChildGui(handles);% Child Gui aufrufen

function ChildGui_OpeningFcn(hObject, eventdata, handles, varargin)
handles.Data = varargin{1}; % handles von der MainGui
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);

function ChildGui_pushbutton1_Callback(hObject, eventdata, handles)
handles.Data.d = 55;
guidata(handles.Data.MainGui,handles.Data) % handles der MainGui aus ChildGui updaten
 


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
ppirokke
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 21.12.2010, 21:41     Titel:
  Antworten mit Zitat      
Danke für den ausführlichen Quellcode, ich werde im nächsten Programm versuchen das derart umzusetzen und mich weiter etwas mit dem Thema zu beschäftigen.
Private Nachricht senden Benutzer-Profile anzeigen
 
ppirokke
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 22.12.2010, 09:47     Titel:
  Antworten mit Zitat      
Ich habe noch zwei Fragen zu der Vorgehensweise.

1.) Stimmt es, dass hObject sich bei CallBacks immer auf das aufrufende Object beziehen?

2.) Du aktualisierst das handle der MainGui von der ChildGui aus mit:
Code:
guidata(handles.Data.MainGui,handles.Data) % handles der MainGui aus ChildGui updaten
 
.

Wenn man aber nur handles.Data in MainGui handles schreibt, dann gehen dort sämtliche Informationen über Buttons ect. verlohren oder nicht? Ich habe es jetzt so gelöst, dass ich in der ChildHandle einen MainGui Unterpunkt erzeuge, wo alle Sachen des MainGui's gespiegelt werden:

Code:
function button_optionen_Callback(hObject, eventdata, handles)
child(handles);

function child_OpeningFcn(hObject, eventdata, handles, varargin)
handles.maingui = varargin{1};
handles.output = hObject;
guidata(hObject, handles);

function edit1_Callback(hObject, eventdata, handles)
handles.maingui.data.f = num;
guidata(handles.maingui.figure1,handles.maingui)


Meinst du das Vorgehen ist okay soweit oder könnte ich das ganze vereinfachen / unvorhergesehene Probleme vermeiden?
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: 22.12.2010, 10:29     Titel:
  Antworten mit Zitat      
Hi,

zu 1: Ja so ist es. Im pushbuttoncb ists das pushbuttonhandle, in der openingfcn der Gui entsprechend das figurehandle...
Zitat:

2.) Du aktualisierst das handle der MainGui von der ChildGui aus mit:

Ja
Zitat:

2.) Wenn man aber nur handles.Data in MainGui handles schreibt, dann gehen dort sämtliche Informationen über Buttons ect. verlohren oder nicht?

Nein da handles.Data = handles der MainGui ist (hab ichs ja in der openingfcn übergeben). Erstelle doch mal einfach eine GUI und debugge diese in den cb's so kannst du schauen was mit deiner handles struktur (was ja nur ein Struct ist) passiert.

Du brauchst guidata auch eigentlich nur benutzen, wenn du dein handles Struct änderst. Soll heißen wenn du daten hinzufügst oder löscht. Änderst du irgendetwas an deinen grafischen Objekten (Listbox, etc) dann musst du dies nicht mit guidata abspeichern. Dazu kannst du dir mal im oop - Bereich den Unterschied zwischen handle- und valueklassen anschauen.

Probleme können immer auftauchen. Das liegt ja in den Händen des Programmierers Wink. Aber wenn man dies einmal verstanden hat, dann kommt man auch schnell auf Lösungen...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
ppirokke
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 22.12.2010, 15:29     Titel:
  Antworten mit Zitat      
Seltsam,

ich habe das Problem gehabt, dass bei mir MATLAB das handle der afrufenden GUI komplett überschrieben hatte nach Rückkehr aus der ChildGUI und ich somit kein handle mehr zur Verfügung hatte, bis auf die erstellte Variable der Child GUI. Nach debuggen hab ich festgestellt, dass folgender Befehl dafür zuständig sein müsste:
Code:
guidata(handles.Data.MainGui,handles.Data) % handles der MainGui aus ChildGui updaten

Ich habe es mir dann so erklärt, dass guidata die Variablen aus handles.Data nimmt und in handles.Data.MainGui aktualisiert, also den rest entfernt.

Wo liegt da mein Denkfehler?
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: 22.12.2010, 17:47     Titel:
  Antworten mit Zitat      
Hi,

du musst natürlich höllisch aufpassen was du wo speicherst. Anbei ein Beispiel wie ich eine Gui öfter öffnen kann (singleton == 0 stellen) und die hadnles entsprechend bearbeite...
Code:

function testen_OpeningFcn(hObject, eventdata, handles, varargin)
if ~isempty(varargin)
   handles.Gui1 = varargin{1};
   handles.Typ = 2;
else
    handles.Typ = 1;
end
% Choose default command line output for testen
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

function pushbutton1_Callback(hObject, eventdata, handles)
if handles.Typ == 1
    testen(handles);
else
    if ~isfield(handles.Gui1,'d')
        handles.Gui1.d = 1;
    else
        handles.Gui1.d = handles.Gui1.d+1;
        handles.Gui1.d % einfache ausgabe auf das commandwindow
    end
    guidata(handles.Gui1.figure1,handles.Gui1) % Main figure
    guidata(handles.figure1,handles)% Child figure
end
 


Hast du permanent 2 drei oder mehr figures offen die miteinander kommunizieren sollen ist meiner Ansicht nach die übersichtlichste Möglichkeit setappdata getappdata zu nutzen. Ich wollte mit dem Beispiel nur zeigen, dass man in einfachen Fällen auch diese Methode anwenden kann...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
ppirokke
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 19.11.10
Wohnort: ---
Version: R2010a
     Beitrag Verfasst am: 22.12.2010, 18:17     Titel:
  Antworten mit Zitat      
Okay, dann denke ich, dass ich soweit verstanden habe, was du meinst. In der Art ohne Abfrage, falls keine Übergabe stattfindet habe ich mein Testprogramm derzeit auch realisiert. Ich denke damit habe ich alle Möglichkeiten von MATLAB-Gui ausgeschöpft Smile

Danke für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.