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

delete(handle) löscht die Objekte nicht

 

mr. edd
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 12.04.10
Wohnort: ---
Version: 2009a
     Beitrag Verfasst am: 12.04.2010, 13:10     Titel: delete(handle) löscht die Objekte nicht
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Problem mit zur Laufzeit erstellten GUI-Controls:

Ich habe eine variable Anzahl an Signalbestandteilen (nach einer Transformation), die jeweils mit einem Slider oder edit-Feld zusammen dargestellt werden sollen. Über diesen Slider oder den Eintrag im Edit-Feld lässt sich dann die Gewichtung des Kanals für die Rücktransformation einstellen (einfache Filterbank).

Ändere ich nun die Anzahl der dargestellten Kanäle, so ist mein bisheriger Ansatz, die nicht mehr benötigten alten Slider zu löschen und einfach passend neue zu erstellen. (Ich weiß, das kann man optimieren) Die alten Slider werden nach einem delete aber nicht gelöscht!
Soll heißen, dass Sie immer noch sichtbar sind. Somit "mülle" ich mir die Oberfläche mit alten Slidern zu. Erst nach einem resize sind alle gelöschten Slider wirklich weg.

Schreibe ich hingegen eine Funktion, die nichts anderes macht, als die alten Slider zu löschen und verknüpfe sie mit einem Button, funktioniert das Löschen der Slider. Wo ist da der Unterschied?

Hier sind die einzigen Stellen, wo auf die Handles der Slider zugegriffen wird:
(die Initialisierung mit handles.slider=[]; mal außen vor gelassen.)
Code:
function handles = updatePlots(handles)
%% alte Controls löschen
delete( handles.slider );
handles.slider = [];

%% Teile plotten
handles.slider = zeros(1, handles.numberOfParts);
for i = 1:handles.numberOfParts
    %% Teil plotten
    ...
    %% Slider erstellen
    ... %Position und Größe berechnen
    handles.slider(i) = uicontrol( 'Parent', handles.axesframe, 'Style', 'slider', ... );
end


Verknüpfe ich diese Funktion mit einem Button, so funktioniert das delete einwandfrei:
Code:
function handles=deleteSlider(handles)
delete( handles.slider );
handles.slider = [];


Wer weiß Rat und kann helfen?

Gruß,
Christoph

[edit]drawnow; und refresh(handles.figure); bringen auch keine Abhilfe.[/edit]
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.04.2010, 14:17     Titel:
  Antworten mit Zitat      
Hallo , an welcher Stelle hast du denn drawnow, eingesetzt?
Private Nachricht senden Benutzer-Profile anzeigen
 
mr. edd
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 12.04.10
Wohnort: ---
Version: 2009a
     Beitrag Verfasst am: 12.04.2010, 17:22     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo , an welcher Stelle hast du denn drawnow, eingesetzt?


Ups, vergessen.
Drawnow und refresh() standen hinter der for-Schleife.

Gruß,
Christoph
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.04.2010, 21:09     Titel:
  Antworten mit Zitat      
Zitat:

Ups, vergessen.
Drawnow und refresh() standen hinter der for-Schleife.


Dann setze drawnow direkt nach delete-Befehl.

GUI braucht Zeit, um sich zu aktualisieren. Es passiert meist automatisch, wenn Matlab nicht beschäftigt ist, oder wenn Fuktion Ausführung zu Ende ist
(wie bei deinem pushbutton).
Bei UpdatePlots löscht zu zwar die alten Sliders, erzeugst aber in der Schleife sofort die neuen Slider, da merkst du doch nicht mal, ob die Slider weg sind
Private Nachricht senden Benutzer-Profile anzeigen
 
mr. edd
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 12.04.10
Wohnort: ---
Version: 2009a
     Beitrag Verfasst am: 13.04.2010, 08:03     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Dann setze drawnow direkt nach delete-Befehl.

Das funktioniert. *verwirrt*

