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 auslagern

 

fenderbender
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 17.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2010, 07:32     Titel: Funktionen auslagern
  Antworten mit Zitat      
Hallo,

mein gui.m ist mittlerweile ganz schön groß und unübersichtlich geworden....

Ist es möglich einzelne functions auszulagern in eine extra Datei.
Allerdings sollten alle auf die selben GUI-Eingabefelder zugreifen können.

Ist das ohne große Umstände möglich?

Danke
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 12.09.2010, 08:38     Titel:
  Antworten mit Zitat      
Selbstverständlich. Einfach wie gewohnt die Funktion mindestens mit handles callen und in ein eigenes .m-File schreiben.
Private Nachricht senden Benutzer-Profile anzeigen
 
fenderbender
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 17.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2010, 08:40     Titel:
  Antworten mit Zitat      
Danke für die Antwort.
Was meinst du damit: ..?

eupho hat Folgendes geschrieben:
mindestens mit handles callen .
Private Nachricht senden Benutzer-Profile anzeigen
 
kakoh
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 03.09.10
Wohnort: Tübingen
Version: ---
     Beitrag Verfasst am: 12.09.2010, 08:42     Titel:
  Antworten mit Zitat      
Die gui.m Datei mit allen dazugehörenden Funktionen soll normallerweise bloß die Struktur des GUIs darstellen. Die ganzen Ausrechnungen usw. soll man in die extra Funktionen einpacken.
_________________

www.katja-steffen.de
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 12.09.2010, 08:52     Titel:
  Antworten mit Zitat      
Ich meine damit, dass du die ausgelagerte Funktion mit

funktionsname(hObject, eventdata, handles, weiterevariablen)

aufrufst, wobei dann der Dateiname "funktionsname.m" sein sollte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2010, 14:21     Titel:
  Antworten mit Zitat      
hallo, ich habe folgenden code in 2 mfile dateien:

Code:
% testfunktion2.m
function [] = testfunktion2()

S.fh = figure();

S.pb = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[50 200 150 40],...
                  'string','Button',...
                  'fontsize',12);
             
set(S.pb,'callback',{@pb_call,S})

function [] = pb_call(varargin)
[S] = varargin{3};
    set(S.pb,'visible','off')
    testfunktion3


und


Code:
% testfunktion3.m
S.ed(1) = uicontrol('style','edit',...
                    'unit','pix',...
                    'position',[410 290 70 30],...
                    'string','');


wenn ich den "Button" drücke, dann wird "testfunktion3" aufgerufen und es erscheint ein kleines editfenster an position so und so.

1) kann wir jemand sagen, mit welchen befehl/code ich diese "testfunktion3" wieder ausschalte, sodass dieses editfenster verschwindet?

2) kann mir jemand diese zeile "[S] = varargin{3};" erklären? warum muss in den geschweiften klammer die "3" stehen? und warum bei z.b. bei einer "2" sich der button nicht reagiert?

für hilfe wäre ich sehr dankbar! Smile
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.09.2010, 18:52     Titel:
  Antworten mit Zitat      
Hallo,
Zitat:

1) kann wir jemand sagen, mit welchen befehl/code ich diese "testfunktion3" wieder ausschalte, sodass dieses editfenster verschwindet?

Code:


Zitat:

2) kann mir jemand diese zeile "[S] = varargin{3};" erklären? warum muss in den geschweiften klammer die "3" stehen? und warum bei z.b. bei einer "2" sich der button nicht reagiert?

Code:

Die Dokumentation von Matlab ist sehr hilfreich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2010, 20:18     Titel:
  Antworten mit Zitat      
hab noch einen button hinzugefügt, mit dem ich das editfenster wieder entfernen möchte..das grundproblem ist aber geblieben.

Code:
ist zwar hilfreich, jedoch für mich als anfänger nicht hilfreich genug... kann mir vllt jemand etwas mehr helfen?

Code:
% testfunktion2.m
function [] = testfunktion2()

S.fh = figure();

S.pb(1) = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[50 200 150 40],...
                  'string','An',...
                  'fontsize',12);
S.pb(2) = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[50 350 150 40],...
                  'string','Aus',...
                  'fontsize',12);

             
