Verfasst am: 21.09.2008, 17:56
Titel: Erkennung einer String-Kette als String-Array
In einem GUI wird über ein EditTXT-Feld eine String-Kette in folgendem Format eingelesen: 'name1','name2','name3',...
Die jeweiligen Namen stehen für Ordnernamen. Diese Namen will ich in ein String-Array übergeben, sodass ich danach Zugriff auf die Ordner habe. Nun kann ich diese String-Kette nur über get(edit1,'String') auslesen und weiß nicht, wie ich sie danach quasi in die einzelnen Strings zerteile!?
Wenn man diese Textzeile manuell eintippt, würde man sie ja in {} einschließen und MATLAB weiß, was ich meine. Hier lässt sich das aber scheinbar nicht benutzen!?
Die Namen der verschiedenen Ordner sollen mit einem Mal über das EditText-Feld eingegeben werden. Deshalb kam ich auf die Idee, dieselbe Syntax vorzuschreiben wie bei meinem vorherigen Funktionsaufruf im M-File. Da sah das so aus:
Bei der Übergabe der Parameter wurde das dann automatisch als String-Vektor erkannt und die einzelnen Elemente (Ordner1, Ordner2, Ordner3) konnten separat angefasst werden.
Das soll jetzt wieder so funktionieren, nur dass die Ordnernamen über ein EditText-Feld in meinem GUI eingegeben werden. Da ich auf das Textfeld nur über seine String-Eigenschaft zugreife, gehe ich mal davon aus, dass es als ein String gewertet wird!? Die Zuordnung erfolgt dann durch:
umschiffst du das eigentliche Problem geschickt
Du teilst MATLAB ja in dem Moment direkt mit, dass du gern ein String-Array mit drei Strings haben möchtest. Machst du die Eingabe im Textfeld aber manuell, fügt MATLAB jeweils außen ein ' an und verstümmelt damit die Eingabe...
So, nachdem ich schon kurz davor stand, entweder den Rechner aus dem Fenster oder zumindest MATLAB von der Platte zu schmeißen, habe ich das Problem gelöst. Wahrscheinlich extrem umständlich bzw. unelegant, aber meine schönen Ideen waren ja bis dahin auch alle gescheitert
Meine Intention war es ja, über ein EditText-Feld Ordnernamen einzulesen, die dann für den späteren Zugriff auf diese Ordner in einem String-Vektor zwischen gelagert werden.
Der Benutzer gibt nun vorab über ein Pop-up Menu die Anzahl der Ordner an. Diese Anzahl verwende ich später in einer switch-Auswahl.
Code:
handles.Folders = get(handles.In_Folders,'String'); % Übergabe des Textfeldes an 'handles.Folder_String'
x_FolderNumber = get(handles.Drop_Folders,'Value')-1; % Übergabe der Ordneranzahl an 'x_FolderNumber' switch x_FolderNumber % Auswahl der angegebenen Ordneranzahl case1
x_cellFolders = textscan(handles.Folders, '%s'); % Übernahme der Ordnernamen
handles.Folders = x_cellFolders{1}(1,1); % Umwandlung der Werte aus dem Cell-Array in einen String-Vektor case2
x_cellFolders = textscan(handles.Folders, '%s%s'); % Übernahme der Ordnernamen
handles.Folders = [x_cellFolders{1}(1,1);x_cellFolders{2}(1,1)]; % Umwandlung der Werte aus dem Cell-Array in einen String-Vektor case3
x_cellFolders = textscan(handles.Folders, '%s%s%s'); % Übernahme der Ordnernamen
handles.Folders = [x_cellFolders{1}(1,1);x_cellFolders{2}(1,1);... % Umwandlung der Werte aus dem Cell-Array in einen String-Vektor
x_cellFolders{3}(1,1)];
case4
x_cellFolders = textscan(handles.Folders, '%s%s%s%s'); % Übernahme der Ordnernamen
handles.Folders = [x_cellFolders{1}(1,1);x_cellFolders{2}(1,1);... % Umwandlung der Werte aus dem Cell-Array in einen String-Vektor
x_cellFolders{3}(1,1);x_cellFolders{4}(1,1)];
case5
x_cellFolders = textscan(handles.Folders, '%s%s%s%s%s'); % Übernahme der Ordnernamen
handles.Folders = [x_cellFolders{1}(1,1);x_cellFolders{2}(1,1);... % Umwandlung der Werte aus dem Cell-Array in einen String-Vektor
x_cellFolders{3}(1,1);x_cellFolders{4}(1,1);...
x_cellFolders{5}(1,1)];
end
wenn es läuft ist ja gut, das ginge aber mit weniger Schreibarbeit, für beliebig viele Ordner und fehlerunanfälliger.
Hast Du mein 3. Posting gesehen?
_________________
ich glaub ich habs jetzt auch gecheckt. Du gibst die Ordner durch Komma getrennt ein, ich dachte Du trennst mit Return.
Klappt dann folgendes:
Code:
function testgui2
h.fig = figure('position',[300300400450]);
h.btn1=uicontrol('style','pushbutton','position',[206010040],'string','OK');
h.text1=uicontrol('style','edit','position',[13060250350]');
set(h.text1,'FontName','FixedWidth','FontSize',12,'Max',2);
set(h.btn1,'callback',{@cb1,h})
function h = cb1(hObject, eventdata, h)
dirs=get(h.text1,'String');
dirs=regexp(dirs,',','split');
for k = 1 : numel(dirs) disp(dirs{k}) cd(dirs{k}) dir cd('..') end
Da ich die Erkennung der Strings jetzt über textscan durchführe und der Standard-Delimiter das Leerzeichen ist, sind die Ordnernamen einfach durch Leerzeichen und ohne jegliche andere Sonderzeichen getrennt.
regexp liefert doch aber scheinbar "nur" den Index eines erkannten Strings zurück. Wäre also für mich auch nicht unbedingt eine Vereinfachung der Prozedur!?
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.