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

Zustand Buttons und eingelesene Werte miteinander verknüpfe

 

tutui
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2011, 12:48     Titel: Zustand Buttons und eingelesene Werte miteinander verknüpfe
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem. Ich habe verschiedene Radio-Buttons in meiner GUI.
Gleichzeitig lese ich Werte aus Simulink ein und stelle diese in einem Edit-Feld dar. Je nach Größe des Wertes färbt sich das Edit-Feld grün oder rot.
Nun soll aber, abhängig vom Zustand der Buttons, die Grenze bei der Entscheidung, ob rot oder grün, variieren.
z.B.: Ist als Auswahl "maennlich" gesetzt, so soll die Grenze bei dem Wert 200 liegen, ist die Person weiblich, so soll der Grenzwert 180 sein.

Das Auslesen des Edit-Feldes und der Radio-Buttons klappt wunderbar. Ich weiß nur nicht, wie ich beides verbinden kann, da das Edit-Feld in der "function varargout = Gruppeneinteilung(varargin)" gleich zu Beginn generiert wird und das Auslesen der Buttons in einer extra Funktion erfolgt, auf welche zuvor in der opening_fcn der m.file wurde. Question Question

Meine Codes sind:

1.) Eidt-Feld

Code:
function varargout = Gruppeneinteilung(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Gruppeneinteilung_OpeningFcn, ...
                   'gui_OutputFcn',  @Gruppeneinteilung_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
str = num2str(rto.OutputPort(1).Data);

statestxt = findobj('Tag','curState');

set(statestxt,'string',str);

% Edit Feld auslesen und einfärben
y = get(statestxt,'string');
y2 = str2num(y);
if y2<200.0000
    set(statestxt,'BackgroundColor','red')
else set(statestxt,'BackgroundColor','green')
end


2.) der Verweis

Code:

function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

set(handles.Geschlecht_group,'SelectionChangeFcn',@Geschlecht_group_SelectionChangeFcn);

guidata(hObject, handles);
 


3.) Auslesen der Buttons

Code:
function Geschlecht_group_SelectionChangeFcn(hObject, eventdata)


handles = guidata(hObject);

switch get(eventdata.NewValue,'Tag')   % Get Tag of selected object
    case 'radiobutton_maennlich'
             
     set(handles.static_text,'String','maennlich');

    case 'radiobutton_weiblich'
     
     set(handles.static_text,'String','weiblich');

    otherwise
   
end

guidata(hObject, handles);


Ich habe schon einiges versucht, aber es hat bisher nichts davon 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: 25.09.2011, 03:17     Titel:
  Antworten mit Zitat      
Hey,
also normalerweise solltest du alles in der opening fcn initialisieren und dort kannst du alles in die handles übernehemen. Dann kannst du natürlich auch wie gemacht in der initialisierungs fcn aber das bringt nicht die volle Funktionalität der GUI mit sich. Nicht umsonst steht dort DO NOT EDIT...
Also einfach:
Code:

function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin)
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
str = num2str(handles.rto.OutputPort(1).Data);
statestxt = findobj('Tag','curState');% hier kannste auch mit handles arbeiten
set(statestxt,'string',str);
% Edit Feld auslesen und einfärben
y = get(statestxt,'string');
y2 = str2num(y);
if y2<200.0000
    set(statestxt,'BackgroundColor','red')
else set(statestxt,'BackgroundColor','green')
end
handles.output = hObject;

set(handles.Geschlecht_group,'SelectionChangeFcn',@Geschlecht_group_SelectionChangeFcn);

guidata(hObject, handles);
 

Und dann hast du in deiner Geschlecht_group_SelectionChangeFcn alles zur Verfügung... Wobei du eigentlich sowieso einiges an Code hier sparen kannst weil du von double zu string und wieder zu double springst...

Greetings

Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
tutui
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2011, 10:28     Titel:
  Antworten mit Zitat      
Hi Marco,

ich habe es so gemacht, wie du gesagt hattest. Allerdings funktioniert es trotzdem nicht.
Die Bedingung
Code:
if y2<200.0000
     set(statestxt,'BackgroundColor','red')
etc.

müsste ich ja in die Geschlecht_group_SelectionChangeFcn schreiben, also in den Case 'maennlich', eine Farbänderung tritt jetzt aber nicht mehr auf.

