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

Toggle Button durch for schleife aktivieren/deaktivieren

 

Jonzi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2010, 16:13     Titel: Toggle Button durch for schleife aktivieren/deaktivieren
  Antworten mit Zitat      
Hey,

ich hab folgendes Problem. Ich versuche 16 Toggle Buttons mit einem Toggle Button zu Deaktivieren, wenn dieser gedrückt wird oder zu aktivieren wenn er wieder gedrückt wird.
Dies würde ich gerne mit einer for schleife realisieren. Da bisher sonst ich immer jedes einzelne Toggle Button handle ansteuere.

hier ist mal der auschnnit von meinem Code

Code:
%Programm
% --- Executes on button press in togall.
function togall_Callback(hObject, eventdata, handles)
% hObject    handle to togall (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 togall
if get(hObject,'Value')== 1
   
     set(handles.togall,'foregroundcolor',[1 0 0]);
   
      set (handles.tog1,'Enable','off')
      set (handles.tog2,'Enable','off')
      set (handles.tog3,'Enable','off')
      set (handles.tog4,'Enable','off')
      set (handles.tog5,'Enable','off')
      set (handles.tog6,'Enable','off')
      set (handles.tog7,'Enable','off')
      set (handles.tog8,'Enable','off')
      set (handles.tog9,'Enable','off')
      set (handles.tog10,'Enable','off')
      set (handles.tog11,'Enable','off')
      set (handles.tog12,'Enable','off')
      set (handles.tog13,'Enable','off')
      set (handles.tog14,'Enable','off')
      set (handles.tog15,'Enable','off')
      set (handles.tog16,'Enable','off')

 
else
   
       set(handles.togall,'foregroundcolor','default');
       set(handles.tog1,'Enable','on')
       set(handles.tog2,'Enable','on')
       set(handles.tog3,'Enable','on')
       set(handles.tog4,'Enable','on')
       set(handles.tog5,'Enable','on')
       set(handles.tog6,'Enable','on')
       set(handles.tog7,'Enable','on')
       set(handles.tog8,'Enable','on')
       set(handles.tog9,'Enable','on')
       set(handles.tog10,'Enable','on')
       set(handles.tog11,'Enable','on')
       set(handles.tog12,'Enable','on')
       set(handles.tog13,'Enable','on')
       set(handles.tog14,'Enable','on')
       set(handles.tog15,'Enable','on')
       set(handles.tog16,'Enable','on')

   
end
guidata(hObject,handles);
 


tog1-tog16 sind die anderen toggle buttons. ich würde gerne nicht 16mal set(...) hinschreiben müssen, sondern dass es mit einer vorschleife geht also z.B

Code:


for k=1:1:16

set(handles.tog'k','Enable','on')

end

 



Falls mir jemand helfend könnte oder einen Tipp hat wie man das realisieren kann wäre super!!


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 27.09.2010, 17:03     Titel:
  Antworten mit Zitat      
Hallo,

die Schleife saehe dann so aus:
Code:

for k = 1:16
    set(handles.(['tog' num2str(k)]),'Enable','off');
end
 

ALLERDINGS wuerde ich es nicht so machen, da es rel. langsam ist.

Mein Vorschlag: Wenn du das Tag der togglebuttons angibst, dann speichere einen markanten String oder eine Zahl unter "UserData" bei den Togglebuttons ab, die du im Programm ausblenden moechtest. Ich leg hier mal den String "Ausblenden" fest. Nun kannst du mit:
Code:

findobj(0, 'Style', 'togglebutton','UserData','Ausblenden');
 

genau die handles deiner gewuenschten Togglebuttons suchen und alle Togglebuttons mit einmal ausblenden:
Code:

set(findobj(0, 'Style', 'togglebutton','UserData','Ausblenden'),'Enable','off');
 


Dies ist etwas effizienter.

MFG

Sco
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: 27.09.2010, 17:42     Titel:
  Antworten mit Zitat      
Hallo Sco,

Zitat:
Code:

set(findobj(0, 'Style', 'togglebutton','UserData','Ausblenden'),'Enable','off');
 

Dies ist etwas effizienter.

Nicht im Allgemeinen. Wenn ich 20 Figures offen habe, auf denen jeweils 12 Axes mit je 20 Linien offen sind, sind das 5040 handles, die durchsucht werden müssen. Jeweils wird der Style verglichen. Das dauert lange.

Wenn man dagegen die handles statt in 'tog1', 'tog2' etc gleich in einem Array gespeichert hätte: 'tog(1)', 'tog(2)' etc wäre das ganz einfach. Ein weiteres schönes Beispiel dafür, dass man viel effizienter programmieren kann, wenn man nicht die Datenstruktur (also die Variablen-Namen) mit den Werten (hier die Zuordnung von Index zu Handle) vermischt.

Andere Lösung, wenn die entsprechenden Felder im handles-Strukt eindeutig erkannt werden können:
Code:

  Field = fieldnames(handles);
  Data = struct2cell(handles);
  Index = strncmp(Field, 'tog', 3);
  set ([Data{Index}], 'Enable', 'off');
 

Aber auch das klassifiziert wieder die Daten anhand der Variablen-Namen.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 27.09.2010, 17:58     Titel:
  Antworten mit Zitat      
Hallo Jan,

ok wenn es um Timing-dinge geht bist du wohl der Experte hier, wobei mich wirklich mal interessieren wuerde wo du all dieses doch sehr spezifische Wissen her hasst (ich bin immer wieder beeindruckt Smile). Dies aber nur am Rande...

Ansonsten find ich deine Loesung sehr gut, auch wenn ich zuvor eben erst den toc Array bilden muss. Da muesste man halt wissen ab wann (anzahl der objecte) welche Methode schneller ist?

MFG

Sco
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: 27.09.2010, 19:41     Titel:
  Antworten mit Zitat      
Hallo Sco,

ganz einfach: Probieren, probieren, probieren, probieren. :-)
Und einige Jahre Austausch in der CSSM-Newsgroup.

Die lange Liste von SET-Kommandos von Jonzi ist zwar nicht optimal oder hübsch, aber sie läuft immerhin unter allen Bedingungen in fast der selben Zeit (wohl wenige micro-Sekunden!).
Selbst wenn es länger wäre: Ein Benutzer gewöhnt sich sehr schnell daran, dass die Reaktion auf das Klicken 0.3 Sekunden dauert. Auch wenn es jedesmal 2.0 Sekunden braucht, gerät der Benutzer noch nicht in Stress. Falls die Zeiten aber zwischen 0.1 und 2 Sekunden schwanken, beginnt die Panik-Spirale:
1. der Nutzer klickt mehrfach, weil er denkt, das erstemal sei irgendwie daneben gegangen (als ob es sowas auf dem Computer gäbe!).
2. Die wiederholten Klicks heben ihre Wirkung gegenseitig auf.
3. Der 3- und 4-fach Klick wird versucht.
4. Stress. Der Nutzer beginnt das Handbuch zu lesen.
5. Darin findet er Fehler und fragt beim Support nach.
6. Der Support bereinigt den Bug, baut dabei aber 2 neue ein.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jonzi
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 28.09.10
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 28.09.2010, 08:35     Titel:
  Antworten mit Zitat      
Hallo Jan S und Sco,

danke euch beiden recht Herzlich für die Lösungsvorschläge. Ich habe auch schon an die Lösung von Jan mit dem array gedacht, aber nie hinbekommen. Aber ich werde jetzt gleich mal das mit dem Array ausprobieren und gebe euch dann auch bescheid ob es geklappt hat!

Danke für die Hilfe und die super lösungen! !

Gruß

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