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

global struct in GUI

 

JJ72
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 08.07.2009, 18:36     Titel: global struct in GUI
  Antworten mit Zitat      
Hallo, ich habe folgendes Problem. Ich habe eine GUI, dabei erstelle ich einen struct, der die handles der axes, pushbuttons etc. enthält:

"my_handles=guihandles"

Die GUI besteht aus mehreren M-Files, die zusammenarbeiten. Sie benötigen zum Funktionieren (eigentlich) nur den my_handles struct. Solange es Skript M-Files sind tut alles, ich will aber Function M-Files (zwecks Kompilieren).

Vielleicht checke ich es nicht, aber eigentlich müsste ich doch dann in jeder dieser Funktionen my_handles als global definieren, oder? Also

"function my_fun1
global my_handles"

Wenn ich das mache, dann bekomme ich plötzlich die Fehlermeldung:

??? Attempt to reference field of non-structure array

Woran liegt das?
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 08.07.2009, 18:45     Titel:
  Antworten mit Zitat      
Du hast nur etwas falsch verstanden. Die Variable "myhandles" muss an die Funktionen übergeben werden:
Code:
function my_fun1(myhandles)


Der Aufruf der Funktionen erfolgt dann analog:
Code:
my_fun1(myhandles);


Globale Variablen sind in diesem Fall nicht nötig.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 08.07.2009, 20:04     Titel:
  Antworten mit Zitat      
Hhm, das klappt leider nicht so ganz. my_handles wird in einer hauptfunction main_fun definiert. Aus dieser rufe ich dann mittels pushbutton my_fun1 au, also:
Es gibt also eine

uicontrol('style','pushbutton',................,'Callback','myfun1(my_handles').....


wenn ich darauf klicke bekomme ich die Fehlermeldung:

??? Undefined function or variable 'my_handles'.

??? Error while evaluating uicontrol Callback

Mir scheint, ich mache da konzeptionell was falsch...
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 08.07.2009, 20:46     Titel:
  Antworten mit Zitat      
Probiere mal:
Code:
uicontrol('style','pushbutton',................,'Callback',{@myfun1,my_handles})


Gruß
Alex

PS: Verwende bitte in Zukunft die Code-Umgebung Wink
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 09.07.2009, 07:52     Titel:
  Antworten mit Zitat      
Hi, ja sorry, stimmt, das ist besser mit dem Code. Also das klappt leider nicht. Da my_handles ja die GUIhandles sind, werden die am Ende der Hauptfunktion definiert. Wenn ich sie dann vorher schon in einem Callback verwende meldet Matlab bereits beim starten der GUI (also beim Aufruf von Mainfun)

??? Undefined function or variable "my_handles".

Hier so eine Art Minimalbeispiel:
Code:

function main_fun
...
...
button1=uicontrol('style','pushbutton',....,'Callback',{@my_fun1,my_handles})
...
...
my_handles=guihandles.
 


Als nächstes habe ich dann versucht, das Callback erst danach zu definieren.
Code:

function main_fun
...
...
button1=uicontrol('style','pushbutton',....)
...
...
my_handles=guihandles.
set(button1, 'Callback', {@my_fun1,my_handles})
 


Wenn ich das tue meldet Matlab bei Aufruf von my_fun1 durch den pushbutton:

??? Error using ==> my_fun1
Too many input arguments.

??? Error while evaluating uicontrol Callback

Was stimmt da nicht?
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 09.07.2009, 08:24     Titel:
  Antworten mit Zitat      
Moment, ich hab da was vergessen:
Die GUI-Handles-Struktur wird automatisch an die Callbacks übergeben. du musst nur bei der Definition der Callback diese auch als Übergabeparameter definieren:
Code:
function my_fun1(hObject, eventdata, my_handles)

Code:
function main_fun
...
...
button1=uicontrol('style','pushbutton',....,'Callback',@my_fun1)
...
...
my_handles=guihandles


Alternativ würde ich dir sonst die Verwendung von
Code:
empfehlen.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 09.07.2009, 08:54     Titel:
  Antworten mit Zitat      
Hi Alex, danke, leider scheint das auch nicht richtig zu klappen:

??? Input argument "my_handles" is undefined.

Error in ==> my_fun1 at 2
if ishandle(my_handles.gh)==1;

??? Error while evaluating uicontrol Callback

Muss die main_fun die handles als Ausgabeargument mit übergeben? Also:

Code:

function [my_handles]=main_fun ()
 


Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 09.07.2009, 08:57     Titel:
  Antworten mit Zitat      
Moin,

kannst du mal ein Beispiel posten? Also ein Figure mit Button und dann eine Funktion dazu die nach dem Button-Klick etwas ausführen soll und wo diese Fehlermeldung kommt. Ich denke dann gehts am schnellsten...

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2009, 10:43     Titel:
  Antworten mit Zitat      
Hallo,

verwendest Du guide zum erstellen der GUI? Wenn ja bekommst Du die handle Struktur schon als Übergabeparameter für jede Callback Funktion.

Wenn Du die GUI selber programmierst, wird nur hObject und eventdata übergeben.

Code:

h = uicontrol('Style', 'pushbutton', ...,'Callback', {@myfun1,myhandle);
 


Code:

function myfun1(hObject, eventdata, myhandle)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 09.07.2009, 11:08     Titel:
  Antworten mit Zitat      
Hi Leute, ok, so sieht das ganze aus.

@LittleX: Ich baue das Teil selbst, verwende also nicht guide.

@Alex: Also im Prinzip will ich das so machen:

Code:

function main_fun
f=figure;
pb=uicontrol('Tag','pb','Parent',f,'Style','pushbutton','Position',[200 100 30 30],'String','GO!!!','Callback',@my_fun1);
pa=uipanel('Tag','pa','Parent',f,'Position',[0.48 0.02 0.5 .95],'BackgroundColor','red');    %Erstelle eine rote Panel
my_handles=guihandles;
end
 


Wenn ich dann das Ganze aufrufe (also main_fun und dann auf den button klicke) erhalte ich:

??? Input argument "my_handles" is undefined.

Error in ==> my_fun1 at 2
set(my_handles.pa,'BackgroundColor','green');

??? Error while evaluating uicontrol Callback

und dann
Code:

function my_fun1(hObject, eventdata, my_handles)
set(my_handles.pa,'BackgroundColor','green'); % Mach die Panel grün
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2009, 11:32     Titel:
  Antworten mit Zitat      
Wenn Du guide nicht verwendest, musst Du Deine selber erzeugte handle Struktur mit übergeben und den Callback entsprechend definieren (in Deinem Bespiel gibst Du nur @my_fun1 an, also keinen zusätzlichen Parameter):
Code:

set(pb,'Callback',{@myfun1,my_handles});
 

my_handles musst du vorher Werte zuweisen.

Ich würde Dir aber wie Alex auch empfehlen, Dir mal setappdata/getappdata oder guidata zum Datenaustausch empfehlen.
Oder nested functions verwenden, dann hast Du direkt Zugriff auf Deine handles.
Private Nachricht senden Benutzer-Profile anzeigen
 
JJ72
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 22.06.09
Wohnort: Karlsruhe
Version: R2009b
     Beitrag Verfasst am: 09.07.2009, 13:37     Titel:
  Antworten mit Zitat      
Super Jungs! Das haut hin! Vielen Dank Razz
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 - 2024 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.