Verfasst am: 20.09.2013, 14:27
Titel: Vergleich von eingegebenen Werten und geladenen Daten in Gui
Hallo Leute,
bräuchte mal bitte etwas Hilfe. Es öffnet sich in dem Programm und verlangt eine Eingabe. Diese soll dann mit meinen Daten verglichen werden.
Code:
function[R] = GUI_36() % Example: % T = GUI_36; % T will be a string.
R = []; % In case the user closes the GUI.
S.fh = figure('units','pixels',...
'position',[500500200100],...
'menubar','none',...
'name','GUI_36',...
'numbertitle','off',...
'resize','off');
S.ed = uicontrol('style','edit',...
'units','pix',...
'position',[106018030],...
'string','Enter Some Data');
S.pb = uicontrol('style','pushbutton',...
'units','pix',...
'position',[102018030],...
'string','Push to Return Data',...
'callback',{@pb_call});
uicontrol(S.ed)% Make the editbox active.
uiwait(S.fh)% Prevent all other processes from starting until closed. load('kombinationen_MAARSY.mat','Kombi') function[] = pb_call(varargin) % Callback for the pushbutton.
R = get(S.ed,'string');
isequal(R,kombinationen_MAARSY.mat(Kombi)) close(S.fh); % Closes the GUI, allows the new R to be returned. end end
Verfasst am: 21.09.2013, 20:51
Titel: Re: Vergleich von eingegebenen Werten und geladenen Daten in
Hallo Newbenoob,
Der Code wurde hier als Text dargestellt, da die Checkbox "BBCode in diesem Beitrag deaktivieren" unter dem Feld zur Eingabe aktiviert war. Ich habe die Checkbox wieder zurückgesetzt.
Dies lädt die Variable "Kombi" aus dem MAT-File. "kombinationen_MAARSY" ist dagegen danach nicht vorhanden. "kombinationen_MAARSY.mat" scheitert dann und da "kombinationen_MAARSY" kein Struct ist (da es ja gar nicht existiert), vermutet Matlab, es könne sich vielleicht um eine Java-Methode handeln.
Das Laden von Variablen direkt in den Workspace ist unübersichtlich und erhöht die Laufzeit im Vergleich zu:
Dieses Kombi soll dann mit den eingegeben Werten aus dem Edit Fenster verglichen werden. Übereinstimmende Werde sollen danach ausgeben werden.
Ein Beispiel:
Der Benutzer gibt ein "RadarFreq: 53500000". Nun soll diese EIngabe mit den geladenen Daten von kombinationen.MAARSY verglichen werden.
Die Information über die RadarFreq findet man im Expe Teil.
Ist es klar geworden, dass es Vorteile bringt, die Ausgabe von LOAD explizit zu speichern, anstatt die Variablen magisch in den Workspace schreiben zu lassen?
So, nach einigem Probieren sieht es bisher so aus:
Code:
function[] = GUI_4()
S.fh = figure('units','pixels',...
'position',[800800500400],...
'menubar','none',...
'name','Verify Password.',...
'resize','off',...
'numbertitle','off',...
'name','GUI_4');
S.ed = uicontrol('style','edit',...
'units','pix',...
'position',[10280190120],...
'min',0,'max',2,...% This is the key to multiline edits.
'string',{'Exp'; },...
'fontweight','bold',...
'horizontalalign','center',...
'fontsize',11);
S.ls = uicontrol('style','list',...
'units','pix',...
'position',[210280180120],...
'backgroundcolor','w',...
'HorizontalAlign','left');
T.list = uicontrol('style','list',...
'units','pix',...
'position',[1010190190],...
'min',0,'max',2,...% Hier soll dann verglichen werden.
'string',{[]},...
'fontweight','bold',...
'horizontalalign','center',...
'fontsize',11);
S.pb = uicontrol('style','push',...
'units','pix',...
'position',[1023038040],...
'HorizontalAlign','left',...
'string','Transfer',...
'fontsize',14,'fontweight','bold',...
'callback',{@pb_call,S});
T.pb2 = uicontrol( 'style','push',...
'units','pix',...
'position',[1020038040],...
'HorizontalAlign','left',...
'string','Vergleichen',...
'fontsize',14,'fontweight','bold',...
'callback',{@pb2_call,T});
Data = load('kombinationen_MAARSY.mat');
uicontrol(S.ed)% Give the editbox control.
%set(handles.list, 'String', get(handles.S.txt, 'String'));
uicontrol(T.list)
function[] = pb_call(varargin) % Callback for edit.
S = varargin{3};
% Get the string from the edit box. Note that since the editbox is a % multiline editbox (max-min>2), the string returned is a cell array.
E = get(S.ed,'string');
set(S.ls,'string',E)% Now set the listbox string to the value in E.
so hebelst du die Logik von VARARGIN aus. In diesem Fall kann VARARGIN nur einen Parameter aufnehmen.
Callback-Funktionen brauchen aber mindestens 2 Parameter per default. Da du aber oben einen Extra übergibst, muss in deiner Funktion 3 Parameter deklariert
richtig wäre:
weil du bereits beim Erstellen nicht optimalen Weg gewählt hast. Ich weiß ja nicht genau warum du die Handles der GUI-Objekte in unterschiedlichen Struktur-Variablen ablegst. Das ist nicht falsch, aber wäre es nicht besser alle Handles in eine Struktur abzulegen. Das hätte den Verwaltung vereinfacht
so z.B.:
Code:
function[] = GUI_4()
S.fh = figure('units','pixels',...
'position',[800800500400],...
'menubar','none',...
'name','Verify Password.',...
'resize','off',...
'numbertitle','off',...
'name','GUI_4');
S.ed = uicontrol('style','edit',...
'units','pix',...
'position',[10280190120],...
'min',0,'max',2,...% This is the key to multiline edits.
'string',{'Exp'; },...
'fontweight','bold',...
'horizontalalign','center',...
'fontsize',11);
S.ls = uicontrol('style','list',...
'units','pix',...
'position',[210280180120],...
'backgroundcolor','w',...
'HorizontalAlign','left');
S.list = uicontrol('style','list',...
'units','pix',...
'position',[1010190190],...
'min',0,'max',2,...% Hier soll dann verglichen werden.
'string',{[]},...
'fontweight','bold',...
'horizontalalign','center',...
'fontsize',11);
S.pb = uicontrol('style','push',...
'units','pix',...
'position',[1023038040],...
'HorizontalAlign','left',...
'string','Transfer',...
'fontsize',14,'fontweight','bold',...
'callback',{@pb_call,S});
S.pb2 = uicontrol( 'style','push',...
'units','pix',...
'position',[1020038040],...
'HorizontalAlign','left',...
'string','Vergleichen',...
'fontsize',14,'fontweight','bold');
% du kannst nicht erwarten dass die Data automatisch in callback % sichtbar ist. Das muss du dann übergeben set(S.pb2 'callback',{@pb2_call, S, Data});
% oder du musst die Funktionsaufbau ändern, % dann wird Die DATA sichtbar in Unterfunktion % Stichwort "Nested Functions" % function haupt() % Data = [1 2 3] % function sub() % A = Data % end % end
% das macht keinen Sinn, der Aufruf bedeutet nur, % dass der Fokus zu S.ed springt. % Das ist nur gut, % wenn du möchtest, dass der Benutzer etwas eintippt. % uicontrol(S.ed) % Give the editbox control.
function pb_call(varargin) % Callback for edit.
S = varargin{3};
% Get the string from the edit box. Note that since the editbox is a % multiline editbox (max-min>2), the string returned is a cell array.
E = get(S.ed,'string');
set(S.ls,'string',E)% Now set the listbox string to the value in E.
Matlab benutzt eine Methode, die JIT-Acceleration heißt, für Just-In-Time. Dabei wird der Code optimiert, damit er schneller ausgeführt werden kann. Dies geschieht zunächst direkt nach dem Laden des M-Files.
Bei "Data = load(...)" ist bekannt, dass die Variable "Data" existiert und überall, wo darauf zugegriffen wird, kann Matlab direkt eine Art Pointer auf die entsprechenden Daten einfügen. Wenn man aber per "load(...)" ein MAT-File lädt, kann Matlab beim Laden des M-Files noch nicht herausfinden, welche Variablen darin stehen. Diese dynamisch erstellten Variablen werden dann in einer Tabelle gespeichert, die bei jedem Variablen-Zugriff erst zeitraubend durchsucht werden muss.
Das gleiche Problem tritt mit EVAL auf.
Viele Grüße, Jan
Einstellungen und Berechtigungen
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
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.