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

Radiobutton nicht gleich aktiv bzw Daten nicht verarbeitet

 

tschurl
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 12:39     Titel: Radiobutton nicht gleich aktiv bzw Daten nicht verarbeitet
  Antworten mit Zitat      
Habe 2 Radiobuttons in einem Panel (einer ist auf 1, der ander auf 0 gestellt)
Diese bewirken 2 unterschiedliche Ausgaben in einer "Axes" und mit einem Pushbutton "Plot" wird eine Grafik erstellt.
Warum werden nicht automatisch die werte aus dem 1. Radiobutton genommen sondern, wenn ich Plot drücke zuerst die initialisierten Daten und erst wenn ich den Radiobutton wechsle kann ich zwischen den beiden Radiobuttons hin und her springen und die richtige Grafik wird gezeichent?

Danke
Private Nachricht senden Benutzer-Profile anzeigen


Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 13:44     Titel:
  Antworten mit Zitat      
Hm,
Poste doch bitte die entsprechenden Callbacks, so kann man leider nur sagen, dass da wohl was ist, was nicht so sein soll.
 
tschurl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 14:05     Titel:
  Antworten mit Zitat      
so schauts aus

Code:

function X_radiobutton_Callback(hObject, eventdata, handles)
% hObject    handle to X_radiobutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of X_radiobutton


% --- Executes on button press in Y_radiobutton.
function Y_radiobutton_Callback(hObject, eventdata, handles)
% hObject    handle to Y_radiobutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Y_radiobutton

function Panel_SelectionChangeFcn(hObject, eventdata)
 
%retrieve GUI data, i.e. the handles structure
handles = guidata(hObject);
 
switch get(eventdata.NewValue,'Tag')   % Get Tag of selected object
    case 'X_radiobutton'
      %execute this code
      handles.X = 2*handles.x;
      handles.Y = handles.y;
 
    case 'Y_radiobutton'
      %execute this code when
      handles.X = handles.x;
      handles.Y = 2*handles.y;
 
 
    otherwise
       % Code for when there is no match.
 
end
%updates the handles structure
guidata(hObject, handles);

 


kleines x/y bedeutet die variable im code
das große X/Y wird dann geplottet
vielen dank für die hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
tschurl
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2011, 13:40     Titel:
  Antworten mit Zitat      
weiß jetzt wirklich niemand, wie man den radiobutton gleich von anfang an aktivieren kann?

ach ja, in der OpeningFcn steht
Code:

%set radiobutton for panel
set(handles.Panel,'SelectionChangeFcn',@Panel_SelectionChangeFcn);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 21.06.2011, 18:23     Titel:
  Antworten mit Zitat      
Muss jetzt schnell zu Kind und Frau, daher kurz und knapp:

Wenn Du
Code:

set(handles.Y_radiobutton, 'Value', 1)
 

setzt, wird der Radiobutton aktiv. Das kannst Du direkt in der OpeningFcn machen.

Beim kurzen überfliegen deines letzten Eintrages:
Das sieht aus, als ob Du Dir zu viel Arbeit gemacht hast.
Probiere mal:


Code:

if get(handles.X_radiobutton, 'Value') % X_radiobutton ausgewählt
      handles.X = 2*handles.x;
      handles.Y = handles.y;
else
      % X_radiobutton ausgewählt
      handles.X = handles.x;
      handles.Y = 2*handles.y;
end
 


Zum Umschalten zwischen den RadioButtons:
Code:

function X_radiobutton_Callback(hObject, eventdata, handles)
set(handles.Y_radiobutton, 'Value', 0)
guidata(hObject, handles);

function X_radiobutton_Callback(hObject, eventdata, handles)
set(handles.X_radiobutton, 'Value', 0)
guidata(hObject, handles);
 


Habe den Code nicht getestet und bin viel zu spät..
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 08.07.2011, 14:44     Titel:
  Antworten mit Zitat      
Hallo,

auch ich habe ein ähnliches Problem, für das ich noch nach einer Lösung suche:

Wie kann ich die SelectionChangeFcn nutzen, obwohl es keinen "Change", also kein User-Event gibt?

Im Detail heißt das:

> Ich arbeite mit Guide und habe dort
> Mehrere RadioButtons in einer ButtonGroup
> Die zugehörige SelectionChangeFcn mit switch-cases für die "changes"
> Eine Initialiserung des ButtonGroup also welcher RadioButton ausgewählt ist in der OpeningFcn
> In der SelectionChangeFcn wird eine Variable definiert.
> Die SelectionChangeFcn wird als SelectionChangeDefiniert:set(handles.ButtonGroup,'SelectionChangeFcn',@ButtonGroup_SelectionChangeFcn)

Mein Problem ist nun, dass diese Variable nicht erstellt wird, da anscheinend die Definition im Programm set(handle.MeinRadioButton1,'value',1) KEIN gültiges Change-Event ist, das eine Change-Fcn bzw. stellvertretend die SelectionChangeFcn aufruft.