Die andere Sache ist, dass mit dem Durchlauf der Matlab-Datei, die GUI nicht mehr automatisch geöffnet wird, sondern nur noch, wenn ich das Simulink-Modell manuell starte.
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: 26.09.2011, 13:23     Titel:
  Antworten mit Zitat      
Hey,
ja natürlich muss das noch in die Geschlecht_group_SelectionChangeFcn. So ähnlich wie du das gehabt hast.
Code:

function Geschlecht_group_SelectionChangeFcn(hObject, eventdata)
handles = guidata(hObject);

switch get(eventdata.NewValue,'Tag')   % Get Tag of selected object
    case 'radiobutton_maennlich'
             
     set(handles.static_text,'String','maennlich');

    case 'radiobutton_weiblich'
     
     set(handles.static_text,'String','weiblich');

    otherwise
   
end
% Einfärben
if handles.rto.OutputPort(1).Data<200 % auslesen und vergleichen
    set(handles.curState,'BackgroundColor','red')
else
    set(handles.curState,'BackgroundColor','green')
end
 


Da ich nicht mit Simulink arbeite weiß ich nicht was du bei get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject') bekommst. Ist das ein handle oder ein Struct? Wo und wie oft soll das Simulinkobjekt überhaupt ausgelesen werden? Wo updatest du denn die Werte in deiner GUI, die du vom Simulinkmodel bekommst? Oder muss dieses nur einmal eigeladen werden und danach ändert sich nix?

Prinzipiell solltest du in die Opening_Fcn alles rein schreiben, sodass beim ersten Aufruf auch alle GUIobjekte gesetzt werden können. In diesem Fall wäre es die komplette function Geschlecht_group_SelectionChangeFcn.

Code:


function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin)
% Speichern in handlestruct
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
% Editfeld mit Wert setzen
set(handles.curState,'String',handles.rto.OutputPort(1).Data)

% Startwert für Radiobuttons
if get(handles.radiobutton_maennlich,'Value')
     set(handles.static_text,'String','maennlich');
else
     set(handles.static_text,'String','weiblich');
end
% Einfärben des Editfeldes
if handles.rto.OutputPort(1).Data<200 % auslesen und vergleichen
    set(handles.curState,'BackgroundColor','red')
else
    set(handles.curState,'BackgroundColor','green')
end

guidata(hObject, handles);
 


Zudem weiß ich auch nicht was bei rto.OutputPort(1).Data ist. Nur ein Double oder ein Array? Der Fall oben ist bezogen auf nur ein Double. Ich hoffe das hilft dir weiter...

Greetings

Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
tutui
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2011, 15:13     Titel:
  Antworten mit Zitat      
Hallo,

die Werte werden ja mit den Befehlen
Code:
rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
 str = num2str(rto.OutputPort(1).Data);

 statestxt = findobj('Tag','curState');

set(statestxt,'string',str);


eingelesen. Es wird das Runtime Object, also die sich ändernden Werte mit Hilfe eines Listeners ausgelesen und ständig aktualisiert. Oder was meintest du?

Das Problem ist, wenn ich zuvor alles in die opening_fcn schreibe, dann wird auch nur das ausgeführt. Welche if-Bedingung ich in der Geschlecht_group_SelectionChangeFcn stehen habe, ist vollkommen egal, da es "übergangen" wird. Ich dachte ja, es ist möglich folgendes
in der opening_fcn zu definieren und dann im späteren Verlauf wieder auf y2 zurückzugreifen, dort, wo ich die if-Bedingung eigentlich verwenden möchte, also in der Geschlecht_group_SelectionChangeFcn.
Code:
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
 str = num2str(handles.rto.OutputPort(1).Data);
 statestxt = findobj('Tag','curState');% hier kannste auch mit handles arbeiten
set(statestxt,'string',str);
% Edit Feld auslesen und einfärben
 y = get(statestxt,'string');
 y2 = str2num(y);


