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

Variable aus Edittext lesen uns speichern!

 

GTX570
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 10:41     Titel: Variable aus Edittext lesen uns speichern!
  Antworten mit Zitat      
Hallo GoMatlab Community

Ich sitze zur Zeit an einem bisher noch recht simplen GUI, dennoch versage ich schon am Anfang. Heute und gestern den ganzne Tag gegoogelt aber nicht so richtg eine Antwort gefunden.

Hier meine Frage:

Es gibt es Edittext Feld in dem man eine Zahl rainschreiben soll. Diese Zahl soll gespeichert werden und im späteren Verlauf des GUIs wieder benutzt werden.

Bisher hab ich den Befehl:
Code:
A=get(S.ls(2),'string');
assignin('base','GLCM_Size',A);

verwendet. Jedoch speichert er die variable nicht in A ab.

Ich tippe mal, dass ich hier einen grundlegenden blutiger Anfänger Fehler gemacht habe. Weiterhin habe ich die "handles" Funktion auch nicht ganz verstanden....

Hier mein Vollständiger Code:
Code:
%Date of last Edit: 17.09.2012

%GLCM GUI VERSION 0.1

function [] = new_try_2 ()

D = dir('*.bmp');  
S.NAM = {D(:).name};  % Store the name of all items returned in D.
S.fh = figure('units','pixels',...
              'position',[450 100 400 400],...
              'menubar','none',...
              'resize','off',...
              'numbertitle','off',...
              'name','Input loader');

S.ls(1) = uicontrol('style','list',...
                 'units','pix',...
                 'position',[10 250 190 120],...
                 'backgroundcolor','w',...
                 'string',S.NAM,...
                 'HorizontalAlign','left');
S.pb = uicontrol('style','push',...
                 'units','pix',...
                 'position',[10 10 380 40],...
                 'backgroundcolor','w',...
                 'HorizontalAlign','left',...
                 'string','Load Data into Workspace',...
                 'fontsize',14,'fontweight','bold',...
                                 'callback',{@pb_call,S});
S.class_t = uicontrol('style','text',...
                 'units','pix',...
                 'position',[10 220 100 18],...
                 'HorizontalAlign','center',...
                 'string','Select Class',...
                 'fontsize',10,'fontweight','bold');
S.ls(2) = uicontrol('style','edit',...
                 'units','pix',...
                 'position',[130 220 50 18],...
                 'HorizontalAlign','center',...
                 'string','X',...
                 'fontsize',10,'fontweight','bold');
S.zise_t = uicontrol('style','text',...
                 'units','pix',...
                 'position',[10 190 100 18],...
                 'HorizontalAlign','center',...
                 'string','Size of GLCM',...
                 'fontsize',10,'fontweight','bold');
S.ls(3) = uicontrol('style','edit',...
                 'units','pix',...
                 'position',[130 190 50 18],...
                 'HorizontalAlign','center',...
                 'string','X',...
                 'fontsize',10,'fontweight','bold');
           

function [] = pb_call(varargin)
% Callback for pushbutton.
S = varargin{3};
L = get(S.ls(1),{'string';'val'});  % Get the editbox string BMP

%Get the Values of the Textboxes and store them!
A=get(S.ls(2),'string');
assignin('base','GLCM_Size',A);  

try
    L = L{1}{L{2}};  % Give it a name for the base workspace.
    X = imread(L);
    str = [L(1:end-4)];
    assignin('base',str,X);  % Create the variable in the base workspace.
catch
    fprintf('\t\t%s\n','No file selected, or read error.')
end


Die Matlab Meldung beim Ausführen lautet:

Code:
Index exceeds matrix dimensions.

Error in new_try_2>pb_call (line 64)
A=get(S.ls(2),'string');
 
Error while evaluating uicontrol Callback



Der Code soll bmps finden, sie ebenfalls im Workspace speichern, was auch funktioniert, und ebenfalls später wieder verwenden.

Eine weitere Frage hab ich noch! Kann ein Callback auch meherer Aktionen auslösen, wie Speicher das Bild, nimm die Variable und mache dazu noch X oder benötigt jeder "Schritt" einen eigenen Callback der durch das knopfdrücken aktiviert wird.

Danke schonmal für Hilfe, Ratschläge und was sonst noch so kommt.

Grüße
GTX570

PS: Mögliche Antworten bitte so verfassen das ein 3-Jähriger (oder halt eben ich) sie versteht :-p
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.09.2012, 12:58     Titel: Re: Variable aus Edittext lesen uns speichern!
  Antworten mit Zitat      
Hallo GTX570,

Zitat:
Code:
A=get(S.ls(2),'string');
assignin('base','GLCM_Size',A);

