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

GUI handles Wertzuweisung

 

ET

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2012, 19:58     Titel: GUI handles Wertzuweisung
  Antworten mit Zitat      
Hallo liebe Leute,

ihr habt mir schon oft hier weiter geholfen. Leider konnte ich diesmal kein Thema finden welches mein Problem lößt.

Ich versuche es mal zu erklären:
Wie in der Überschrift schon geschrieben versuche ich eine GUI zu erstellen. Ich bin da aber noch ein grober Anfänger. Ich habe die GUI mit GUIDE erstellt. Nun besteht mein Problem darin, dass ich zwischen verschiedenen Callbacks zwei Variablem hin und her geben möchte. Diese werden in der OpeningFcn mit 0 initialisiert.

Code:

handles.a = 0;                                                      
handles.b = 0;
 


die Callbacks von 4 Pushbuttons schreiben bei Betätigung den Wert der Variable auf entweder 1 oder 2 um und prüfen dann in einer if-Abfrage welchen Wert die andere Variable enthällt. Darauf folgt das füllen einer Listbox.

(Bsp.: einer der 4 Callbacks)
Code:
% --- Executes on button press in pushbutton15.
function pushbutton15_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton15 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.b=1;
listbox={};
if handles.a==1
        [r_P_ally,r_P_allx] = size(handles.results_P_all);
        for m=3:1:r_P_allx
            listbox{m-2,1} = handles.results_P_all(1,m)*(24*60);
        end
        set(handles.listbox1,'String', listbox);
end
if handles.a==2
        [r_liney,r_linex] = size(handles.results_line);
        for m=3:1:r_linex
            listbox{m-2,1} = handles.results_line(1,m)*(24*60);
        end
        set(handles.listbox1,'String', listbox);
end
 


Und nun zum Kern des ganzen: Die Callbacks füllen die Listbox nicht. Ich habe die if-Abfrage zur Probe bei 2 der vier Schalter einmal mit 0 gemacht und da wurde die Listbox zumindest in zwei Fällen gefüllt. Demzufolge erhalten die Variablen nicht die richtige Zuweisung oder sie werden an einem Schritt stets mit 0 überschrieben. Jedoch werden sie ja nur in den Callbacks und in der OpeningFcn überhaupt genutzt.

Ich denke ich habe ein prinzipielles Verständnissproblem bezüglich der Wertübergabe und der Gültigkeit der Variablen in einer GUI. Könnt ihr mir weiterhelfen? Wäre euch sehr dankbar.

Beste Grüße
ET


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.07.2012, 22:26     Titel:
  Antworten mit Zitat      
Hallo,

jedes Mal, wenn a oder b aktualisiert werden sollen, muss danach ein
Code:
guidata(hObject, handles)

folgen. Damit wird die komplette Handles-Struktur aktualisiert.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.07.2012, 22:46     Titel: Re: GUI handles Wertzuweisung
  Antworten mit Zitat      
Hallo ET,

Ein grundlegendes Konzept der "handles" Methode ist, dass dieses Struct nach jeder Änderung und vor jeder Abfrage auf den neuesten Stand gebracht werden muss. Beispiel:
Code:
handles = struct('field1', 1);
uicontrol('Style', 'pushbutton', 'String', 'Button', {@myCallback, handles});
handles.field2 = rand;

function myCallback(ObjH, EventData, handles)
disp(handles)
handles.field3 = 'hello';

Jetzt wird bei jeder Betätigung des Buttons der Inhalt des Structs "handles" angezeigt. Alledings nur mit dem ersten Feld field1! Denn field2 und field3 werden erst später eingefügt, während der Aufruf des Callbacks immer noch den Wert des ersten "handles" enthält.

Besser:
Code:
handles = struct('field1', 1);
uicontrol('Style', 'pushbutton', 'String', 'Button', @myCallback);
handles.field2 = rand;
guidata(figureHandle, handles);  % Store handles struct in fugure

function myCallback(ObjH, EventData)
handles = guidata(ObjH);  % Get struct from the figure
disp(handles)
handles.field3 = 'hello';
guidata(ObjH, handles);  % Store new handles struct in the figure
 

Hilft das schon weiter?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ET

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2012, 22:46     Titel:
  Antworten mit Zitat      
Hallo,

vielen, vielen Dank für die so schnelle Hilfe. Echt super nett von euch:)
War ein grundsatzproblem, wie befürchtet...
Läuft alles jetzt dank eurem Tipp.

Wünsch euch noch nen schönen Abend.

P.S.: Mit ein bisschen Glück seht ihr mich nicht wieder;)
 
huhu0815
Forum-Century

Forum-Century


Beiträge: 141
Anmeldedatum: 20.02.14
Wohnort: Dresden
Version: R2013b, R2014b, R2016b, R2018a
     Beitrag Verfasst am: 04.09.2014, 08:31     Titel:
  Antworten mit Zitat      