Wie bringe ich dem dooofen Matlab nun meine programmtechnisch realisierte Vorauswahl bei??? Muss ich einen Umweg über eine weitere Fkt gehen, oder muss die Change-Fkt via set(..., change-fkt) angesprochen werden?

MFG und schönes WE
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: 10.07.2011, 01:32     Titel:
  Antworten mit Zitat      
Hey,

du kannst natürlich jeden Callback wie jede andere Funktion auch zu jeder Zeit aufrufen z.B.
Code:

function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to untitled (see VARARGIN)

set(handles.uipanel1,'SelectionChangeFcn',@change)
set(handles.radiobutton2,'Value',1)% radio setzen
change(handles.uipanel1,handles.radiobutton2)% callback aufrufen

% Choose default command line output for untitled
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

function change(hObj,evd)
if ishandle(evd) % manueller aufruf
    c = 1
else % aufruf wenn vom user geändert
    c = 2
end
 

Ich weiß wohl nicht wofür du es brauchst aber möglich ist es...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 11.07.2011, 10:44     Titel:
  Antworten mit Zitat      
Hallo Marco,

danke für dein Beispiel. Diesem entnehme ich, wie ich eine eigene Callback-Funktion:
> definiere (function change(hObj,evd) ...)
> zuweise (set(handles.uipanel1,'SelectionChangeFcn',@change)) und
> aufrufe (change(handles.uipanel1,handles.radiobutton2))

