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

Funktionen In-/Output oder varargin{3} / Callbacks ?!

 

mat123lab2
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2014, 15:29     Titel: Funktionen In-/Output oder varargin{3} / Callbacks ?!
  Antworten mit Zitat      
Hallo Matlabprofis,

ich bin neu im Programmieren mit Matlab und benötige ein schubser und etwas Hilfe.
Ich möchte eine GUI ohne guide Programmieren. Dabei habe ich anscheind noch nicht richtig verstanden, wie man aus Funktionen Daten an andere Funktionen übergibt.
Hier im Code starte ich eine GUI1mit 4 Editfeldern. Wenn man den Pushbutton bestätigt, öffnet sich eine neue GUI2 mit 4 Editfeldern und einem Pushbutton. Trägt man in ein beliebiges Feld (aus GUI2) etwas ein und drückt ENTER oder wählt ein anderes Feld aus, werden die Zeichen im Fenster 1 dargestellt. Leider aber in allen und nicht
GUI1 Feld 1 == GUI2 Feld1
GUI1 Feld 2 == GUI2 Feld2
GUI1 Feld 3 == GUI2 Feld3
GUI1 Feld 4 == GUI2 Feld4

Was mache ich falsch?

Ich verstehe nicht genau wie varargin{3} funktioniert. Warum 3? Keine andere Zahl geht... Kann man varargin umgehen ? Ich habe schon verstanden das Varargin ein Variable-length input argument list ist, aber anscheind nicht verstanden Sad
Beim Callback übergebe ich G und dann geht nur bei der neuen Fkt [] = pb_call(varargin) ?? Wieso kann ich da nicht ein Variablennamen wie a vergeben??

Hier mein Code:


Code:
function [] = GUI()

G.win = figure('units','pixels',...
              'position',[40 80 600 600],...
              'menubar','none',...
              'numbertitle','off',...
              'name','GUI_24',...
              'resize','on');
G.ed1 = uicontrol('style','edit',...
                 'units','pix',...
                'position',[10 120 180 60],...
                'string','Data');
           
G.ed2 = uicontrol('style','edit',...
                 'units','pix',...
                'position',[50 180 180 60],...
                'string','Data');
           
G.ed3 = uicontrol('style','edit',...
                 'units','pix',...
                'position',[70 240 180 60],...
                'string','Data');
           
G.ed4 = uicontrol('style','edit',...
                 'units','pix',...
                'position',[90 300 180 60],...
                'string','Data');
                     
G.pb = uicontrol('style','pushbutton',...
                 'units','pix',...
                'position',[10 20 180 30],...
                'string','Push to Get Data',...
                'callback',{@pb_call,G});
           
           
function [] = pb_call(varargin)
% Callback for pushbutton.
G = varargin{3};  
f = figure('units','pixels',...
       'menubar','none',...
       'position',[700 80 600 600]); % Create a new GUI.
E1 = uicontrol('style','edit',...
              'units','pixels',...
              'position',[10 20 180 60],...
              'string','Type something, press return.',...
              'callback',{@E_call,varargin{3}});
     
     
E2 = uicontrol('style','edit',...
              'units','pixels',...
              'position',[30 80 180 60],...
              'string','Type something, press return.',...
              'callback',{@E_call,varargin{3}});  
   
       
E3 = uicontrol('style','edit',...
              'units','pixels',...
              'position',[50 160 180 60],...
              'string','Type something, press return.',...
              'callback',{@E_call,varargin{3}});  
     
     
E4 = uicontrol('style','edit',...
              'units','pixels',...
              'position',[70 220 180 60],...
              'string','Type something, press return.',...
              'callback',{@E_call,varargin{3}});  
     
         
pb = uicontrol('style','pushbutton',...
                 'units','pix',...
                'position',[10 300 180 30],...
                'string','Push to Get Data',...
              'callback',{@E_call,varargin{3}});            
         
%uicontrol(E1);
%uicontrol(E2);
%uicontrol(E3);
%uicontrol(E4);      
set(G.win,'deletefcn',{@fig_delet,f})    



function [] = E_call(varargin)
% Callback for secondary GUI editbox.
G = varargin{3};  % Get the structure.
set(G.ed1,'string',get(gcbo,'string'))  
set(G.ed2,'string',get(gcbo,'string'))
set(G.ed3,'string',get(gcbo,'string'))  
set(G.ed4,'string',get(gcbo,'string'))  
%close(gcbf)  % Close secondary GUI.