denny hat Folgendes geschrieben:
GUI braucht Zeit, um sich zu aktualisieren. Es passiert meist automatisch, wenn Matlab nicht beschäftigt ist, oder wenn Fuktion Ausführung zu Ende ist
(wie bei deinem pushbutton).

Warum spielt die Durchlaufzeit von drawnow eine Rolle? drawnow braucht x ms um die GUI zu aktualisieren. Ob direkt nach dem delete oder erst nach dem Erstellen der neuen Slider sollte doch egal sein, oder? Wenn drawnow einen Hintergrund-Task anstößt ist es doch erst recht egal.
So muss doch sogar zwei Mal drawnow aufgerufen werden: Einmal von mir, nach dem Löschen der alten Slider und dann erneut von Matlab, wenn die Funktion durchgelaufen ist und die neuen Slider angezeigt werden müssen...

Bitte klär mich über meinen Denkfehler auf.

denny hat Folgendes geschrieben:
Bei UpdatePlots löscht zu zwar die alten Sliders, erzeugst aber in der Schleife sofort die neuen Slider, da merkst du doch nicht mal, ob die Slider weg sind

Die neuen Slider werden an anderen Positionen erzeugt. Wenn ich von sechs angezeigten Kanälen auf zwei Kanäle wechsel und dann acht Slider auf dem Bildschirm habe, bin ich mir ziemlich sicher, dass die alten noch da sind. Wink

Gruß,
Christoph
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.04.2010, 09:08     Titel:
  Antworten mit Zitat      
Hallo
Zitat:

Warum spielt die Durchlaufzeit von drawnow eine Rolle? drawnow braucht x ms um die GUI zu aktualisieren. Ob direkt nach dem delete oder erst nach dem Erstellen der neuen Slider sollte doch egal sein, oder? Wenn drawnow einen Hintergrund-Task anstößt ist es doch erst recht egal.
So muss doch sogar zwei Mal drawnow aufgerufen werden: Einmal von mir, nach dem Löschen der alten Slider und dann erneut von Matlab, wenn die Funktion durchgelaufen ist und die neuen Slider angezeigt werden müssen...


Nein, wenn matlab beschäftigt ist, dann hat er keine Zeit die GUIs zu aktualisieren. Drawnow sagt aber matlab, das er soll jetzt an dieser Stelle GUI aktualisieren.

Schau einfach dir noch diese Beispiele an,
hier kein drawnow -- kein Wechsel zwischen plots
Code:

figure;
for k=1:100
 plot(round(rand(10)*100));
end
 



mit drawnow funktioniert der Wechsel zwischen plots
Code:

figure;
for k=1:100
 plot(round(rand(10)*100));
 drawnow;
end
 


setze ich pause rein, werden auch plots aktualisiert
Code:

figure;
for k=1:100
 plot(round(rand(10)*100));
 pause(1);
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
mr. edd
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 12.04.10
Wohnort: ---
Version: 2009a
     Beitrag Verfasst am: 13.04.2010, 09:55     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Nein, wenn matlab beschäftigt ist, dann hat er keine Zeit die GUIs zu aktualisieren. Drawnow sagt aber matlab, das er soll jetzt an dieser Stelle GUI aktualisieren.

Ok.

denny hat Folgendes geschrieben:
Schau einfach dir noch diese Beispiele an

Im Gegensatz zu deinen Beispielen, brauche ich das GUI-Element nicht mehrfach. Bei deinen Beispielen ist mir klar, dass da irgendwie ein GUI-Update nötig ist. Vergleichbar mit meinem Beispiel wäre aber eher, wenn Du mehrere Plots erstellst.
Ich möchte ja nicht den selben Slider mehrfach verwenden sondern einfach nur ein paar alte Controls löschen und danach ein paar neue erstellen.

Mir ist auch nach deinen Beispielen noch nicht klar, warum das drawnow direkt hinter dem delete wirkt, aber nach der for-Schleife nicht. Die alten Slider sind in beiden Fällen vorher gelöscht worden.