Allerdings klemmt es jetzt bei mir mit der Variable "eventdata", bei dir "evd" genannt. Diese verwendest du bei deinem Vorschlag ja fleißig. Leider ist mir die Verwendung dieser Variable nicht so vertraut und aus dem thread "hObject, eventdata, handles --Was ist das eigentlich???---" ([url] http://www.gomatlab.de/hobject-even.....das-eigentlich-t2683.html [/url]) werde ich nicht so richtig schlau.

Bisher habe ich die Werte einer Button-Group via switch-case mit get(eventdata.NewValue,'Tag') ausgelesen. Diese kann ich auch für das händische Ändern der Auswahl einbauen. Im Falle der Initialisierung (ishandle...) gibt es aber keine Variable "NewValue":

Code:


function change(hObj, evd, handles)

if ishandle(evd) % manueller aufruf
   c = 1
   %get(hObj.NewValue,'Tag')
else % aufruf wenn vom user geändert
   c = 2
   switch get(evd.NewValue,'Tag')   % Get Tag of selected object
      case 'radiobutton1'
         w = 1
      case 'radiobutton2'
         w = 2
      case 'radiobutton3'
         w = 3
   end
end

guidata(hObject, handles) % Übernehmen der Änderungen

 


Wie baue ich eine solche Abfrage auch in den ersten Fall ein?

Zitat:
Ich weiß wohl nicht wofür du es brauchst aber möglich ist es...


Ziel meiner Bemühungen ist ein Voreinstellen des UI über ein extra file zu definieren (m-function, in der ein struct definiert wird, dass alle Voreinstellungen enthält), damit Import- und Exportpfade und Bearbeitungsvarianten nicht immer eingegeben und angeklickt werden müssen.

MFG,
Germanus
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: 11.07.2011, 16:06     Titel:
  Antworten mit Zitat      
Hey,

klingt ja ganz sinnig was du da vorhast. Erstmal eine kurze Erklärung. Wenn der User das evend auslöst dann ist das hObject im Callback das uipanel indem sich die Radios befinden. In evenddata wird intern ein Struct erstellt mit 3 Feldern indem unter anderem NewValue und OldValue enthalten sind. Am besten debugge es mal und du wirst es sehen. Dies wird aber nicht ausgelöst wenn du manuell den Wert eines Radios änderst. Also habe ich einfach dem Callback beim manuellen Aufruf 2 handles mitübergen. Du kannst ihm auch andere Werte übergen also so benutzen wie eine normale function.

Also hast du nun mehrere Möglichkeiten dein Ziel zu erreichen.
1. Du setzt alles aus deiner Opening_fcn ohne auf die Callbacks zurückzugreifen
2. Du benutzt die Callbacks, musst diese aber ggf. anpassen (Unterscheidung ob evend oder manueller aufruf (z.B. bei uitables & Radios)) oder du erstellst in der Opening_fcn ein Struct welches gleich dem evenddata ist und übergibst dieses dem Callback z.B.
Code:

evd.EventName = 'SelectionChanged';
evd.NewValue = handles.radiobutton1;
evd.OldValue = handles.radiobutton2;
change(handles.uipanel1,evd)
 

3. Du schreibst eine Klasse mit passenden Methoden der du einfach dein Struct, welches du in deinem m-File erzeugt hast (bzw. bringst diese Funktionalität auch in der Klasse unter) übergibst und steuerst damit die GUI (dies setzt natürlich Kenntnisse in der oop voraus)

Ich benutzte nur die 1. & 3. Variante, wobei es immer auf den Umfang der GUI ankommt.

Ich hoffe das hilft dir weiter...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 12.07.2011, 07:01     Titel:
  Antworten mit Zitat      
Hallo,

@Marco: vielen Dank für die Hinweise. Gerade der Debugger hat mich ein wenig verstehen lassen, warum welche Fehlermeldung erscheint. Habe dann wie gesagt beim "manuellen Aufruf" kein "NewValue" gefunden, mich aber weiter auf die Suche begeben. Bei genauem Hinschauen habe ich gemerkt, dass ich, egal wie RadioButton manipuliert wurden, 'automatisch' auf ihre Stati (nach neuer Rechtschreibung Statuse oder Statusse?) zugreifen kann, wenn ich mit Children arbeite. Mit 'automatisch' meine ich, dass mir egal ist, wieviele Buttons ich habe und dass ich nicht einen speziellen Button als event übergeben möchte. Das Ganze habe ich dann in eine Funktion gepackt, die da lautet:

Code:

function KnopfNr = AktivenRadiobuttonFinden(hObject)

% hObject = die ButtonGroup, die die Radiobuttons vereint
% Die Radiobuttons sind Kind-Objekte der Buttongroup
% Achtung: die Buttons werden von unten nach oben gezählt, da das
% Koordinatensystem unten links liegt.

% Objekte der Radiobuttons (rbs) übergeben:
rbs = get(hObject,'Children');

% Den aktiven Radiobutton finden:
for child = 1:length(rbs)
   if get(rbs(child),'value')
      KnopfNr = length(rbs) + 1 - child; % Zählweise s.o. Anmerkung!!!
      return
   end
end

% Wenn kein Knopf aktiviert:
KnopfNr = 0;
 


Diese Funktion kann ich dann an verschiedensten Stellen verwenden. Als erstes mal kann der Callback einer jeden Buttongroup darauf zugreifen. Ebenso kann ich mein GUI z.B. in der OpeningFcn initialisieren bzw. schon im Guide Buttons vorauswählen. Anschließend ließe sich der Status mit der Funktion einfach auslesen.

So, ich danke für die Hilfe und hoffe auch so einigen Mitlesenden geholfen zu haben. Hoffentlich gibt es für genau mein Problem nicht schon eine direkte Matlab-interne Lösung. Gerne nehme ich auch Anregungen und Verbesserungsvorschläge entgegen.

MFG,
Germanus
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: 12.07.2011, 17:47     Titel:
  Antworten mit Zitat      
Hey,

wenn du einfach nach dem gewählten Radio suchen willst kannst du auch z.B. deine for Schleife weg lassen
Code:

function gew_radio = AktivenRadiobuttonFinden(hObject)
% Den aktiven Radiobutton finden:
gew_radio = findobj(get(hObject,'Children'),'Value',1);% handle des gewählten buttons
if ~isempty(gew_radio)
% ...
else
% ...
end
 


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 13.07.2011, 08:16     Titel:
  Antworten mit Zitat      
Hey Marco,

fein, mit findobj habe ich wieder einen neuen Befehl in mein Repertoire aufgenommen. Dank Debugger habe ich noch eine weitere interessante Variable gefunden, die genau unser ausgewähltes Element wiedergibt:

Code:

h_auswahl = findobj(get(hObject,'SelectedObject'))
 


Die 'Position' des Buttons, sprich ob Button eins, zwei, drei etc. lässt sich dann wie folgt ermitteln:

Code:

% Stück-für-Stück-Code:
function KnopfNr = AuswahlEntnehmen2(hObject)

rbs = get(hObject,'Children');
rb = findobj(get(hObject,'SelectedObject'));
anz = length(rbs);

if ~isempty(rb)
   KnopfNr = anz+1-find(rbs==rb);
else
   KnopfNr = 0;
end
 


Code:

% Code für "Ich-Schreibe-gerne-alles-in-eine-Zeile"
function KnopfNr = AuswahlEntnehmen2(hObject)

if ~isempty(findobj(get(hObject,'SelectedObject')))
   KnopfNr = length(get(hObject,'Children'))+1-find(get(hObject,'Children')==findobj(get(hObject,'SelectedObject')));
else
   KnopfNr = 0;
end
 



Was bedeutet denn die Zahl (value) eines handles (die man erhält, wenn man nicht get(handle,'XY...'), sondern handle eingibt)?

MFG,
Germanus
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: 13.07.2011, 11:42     Titel:
  Antworten mit Zitat      
Hey,

das steht auch gut in der Matlab Hilfe. Du kannst nach Handles mit pestimmten Propertieeigenschaften such wie in diesem Fall 'Value' == 1.

MfG Marco
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.