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

Über GUI Optionsliste zusammenklicken und Map verändern

 

bmtil
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2016, 10:56     Titel: Über GUI Optionsliste zusammenklicken und Map verändern
  Antworten mit Zitat      
Hallo,
in meinem Code benutze ich eine Map mit dem Namen OPTIMISATIONS.
Über eine GUI möchte ich die Optionen die, über diese Map eingeschaltet werden verändern. Dazu erstelle ich (über die GUI) eine neue Liste von Optionen, diese Liste möchte ich dann gerne als neue Keys für die Map nutzen.

Hier eine Erklärung zu der GUI:

Über die Optimisation options Checkboxen, kann man auswählen welche Optionen ausgeführt werden sollen. Über den Button save Options sichert man seine Wahl, über den Button load options kann man sich die Optionen in die zweite Listbox reinladen. Über die Checkbox "enabled" kann man überprüfen welche Option tatsächlich ausgewählt ist. Ziel ist quasi, dass die neu zusammengeklickte Liste zu den Keys meiner Optimisation Map wird.

Hier ist der relevante Code Abschnitt, der gesamte Quellcode und die GUI figure sind angefügt:
Code:
% --- Executes on selection change in listbox5.
function listbox5_Callback(hObject, eventdata, handles)
% hObject    handle to listbox5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns listbox5 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from listbox5
changes(hObject, eventdata, handles);

% --- Executes during object creation, after setting all properties.
function listbox5_CreateFcn(hObject, eventdata, handles)
% hObject    handle to listbox5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: listbox controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
global OPTIMISATIONS;

new_list = OPTIMISATIONS.keys;
for a= 1 : length (new_list)
    new_list{a} = strrep(new_list{a}, ' ', '_');
end