function [] = fig_delet(varargin)
% Executes when user closes GUI.
try
    delete(varargin{3})
catch
    % Do nothing.
end




Für Hilfe wäre ich sehr DANKBAR!!

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 30.12.2014, 20:29     Titel: Re: Funktionen In-/Output oder varargin{3} / Callbacks ?!
  Antworten mit Zitat      
Hallo,

mat123lab2 hat Folgendes geschrieben:
Trägt man in ein beliebiges Feld (aus GUI2) etwas ein und drückt ENTER oder wählt ein anderes Feld aus, werden die Zeichen im Fenster 1 dargestellt. Leider aber in allen und nicht
GUI1 Feld 1 == GUI2 Feld1
GUI1 Feld 2 == GUI2 Feld2
GUI1 Feld 3 == GUI2 Feld3
GUI1 Feld 4 == GUI2 Feld4

Was mache ich falsch?

Es wird bei Eingabe von Enter (aber auch bei Klick des Buttons pb in Figure 2) die Funktion E_call aufgerufen, in der jedes mal alle Strings der Edit-Boxen in GUI_24 geändert werden:
Code:
function [] = E_call(varargin)
% Callback for secondary GUI editbox.
G = varargin{3};  % Get the structure.
set(G.ed1,'string',get(gcbo,'string'))  
set(G.ed2,'string',get(gcbo,'string'))
set(G.ed3,'string',get(gcbo,'string'))  
set(G.ed4,'string',get(gcbo,'string'))  
%close(gcbf)  % Close secondary GUI.

Du überschreibst hier alle vier Strings mit den Daten aus string in gcbo ('Handle of object whose callback is executing'; also das Edit-Feld, in dem Enter gedrückt wurde).

Du könntest für jede Edit-Box eine eigene Funktion E_call erzeugen, so dass nur das bearbeitete Feld in GUI_24 übertragen wird:
Code:
function [] = E1_call(varargin)
% Callback for secondary GUI editbox.
G = varargin{3};  % Get the structure.
set(G.ed1,'string',get(gcbo,'string'))

function [] = E2_call(varargin)
% Callback for secondary GUI editbox.
G = varargin{3};  % Get the structure.
set(G.ed2,'string',get(gcbo,'string'))

% ...

In pb_call musst du dann entsprechend die Callbacks der Edit-Felder anpassen.



mat123lab2 hat Folgendes geschrieben:
Ich verstehe nicht genau wie varargin{3} funktioniert. Warum 3? Keine andere Zahl geht... Kann man varargin umgehen ? Ich habe schon verstanden das Varargin ein Variable-length input argument list ist, aber anscheind nicht verstanden Sad
Beim Callback übergebe ich G und dann geht nur bei der neuen Fkt [] = pb_call(varargin) ?? Wieso kann ich da nicht ein Variablennamen wie a vergeben??

Zu varargin: http://de.mathworks.com/help/matlab.....?searchHighlight=varargin
Bei Verwendung von varargin kann man beliebig viele Parameter übergeben ohne diese explizit in der Parameterliste der Funktion auflisten zu müssen. Ein Anwendungsfall ist bspw, wenn man die Funktion mehrfach aufruft und dabei nicht jedes mal die gleiche Anzahl Parameter übergibt. In der aufgerufenen Funktion kann man dann bspw. die Anzahl der Parameter abfragen und abhängig davon ggf unterschiedliche Berechnungen in der Funktion ausführen.

Man kann alternativ auch die zu übergebenden Parameter benennen. In deinem Code bspw.
Code:
function [] = pb_call(a,b,g)
% Callback for pushbutton.
G = g;
% ...

% oder
function [] = pb_call(~,~,g)
% ...


Wie groß varargin ist, hängt davon ab wieviele Parameter letztlich übergeben wurden. varargin(1) und varargin(2) enthalten Daten zum aufrufenden Objekt, varargin(3) enthält das übergebene G. Wenn man mehr Daten übergibt, wird varargin entsprechend größer.


Ich hoffe, das bringt etwas Licht ins Dunkel.


Einige nützliche Links:
Wie man Daten zw. GUI teilt: http://de.mathworks.com/help/matlab.....llbacks.html?refresh=true
41 Bsp. zur GUI-Programmierung: http://de.mathworks.com/matlabcentr.....-41-complete-gui-examples

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
mat123lab2
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2015, 12:13     Titel:
  Antworten mit Zitat      
danke für die schnelle Hilfe!
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.