Hallo,

ich habe ein ähnliches Problem, bei dem ich so langsam verzweifle.

Ich hab ein Gui erzeugt, welches dazu dienen soll, alle eingegebenen Daten zu sammeln und auszugeben (mit dem Ziel, dass ein übergordnetes damit arbeiten soll)

Dabei rufe ich in der OpeningFcn eine Function auf
Code:
function setRequirements(hObject,eventdata,handles)
die vorab Initialisierungen bzw einstellungen vornimmt.

Am Ende der Function speichere ich alle hinzugefügten Felder in der handles struktur. Leider gehen nach Verlassen der Function die Werte ins Nirvana und ich weiß nicht warum!

Nachfolgend ein Auschnitt aus dem Code (Kommentare mal weggelassen)
Code:

function ReqKCH_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% handles.reqKCH.kindReq = 'minimum';
handles.reqKCH.projectNr = '';  % Initialisierungswert
handles.regKCH.temperature = -1;  % Initialisierungswert
set(handles.radiobutton_minReq,'Value',1);
setRequirements(hObject,eventdata,handles); % Am Ende der Funktion ist alles wie erwartet

disp(handles);  % hier sind die Werte verschwunden
% disp(handles.reqKCH);
guidata(hObject, handles);

disp(handles);

uiwait(handles.frm_ReqKCH);


function varargout = ReqKCH_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.reqKCH;
delete(hObject);

function pushbutton_save_Callback(hObject, eventdata, handles)
frm_ReqKCH_CloseRequestFcn(hObject,eventdata,handles);


function frm_ReqKCH_CloseRequestFcn(hObject, eventdata, handles)
uiresume(handles.frm_ReqKCH);


function setRequirements(hObject,eventdata, handles)
if(get(handles.radiobutton_maxReq,'Value'))

    % add field to struct
    handles.reqKCH.technology = '';
    handles.reqKCH.testequipment = '';
    handles.reqKCH.testType = '';
   
    % set variable to check min or max
    handles.reqKCH.kindReq = 'maximum';
   
    % Einblenden von Maximalbedingungen
    set(handles.text_technology,'Visible','on');
    set(handles.text_testequipment,'Visible','on');
    set(handles.text_testType,'Visible','on');
    set(handles.edit_technology,'Visible','on');
    set(handles.edit_testequipment,'Visible','on');
    set(handles.edit_testType,'Visible','on');
   
   
else
    % remove fields, if available
    try
        handles.reqKCH = rmfield(handles.reqKCH,'technology');
        handles.reqKCH = rmfield(handles.reqKCH,'testequipment');
        handles.reqKCH = rmfield(handles.reqKCH,'testType');  
    catch
    end
    % set variable to check min or max
    handles.reqKCH.kindReq = 'minimum';
   
    % Ausblenden von optionalen Maximalbedingungen
    set(handles.text_technology,'Visible','off');
    set(handles.text_testequipment,'Visible','off');
    set(handles.text_testType,'Visible','off');
    set(handles.edit_technology,'Visible','off');
    set(handles.edit_testequipment,'Visible','off');
    set(handles.edit_testType,'Visible','off');
    set(handles.edit_technology,'String','');
    set(handles.edit_testequipment,'String','');
    set(handles.edit_testType,'String','');
end
disp(handles.reqKCH);  % hier sind die Einträge wie erwartet

% Update handles structure
guidata(hObject, handles);

disp(handles.reqKCH);
 



Das ist bestimmt etwas leichtes, nur bin ich grad etwas ratlos. Ich hoffe mein Problem ist etwas deutlicher. Freu mich über jede Hilfe und sag jetzt schon mal
Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.09.2014, 08:35     Titel:
  Antworten mit Zitat      
Hallo,

du musst an sich nur folgende Zeilen in der OpeningFcn weglassen:

Code:
disp(handles);  % hier sind die Werte verschwunden
% disp(handles.reqKCH);
guidata(hObject, handles);

disp(handles);


handles ist ja eine lokale Variable, die durch die Aktualisierung an anderer Stelle nicht ihren Wert ändert.

Wenn du das erzwingen willst, bräuchtest du noch einen Aufruf:
Code:
handles = guidata(hObject);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
huhu0815
Forum-Century

Forum-Century


Beiträge: 141
Anmeldedatum: 20.02.14
Wohnort: Dresden
Version: R2013b, R2014b, R2016b, R2018a
     Beitrag Verfasst am: 04.09.2014, 09:29     Titel:
  Antworten mit Zitat      
super vielen dank für die schnelle antwort! das erzwingen hat funktioniert!
das handles eine lokale variable ist, war mir bisher nicht bekannt. man lernt nie aus! wird die in einer art call-by-reference behandelt?
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.