set(hObject, 'String', new_list');


% --- Executes on button press in pbUpdate.
function pbUpdate_Callback(hObject, eventdata, handles)
% hObject    handle to pbUpdate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global OPTIMISATIONS
global debug
global verbose
global options_list

set(handles.listbox5,'String', options_list);

index = get(handles.listbox5, 'Value');
new_list = get(handles.listbox5, 'String');
if ~is_in(new_list{index}, {'debug', 'verbose'})
    OPTIMISATIONS(strrep(new_list{index},' ','_')) = get(handles.checkbox10, 'Value');
else
    if strcmp(new_list{index}, 'debug')
        debug = get(handles.checkbox10, 'Value');
    else
        verbose = get(handles.checkbox10, 'Value');
    end
end    


% --- Executes on button press in checkbox10.
function checkbox10_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox10 (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 checkbox10


% --- Executes during object creation, after setting all properties.
function checkbox10_CreateFcn(hObject, eventdata, handles)
% hObject    handle to checkbox10 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
try
    index = get(handles.listbox5, 'Value');
    new_list = get(handles.listbox5, 'String');
    set(hObject, 'Value', strrep(new_list{index},' ', '_'));
catch exception
end    


Leider komme ich absolut nicht weiter und könnte gerade echt in die Tastatur beißen. Ich hoffe sehr, hier wird mir geholfen vielen Dank!

save_model.m
 Beschreibung:

Download
 Dateiname:  save_model.m
 Dateigröße:  15.44 KB
 Heruntergeladen:  444 mal
save_model.fig
 Beschreibung:

Download
 Dateiname:  save_model.fig
 Dateigröße:  6.4 KB
 Heruntergeladen:  437 mal
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: 18.11.2016, 12:55     Titel: Re: Über GUI Optionsliste zusammenklicken und Map veränder
  Antworten mit Zitat      
Hallo bmtil,

Ich erkenne nicht auf Anhieb, was Deine Frage ist. Kannst Du die nochmal genau formulieren bitte?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2016, 10:34     Titel: Re: Über GUI Optionsliste zusammenklicken und Map veränder
  Antworten mit Zitat      
Danke für die Antwort. Ich formuliere das Problem neu:
Ich habe zum Beispiel fünf Checkboxen A bis E.
Die Strings A bis E entsprechen den Keys einer Map.
Wenn ich die Checkbox A klicke, soll die Option A in einer Listbox daneben erscheinen.
Unter der Listbox befindet sich der Button "load options". Wenn ich den klicke, dann sollen die in der Listbox stehenden Strings als Keys für die Optionsmap übernommen werden.

Das selbe Problem wurde von meinem Bekannten anders gelöst.
Er hat sich einfach nur eine Listbox gebaut, wo bereits alle Optionen (Keys) drin stehen. Wenn er nun in der Listbox einen String auswaehlt, hat er unter der Listbox eine Checkbox "enabled" und eben den Button "load options". Button "load options" speichert sozusagen die Listbox Optionen, wenn die über die Checkbox eingeschaltet oder eben nicht wurden. Das Problem dabei ist, es ist unübersichtlich, da man nicht sofort sieht, welche Optionen eingeschaltet wurden.

Viele Grüße und ein schönes Wochenende allen.

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke]
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: 19.11.2016, 14:25     Titel: Re: Über GUI Optionsliste zusammenklicken und Map veränder
  Antworten mit Zitat      
Hallo bmtil,

Dein Problem wird mir klar. Aber was ist jetzt Deine Frage?
An welcher Stelle kommst Du nicht weiter?



Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2016, 17:36     Titel:
  Antworten mit Zitat      
Hallo,
ich kann die Checkboxen erstellen, ich kann auch die String-Eintrage in die Listbox uebertragen, das einzige was ich nicht kann, ist das verändern der Keys der Map wenn ich auf den Button "load options" druecke.
Grüße.
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: 20.11.2016, 15:43     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Gut, wir kommen dem Probleme nahe. Bitte poste den Code-Abschnitt, in dem das geschehen soll und erkläre, welche Variablen "Keys" und "Map" entsprechen.

Anmerkung:
Code:
new_list = OPTIMISATIONS.keys;
for a= 1 : length (new_list)
    new_list{a} = strrep(new_list{a}, ' ', '_');
end

% Einfacher ohne Schleife:
new_list = strrep(OPTIMISATIONS.keys, ' ', '_');
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2016, 10:46     Titel:
  Antworten mit Zitat      
Hallo,
hier die Stelle im Code, welche die keys Verändern soll:

Code:
function pbUpdate_Callback(hObject, eventdata, handles)
% hObject    handle to pbUpdate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global OPTIMISATIONS
global debug
global verbose
global options_list

set(handles.listbox5,'String', options_list);

index = get(handles.listbox5, 'Value');
new_list = get(handles.listbox5, 'String');
if ~is_in(new_list{index}, {'debug', 'verbose'})
    OPTIMISATIONS(strrep(new_list{index},' ', '_')) = get(handles.listbox5, 'Value');
end
if (get(handles.cbDebug,'Value') == get(hObject, 'Max'))
    str_debug = 'debug';                                  
    debug = get(handles.cbDebug, 'Value')                   %debug muss nicht in die options_list geschrieben werden, da die Fkt. Debug sich nicht im OPTIMISATIONS container befindet    
end
if (get(handles.cbVerbose,'Value') == get(hObject, 'Max'))
    str_verbose = 'verbose';
    verbose = get(handles.cbVerbose, 'Value')               %siehe Debug
end


keys = sind die Strings "constant_propagation", "reduce_variables", "replace_operations", "resolve_static_conditions", "save_computations". Map ist die OPTIMISATIONS.

Vielen Dank für ihre Zeit.
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: 21.11.2016, 11:37     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Und was soll nun in diesem Code-Abschnitt geschehen?

Zitat:
keys = sind die Strings "constant_propagation", "reduce_variables", "replace_operations", "resolve_static_conditions", "save_computations". Map ist die OPTIMISATIONS.

Das sagt mir noch nichts. Wo tauchen diese Strings auf und was möchtest Du damit tun?

Was genau bedeutet "verändern der Keys der Map"? Ich weiß nicht, was eine "Map" ist. Wie versuchst Du denn die Keys zu ändern und was funktioniert dabei nicht?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2016, 12:03     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo bmtil,

Und was soll nun in diesem Code-Abschnitt geschehen?

In diesem Codeabschnitt soll die globale Variable OPTIMISATIONS, die ich als fälschlicherweise als "Map" bezeichnet hab, verändert werden.

Jan S hat Folgendes geschrieben:

Zitat:
keys = sind die Strings "constant_propagation", "reduce_variables", "replace_operations", "resolve_static_conditions", "save_computations". Map ist die OPTIMISATIONS.

Das sagt mir noch nichts. Wo tauchen diese Strings auf und was möchtest Du damit tun?

Diese Strings stehen in der globalen Variable "OPTIMISATIONS". Zusätzlich werden diese Strings in die globale Variable "options_list" geschrieben, wenn ich die jeweiligen Checkboxen klicke.

Jan S hat Folgendes geschrieben:

Was genau bedeutet "verändern der Keys der Map"? Ich weiß nicht, was eine "Map" ist. Wie versuchst Du denn die Keys zu ändern und was funktioniert dabei nicht?

"Verändern" bedeutet "Ersetzen" der Strings, welche in OPTIMISATIONS stehen mit den Strings in "options_list".

Grund dafür: Die Variable OPTIMISATIONS behält quasi die Optionen für verschiedene Optimierungen, und zeigt dabei an der anderen Stelle des Projektes auf eine Matrix "optimizing". Die Matrix besteht nur aus einer Zeile, die Anzahl und Position der Elemente entspricht der Anzahl und Position der Strings in OPTIMISATIONS. Je nachdem welche Option in OPTIMISATIONS gesetzt ist, soll sich der entsprechende Wert in "optimizing" von 0 auf 1 ändern. Vorher musste man für jede Veränderung der Optionen den Button klicken, ich möchte quasi über die Checkboxen jeweiligen Optionen auswählen und dann mit einem Buttonclick die "options_list" in OPTIMISATIONS laden und gleichzeitig damit die Matrix "optimizing" Verändern.
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: 21.11.2016, 14:57     Titel:
  Antworten mit Zitat      
Hallo bmtil,

Was ist der Zweck dieser Zeile:
Code:
OPTIMISATIONS(strrep(new_list{index},' ', '_')) = get(handles.listbox5, 'Value');

? Die Variable "OPTIMISATIONS" enthält die Strings "constant_propagation", "reduce_variables", "replace_operations", "resolve_static_conditions", "save_computations", also ist es ein Cell-String, oder?
Diese Variable soll nun verändert werden, und "options_list" auch. Wo ist dann der Unterschied zwischen den beiden Variablen?

Zitat:
"Verändern" bedeutet "Ersetzen" der Strings, welche in OPTIMISATIONS stehen mit den Strings in "options_list".

Du möchtest die Strings, die in OPTIMISATIONS stehen mit denen ersetzen, die in "options_list" stehen.

Puh.

Eigentlich geht es nur darum, ein paar Strings mit einem GUI zusammen zu stellen, oder? Das kann nicht so kompliziert sein.
Die Verwendung globaler Variablen ist immer ein umständliches und fehleranfälliges Unterfangen. Darum sind globals unter vielen professionellen Programmieren ausgesprochen verpönt. Aber hier macht es das Problem nur unwesentlich schwerer (zumindest zur Zeit), denn die hautpsächliche Schwieirigkeit ist es zu definieren, wann welcher Uner-Input welche Veränderung vornehmen soll.
Ich kann Dir bisher noch nicht folgen und habe so auch keinen Vorschlag zur Lösung.

Ausdrücke wie "OPTIMISATIONS container" machen das Verstehen schwieriger.

Was macht eigentlich "~is_in"? Das, was der Name suggeriert?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bmtil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 01.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2016, 15:24     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo bmtil,

Was ist der Zweck dieser Zeile:
Code:
OPTIMISATIONS(strrep(new_list{index},' ', '_')) = get(handles.listbox5, 'Value');

? Die Variable "OPTIMISATIONS" enthält die Strings "constant_propagation", "reduce_variables", "replace_operations", "resolve_static_conditions", "save_computations", also ist es ein Cell-String, oder?
Diese Variable soll nun verändert werden, und "options_list" auch. Wo ist dann der Unterschied zwischen den beiden Variablen?


Es geht immer darum die Werte in der "optimizing" Matrix zu verändern (von 0 auf 1) und ich habe mir folgendes gedacht:
Wenn ich mit dem Buttonclick meine options_list in die listbox reinlade, dann kann ich die Werte der "optimizing" matrix überschreiben wenn ich die Handles der Listbox hole. Die Zeile hat sich allerdings als falsch herausgestellt, weil das Handle der Listbox immer nur 1 oder 0 ist und nicht zum Beispiel 00000, wo jede 0 fuer einen String, der in der Listbox geschrieben wird, steht.

Bei meinem Vorgänger hat es Sinn gemacht die Handles der Listbox zu holen, weil er mit jedem Buttonclick die Werte in der "optimizing" matrix verändert hat.

Jan S hat Folgendes geschrieben:

Zitat:
"Verändern" bedeutet "Ersetzen" der Strings, welche in OPTIMISATIONS stehen mit den Strings in "options_list".

Du möchtest die Strings, die in OPTIMISATIONS stehen mit denen ersetzen, die in "options_list" stehen.

Puh.

Eigentlich geht es nur darum, ein paar Strings mit einem GUI zusammen zu stellen, oder? Das kann nicht so kompliziert sein.

Ist es auch nicht, habs ja hingekriegt Very Happy, ich kann mir ja die Liste zusammenklicken und diese in die Listbox mit einem Buttonclick laden.

Jan S hat Folgendes geschrieben:

Die Verwendung globaler Variablen ist immer ein umständliches und fehleranfälliges Unterfangen. Darum sind globals unter vielen professionellen Programmieren ausgesprochen verpönt. Aber hier macht es das Problem nur unwesentlich schwerer (zumindest zur Zeit), denn die hautpsächliche Schwieirigkeit ist es zu definieren, wann welcher Uner-Input welche Veränderung vornehmen soll.
Ich kann Dir bisher noch nicht folgen und habe so auch keinen Vorschlag zur Lösung.

Ausdrücke wie "OPTIMISATIONS container" machen das Verstehen schwieriger.

Was macht eigentlich "~is_in"? Das, was der Name suggeriert?

Gruß, Jan


Das mit den globalen Variablen ist mir bewusst und ich möchte es auch besser machen. Ich fange gerade erst so richtig mit dem Programmieren an und bin da sehr erschreckt von der Tatsache, wie wenig mir die vorhandenen Kommentare helfen. Die Variablen OPTIMISATIONS, debug und verbose müssen allerdings global bleiben, da diese noch an weiteren Stellen im Projekt verwendet werden. "options_list" könnte ich aber tatsächlich besser formulieren, damit das "global" davor wegfaellt.

Zu den User Inputs zusammengefasst:
Checkbox 1 bis 5.
Für jede Checkbox 1 bis 5 gibt es einen String.
Unter den Checkboxen 1-5 gibt es einen Button "save_options".
Beim Drücken des Buttons "save_options" werden die Strings in daneben stehende Listbox reingeladen, welche über die Checkboxen 1-5 ausgewählt wurden (quasi das was in der Variable "options_list" steht).
Unter der Listbox gibt es den Button "load_options", beim Drücken von diesen, werden die entsprechenden Strings in die globale Variable OPTIMISATIONS (OPTIMISATIONS ist eine Map, die Keys entsprechen den Strings von den Checkboxen) geladen und dadurch werden die entsprechenden Optionen im Code eingeschaltet.
Das Einschalten der Optionen passiert an einer anderen Stelle im Projekt:
Code:
opt_matrix = cellfun(@num2str, OPTIMISATIONS.values);                              %werden optimisation optionen eingeschaltet
line{end + 1} = sprintf('%s system: %s from %s %s', MNEMONIC('Comment'), ...
    system_name, date, time);
line{end + 1} = sprintf('%s creator: %s', MNEMONIC('Comment'), user_name);
line{end + 1} = sprintf('%s strategy: %s; optimitizing: %d; optimsations: %s', ...
    MNEMONIC('Comment'), strategy_name, optimizing, opt_matrix);


Zu "~is_in", es ist tatsächlich nur die negierte "is_in" Aussage, welche mir den Index des Elements rausgibt, falls das Element in der Liste ist.
Grüße, Michael.
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.