set(S.pb(:),'callback',{@pb_call,S})

function [] = pb_call(varargin)
[h,S] = varargin{[1,3]};

switch h
    case S.pb(1)
         testfunktion3
    case S.pb(2)
         % was soll ich hier schreiben, um testfunktion3 wieder zu schließen?
 


p.s. und die varargin zeile ist mir immer noch unklar...
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.09.2010, 21:44     Titel:
  Antworten mit Zitat      
Hallo Gast,

man kann eine Funktion nicht schließen. Ich nehme an, Du möchtest das UICNTROL-Objekt löschen.
Wenn Du es so erzeugt hast:
Code:

Und Du dafür gesorgt hast, dass S im GUI auch zugänglich ist, kannst Du da Objekt so wieder löschen:
Code:


VARARGIN wird in "help varargin" und "doc varargin" eigentlich erschöpfend erklärt. Besser kann ich das auch nicht. Aber Du selbst könntest es ja einfach ausprobieren:
Code:

Und dann starte das Programm mal mit 3 beliebigen Parametern, z.B. "Test(1, 'hallo', 45)". Dann versuche es mit "Test(rand(2), Inf)" und noch mit "Test(1,2,3,4)".
Dann vergleiche das mit:
Code:

function Test(Arg1, Arg2, Arg3)
disp({Arg1, Arg2, Arg3})
disp(Arg1)
disp(Arg2)
disp(Arg3)
 

Ich glaube, der Groschen fällt dann von ganz alleine.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2010, 08:56     Titel:
  Antworten mit Zitat      
hallo,

Zitat:
Ich nehme an, Du möchtest das UICNTROL-Objekt löschen.


jein, mir gehts im grunde darum das ich eine kurze und knackige "hauptgui" und mehrere "unterguis" habe. die unterguis (und nicht einzelne objekte der untergui) sollen bei butten betätigung erstausgeführt werden und wieder geschlossen/gestoppt werden.

die "testfunktion3"=untergui wird noch viele andere buttons, fenster etc enthalten...wenn ich dann in der hauptgui immer "delete(S.ed(1)); etc" wird die hauptgui auch recht lang.

ausserdem, wenn ich das schreibe:

Code:
function [] = testfunktion2()

S.fh = figure();

S.pb(1) = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[50 200 150 40],...
                  'string','An',...
                  'fontsize',12);
             
S.pb(2) = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[50 350 150 40],...
                  'string','Aus',...
                  'fontsize',12);
             
set(S.pb(:),'callback',{@pb_call,S})

function [] = pb_call(varargin)
[h,S] = varargin{[1,3]};  

switch h
    case S.pb(1)
        testfunktion3
    case S.pb(2)
        delete(S.ed(1));
       
end


wird das editfenster nicht geschlossen... Crying or Very sad

aber ich danke dir für deine mühe!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.10.2010, 17:44     Titel:
  Antworten mit Zitat      
Hallo Gast,

Zitat:
... wird das editfenster nicht geschlossen...

Bitte schreibe nochmal genau auf, was Du möchtest. Wichtig wäre dabei die Matlab-Namen zu verwenden - ich kann z.B. nur raten, was ein "editfenster" sein könnte.

Wenn Du statt des UICONTROLs die dazugehörige FIGURE löschen möchtest, brauchst Du einfach nur den entsprechenden Handle:
Code:
delete(ancestor(S.ed(1), 'figure'));


Gruß und viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2010, 19:06     Titel:
  Antworten mit Zitat      
guten abend Smile

also ich habe zwei mfiles!

mfile nummer 1, die ich testfunktion2.m genannt habe:
Code:

function [] = testfunktion2()

S.fh = figure();

S.pb(1) = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[50 200 150 40],...
                  'string','An',...
                  'fontsize',12);
             
S.pb(2) = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[50 350 150 40],...
                  'string','Aus',...
                  'fontsize',12);
             
set(S.pb(:),'callback',{@pb_call,S})

function [] = pb_call(varargin)
[h,S] = varargin{[1,3]};  

switch h
    case S.pb(1)
        testfunktion3
    case S.pb(2)
        % hier muss was hin!!!      
end
 