Code:
delete(slider); % <===
drawnow;

for i =1:numberOfParts
    slider(i) = uicontrol(...);
end

funktioniert,
Code:
delete(slider); % <===

for i = 1:numberOfParts
    slider(i) = uicontrol(...);
end
drawnow;

funktioniert hingegen nicht. In beiden Fällen sind die alten Slider aber vor dem drawnow gelöscht worden. Ich hoffe, damit wird mein Verständnisproblem deutlicher.

Gruß,
Christoph
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.04.2010, 12:49     Titel:
  Antworten mit Zitat      
Ach warum bei plot verhält sich das schon ähnlich. plot löscht auch jedesmal komplett die Axes und zeichnet die Linien neu.

Code:

delete(slider); % <===
% Elemente wurden gelöscht,
% GUI muss aktualisiert werden,
% dafür wird  aber sofort nächste Zeile ausgeführt.
% Matlab ist beschäftigt und hat keine Zeit GUI neu zu zeichnen

for i = 1:numberOfParts
    % wenn ich mich nicht irre, dann
    %  veranlasst  uicontrol nur die Änderung zu zeichnen
    slider(i) = uicontrol(...);
end

drawnow;
% erst hier sind die alten Sliders weg.
 




Code:

delete(slider); % <===
% Elemente wurden gelöscht,
drawnow
% drawnow veranlasst, komplett die GUI zu aktualisieren
% erst dann wird weiter mir Ausführung von deinem Code fortgesetzt

for i = 1:numberOfParts
    % wenn ich mich nicht irre, dann
    %  veranlasst  uicontrol nur die Änderung zu zeichnen
    slider(i) = uicontrol(...);
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
mr. edd
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 12.04.10
Wohnort: ---
Version: 2009a
     Beitrag Verfasst am: 14.04.2010, 12:44     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Code:
delete(slider); % <===
% [...]

for i = 1:numberOfParts
    % [...]
    slider(i) = uicontrol(...);
end

drawnow;
% erst hier sind die alten Sliders weg.  <=== Nein, eben nicht, die alten Slider bleiben sichtbar!!!


Zur Verdeutlichung habe ich drei Screenshots gemacht: (Aus den Slidern sind in der Zwischenzeit edit-Felder geworden, das Phänomen bleibt aber bestehen.)
  • Ausgangslage: Originalsignal in grün, darunter die ersten sechs Signalteile in blau.
  • drawnow nach delete: Originalsignal in grün, darunter die ersten beiden Signalanteile in blau. Es sind nur noch die beiden neuen controls sichtbar.
  • drawnow nach for-Schleife: Originalsignal in grün, darunter die ersten beiden Signalanteile in blau. Die alten Controls aus der sechser-Ansicht sind immer noch da.


In der angehängten GUI kann man sehen, dass drawnow erst beim zweiten Aufruf die gelöschten Slider auch aus der Anzeige entfernt. Die Screenshots im zip-Archiv zeigen das Verhalten auf meinem Rechner.


Gruß,
Christoph

test.zip
 Beschreibung:
Kleine Test-GUI mit Screenshots.

Download
 Dateiname:  test.zip
 Dateigröße:  219.99 KB
 Heruntergeladen:  565 mal
drawnow nach for-Schleife.png
 Beschreibung:
So sieht es aus, wenn das drawnow nach der for-Schleife kommt und nicht unmittelbar nach dem delete.

Download
 Dateiname:  drawnow nach for-Schleife.png
 Dateigröße:  12.75 KB
 Heruntergeladen:  919 mal
drawnow nach delete.png
 Beschreibung:
So sollte es immer aussehen.

Download
 Dateiname:  drawnow nach delete.png
 Dateigröße:  8.08 KB
 Heruntergeladen:  900 mal
Ausgangslage.png
 Beschreibung:

Download
 Dateiname:  Ausgangslage.png
 Dateigröße:  11.5 KB
 Heruntergeladen:  937 mal
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.