Mein eigentlich Ziel ist es ja die if-Bedingung mit dem Case 'maennlich' bzw. 'weiblich' zu verbinden und das klappt eben nicht, weil in der opening_fcn schon alles festgelegt ist. Wie kann ich es denn machen, dass y2 nicht nur für die opening_fcn sondern auch für die nächsten Funktionen zur Verfügung steht? In einen Workspace speichern klappt glaube ich doch nur, wenn man die Werte nicht in Echtzeit benötigt, oder?
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: 27.09.2011, 15:25     Titel:
  Antworten mit Zitat      
Hey,

entweder verstehst du mich nicht oder ich dich nicht. Alles was du benötigst habe ich doch oben dargestellt. Nur ist bei mir

handles.rto.OutputPort(1).Data dein y2.

Ich habe es in das handles Struct in der opening_fcn übernommen, sodass du das in dem Geschlecht_group_SelectionChangeFcn zu Verfügung hast.

Allerdings habe ich vergessen in der Opening_Fcn den den CB für deine Radios zu setzen...
Code:

function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin)
% Speichern in handlestruct
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
% Editfeld mit Wert setzen
set(handles.curState,'String',handles.rto.OutputPort(1).Data)

% Startwert für Radiobuttons
if get(handles.radiobutton_maennlich,'Value')
     set(handles.static_text,'String','maennlich');
else
     set(handles.static_text,'String','weiblich');
end
% Einfärben des Editfeldes
if handles.rto.OutputPort(1).Data<200 % auslesen und vergleichen
    set(handles.curState,'BackgroundColor','red')
else
    set(handles.curState,'BackgroundColor','green')
end

set(handles.Geschlecht_group,'SelectionChangeFcn',@Geschlecht_group_SelectionChangeFcn);

guidata(hObject, handles);

 


Du kannst natürlich auch deine Geschlecht_group_SelectionChangeFcn in der Opening_Fcn aufrufen...

Greetings Marco[/quote]
Private Nachricht senden Benutzer-Profile anzeigen
 
tutui
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2011, 17:12     Titel:
  Antworten mit Zitat      
..ich glaube ich habe dich schon verstanden. aber wie gesagt es funktioniert nicht.
so wie du es aufgeschrieben hast, wird doch der Grenzwert nicht in Abhängigkeit zur Auswahl der Radiobuttons festgelegt, sondern noch immer separat. Er würde also noch immer bei 200 liegen, egal, ob es sich um eine Frau oder einen Mann handelt.
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: 27.09.2011, 23:01     Titel:
  Antworten mit Zitat      
Ah wer lesen kann (hab die 180 für weiblich überlesen)...
Dann schreib den Fall doch einfach in die Abfrage bzw. definiere eine neue Variable...
Code:

function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin)
% Speichern in handlestruct
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
% Editfeld mit Wert setzen
set(handles.curState,'String',handles.rto.OutputPort(1).Data)

% Startwert für Radiobuttons
if get(handles.radiobutton_maennlich,'Value')
     set(handles.static_text,'String','maennlich');
     x = 200;
else
     x = 180;
     set(handles.static_text,'String','weiblich');
end

% Einfärben des Editfeldes
if handles.rto.OutputPort(1).Data<x% auslesen und vergleichen
      set(handles.curState,'BackgroundColor','red')
else
      set(handles.curState,'BackgroundColor','green')
end
set(handles.Geschlecht_group,'SelectionChangeFcn',@Geschlecht_group_SelectionChangeFcn);
guidata(hObject, handles);


function Geschlecht_group_SelectionChangeFcn(hObject, eventdata)
handles = guidata(hObject);

switch get(eventdata.NewValue,'Tag')   % Get Tag of selected object
    case 'radiobutton_maennlich'
        x = 200;        
        set(handles.static_text,'String','maennlich');
    case 'radiobutton_weiblich'
        x = 180;
        set(handles.static_text,'String','weiblich');
end
% Einfärben
if handles.rto.OutputPort(1).Data<x% auslesen und vergleichen
    set(handles.curState,'BackgroundColor','red')
else
    set(handles.curState,'BackgroundColor','green')
end
 

So ich hoffe, dass ich ich die Problematik nun richtig verstanden habe.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
tutui
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2011, 13:02     Titel:
  Antworten mit Zitat      
Hallo!

Entschuldigung, dass ich mich erst jetzt melde. Mein Mainboard und Netzteil haben letzte Woche den Geist aufgegeben.

...

Super!
Es scheint zu funktionieren! Very Happy

Vielen 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.