und mfile nummer 2, die ich testfunktion3.m genannt habe:
Code:

S.ed(1) = uicontrol('style','edit','position',[410 290 70 30]);
 


1) mfile nummer 2 definiert mein sogenanntes "editfenster"!
2) mfile nummer 1 definiert die buttons "An" und "Aus"!
3) mit button "An" möchte ich mfile nummer 2 starten und somit dieses "editfenster" einblenden.
4) mit button "Aus" möchte ich das ganze mfile nummer 2 stoppen, löschen oder überlagern, sodass man dieses "editfenster" (und andere elemente die noch reingebaut werden z.b. weitere editfenster, buttons, bilder ect.)nicht mehr sieht...k.a. was da möglich ist. das figure aus mfile nummer 1 soll halt wieder nur die buttons "An" und "Aus" enthalten, sodass ich andere (hier nicht genannte) mfiles 3/4/5... mit hier noch nicht eingebauten buttons starten und stoppen kann.

p.s. die beiden vorschläge bei "case S.pb(2)" haben nicht funktioniert. Sad

viele grüße und schönes wochenende.
anonymous Wink
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2010, 20:08     Titel:
  Antworten mit Zitat      
und bezüglich varargin will der groschen irgendwie nicht fallen...

Code:

function [] = pb_call(varargin)
[h,S] = varargin{[1,3]};  
 


mir ist schon klar, dass der funktion pb_call eine beliebige anzahl von parametern "varargin" übergeben wird.
dann wird das erste element, welches pb_call übergeben wurde in "h" und das dritte in "S" gespeichert.

wo wird denn aber was an pb_call übergeben?
ist es diese zeiele?:
Code:

set(S.pb(:),'callback',{@pb_call,S})
 


dann wäre h= S.pb(1) oder h=S.pb(2) je nach dem was man drückt.
was wäre dann S?? S={@pb_call,S}??? kapier das nicht so richtig...

dann müsste bei:
Code:

function [] = pb_call(varargin)
[h,S] = varargin{[1,3]};
x = varargin{2}
 


für x im command window "x = callback" stehen.... es steht aber x = []... verwirrung pur...

lg
anonymous Smile
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.10.2010, 13:02     Titel:
  Antworten mit Zitat      
Hallo Anonymous,

Zitat:
wo wird denn aber was an pb_call übergeben?
ist es diese zeiele?:
Code:

set(S.pb(:),'callback',{@pb_call,S})
 

Exakt. Es wird Zeit die Dokumentation von Matlab zu lesen. Dort findest Du dies unter dem Stichpunkt "function handle callbacks" beschrieben: Ein Callback, der als {@Fcn, A, B, C, etc} definiert wird, führt zu folgendem Aufruf:
Code:
Fcn(ObjectHandle, EventData, A, B, C, etc)


Hilfreich ist z.B.: "docsearch callback"

Gruß, Jan
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: 04.10.2010, 13:12     Titel:
  Antworten mit Zitat      
Hallo Anonymous,

es bringt nicht viel, wenn Du immer wieder den gleichen Code postest.

Code:

function [] = pb_call(varargin)
[h, S] = varargin{[1,3]};  

switch h
    case S.pb(1)
       EditHandle = testfunktion3;
       set(S.pb(2), 'UserData', EditHandle);
    case S.pb(2)
        EditHandle = get(s.pb(2), 'UserData')
        if ~isempty(EditHandle)
           delete(ancestor(EditHandle, 'figure'));
        end
end
 


Code:

function EditHandle = testfunktion3
EditHandle = uicontrol('style','edit','position',[410 290 70 30]);
 


In Deiner "testfunktion3" belegst Du die Variable "S.ed(1)". Es wird aber nicht klar, wozu das dienen soll. Speicherst Du "S" denn irgendwo in Zeilen, die Du nicht mit angezeigt hast?

Ich kann nichts damit anfangen, dass Du ein Edit-UICONTROL unbedingt "editfenster" nennen möchtest. Ich hatte darauf hingewiesen, dass solche ausgedachten Namen in einem öffentlichen Forum Verwirrung stiften, während die offiziellen Matlab-Ausdrücke allen bekannt sein dürften.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.