verwendet. Jedoch speichert er die variable nicht in A ab.

Nein, das erzeugt nicht die Variable "A", sondern die Variable "GLCM_Size" mit dem Wert von "A".

"handles" ist zunächst mal ein einfacher Struct. Man könnte ihn genauso auch "P" nennen. Dieser wird per GUIDATA im Figure-Objekt gespeichert und von dort wieder ausgelesen:
Code:
FigHandle = figure;
handles.A = 1;
handles.X = rand(5);
guidata(FigHandle, handles);
...
function IrgendeinCallback(ObjH, EventData)
figHandle = ancestor(ObjH, 'figure');
handles = guidata(figHandle);
disp(handles.A);
disp(handles.X);

Es ist viel sicherer Daten innerhalb der Figure zu speichern. Die Methode per ASSIGNIN die Daten im "base"-Workspace zu speichern, ist fehleranfällig. Wenn man z.B. eine GUI zweimal öffnet, oder irgendein zwischenzeitlich aufgerufenes Script ein "clear" ausführt, ist die Verwirrung groß. Deshalb ist GUIDATA, oder SETAPPDATA, bzw. "set(FigHandle, 'UserData')" eine weit bessere Wahl.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 14:28     Titel:
  Antworten mit Zitat      
Hallo Jan

Danke für deine Antwort.

Nochmal zur Variablen A. Die Fehlermeldung die ich bekomme bezieht sich stets auf die Zeile in der A ausgeführt wird. Ich verstehe nicht ganz wieso das irgendwie die Matrix Dimension beinflusst bzw. was die Dimension ist. Ich bekomme einfach nicht das, was ich in das Editfeld schreibe am Ende aus der Figure wieder raus.

Zu GUIDATA und SETAPPDATA: Das GUI soll am Ende aus verschiedenen Figures bestehen. Werden die GUI oder APP Daten gespeichert und an die nächste Figure übergeben. Ich bin total neu in Matlab und der Programmierwelt. Entschuldigt daher bitte meine fehlenden Grundkentnisse. Leider fehlt mir in meinem Umfeld eine Person die einem das mal richtig erklärt. Sich alleine damit befassen ist irgendwie echt nicht einfach und der "A-Ha!" Moment ist halt noch nicht eingetreten

Die scripte, die am Ende die Berechnungen machen sollen sind alle Fertig geschreiben und müssen nur nach diesem Schritt, der ja failt ausgeführt werden mit den Variablen die ich in die Editboxen setze. Durch die GUI soll das handling der verschiedenen Scripte vereinfacht werden.

Grüße und Dank
GTX570
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.09.2012, 21:29     Titel:
  Antworten mit Zitat      
Hallo GTX570,

Das durchstöbern Deines Codes hat ein Problem gezeigt:
Wenn Du "'callback',{@pb_call,S}" definierst, enthält "S" nur die Felder, die bereits definiert worden sind. "S.ls" enthält deshalb erst ein Element!

Die Dimensionen eines Arrays ist die Ausgabe des SIZE() Befehls. Hier war "S.ls" nur ein Skalar, so dass "S.ls(2)" auf ein nicht existierendes Element zugreift.

Mit dem Code, den ich bereits gepostet habe, tritt das Problem nicht auf: Speicher am Ende der Hauptfunktion die Variable "S" per GUIDATA:
Code:

Dann kannst Du "S" im Callback wieder auslesen:
Code:
function [] = pb_call(ObjH, EventData)
FigureHandle = ancestor(ObjH, 'figure');
S = guidata(FigHandle);


Variablen zwischen verschiedenen GUIs hin- und herzuschieben ist nicht trivial, aber auch kein Hexenwerk. Die klarste Methode wäre es eine GUI als "Haupt-GUI" zu betrachten und alle Variablen dort zu speichern - falls das zur Struktur der GUIs passt. Den Handle der Haupt-GUI, also der erste Input von GUIDATA, müsste dann entweder an die Unter-GUIs beim Erstellen übergeben werden, oder die Haupt-GUI bekommt einen "Tag", der mit FINDOBJ() gefunden wird:
Code:
figure('Tag', 'HauptGUI');

FigH = findobj(allchild(0), 'flat', 'Tag', 'HauptGUI');
S = guidata(FigH);
S.xyz = 'asd';
guidata(FigH, S);

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 18.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2012, 08:48     Titel:
  Antworten mit Zitat      
ahaaaaAAAaa!!!!!

Vielen Dank für deine Hilfe Jan! So läufts perfekto!

Falls weitere Fragen auftreten werde ich sie hier im Thread posten. So kann ich jedenfalls erstmal weiter machen.

Grüße
GTX570
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.