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

Ordnerzugriff aus einer Windows Standalone App

 

TomF
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 24.09.2017, 18:29     Titel: Ordnerzugriff aus einer Windows Standalone App
  Antworten mit Zitat      
Hallo zusammen,

ich habe im Ramen meiner Bachelorarbeit ein Programm (FlexStrength.exe) geschrieben, welches ich dann mit Hilfe eines GUI mit einer Benutzeroberfläche versehen habe. Dieses habe ich dann als Windows Standalone Application exportiert.

Zu meinem Problem:

In dem ursprünglichen Code gab es einen Ordner "models", in dem man Bauteile abspeichern und dann mit dem Programm einlesen und berechnen konnte (vgl. Bild: Ordnerstruktur)
Jodch ist dieser Ordner, bzw. der Zugriff darauf in der fertigen App nicht mehr möglich.
Damit dieser Ordner beim Start der App erstellt wird habe ich folgendes am Anfang meiner Hauptdatei eingefügt:

Code:

% Ergebnisordner
if ~exist([pwd, '\results'], 'dir')
  mkdir([pwd, '\results'])
end

% Modelordner
if ~exist([pwd, '\models'], 'dir')
  mkdir([pwd, '\models'])
end
 


Das Programm erkennt diesen Ordner jedoch nicht, bzw. die Modeldateien in diesem nicht, auch wenn er existiert. (vgl. Bild: ordner_programm)

Was muss ich tun, um meinem Programm zu sagen, ess soll bitte die entsprechende datei mit dem Namen "model1" z.B. aus diesem Ordner einlesen?


Vielen Dank für jede Hilfe im Vorraus und bitte entschuldigt die eventuell etwas wirre Problemschilderung.

ordnerstruktur.PNG
 Beschreibung:

Download
 Dateiname:  ordnerstruktur.PNG
 Dateigröße:  8.88 KB
 Heruntergeladen:  349 mal
ordner_programm.PNG
 Beschreibung:

Download
 Dateiname:  ordner_programm.PNG
 Dateigröße:  14.53 KB
 Heruntergeladen:  372 mal

_________________

Beste Grüße

TomF
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.09.2017, 20:19     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Jodch ist dieser Ordner, bzw. der Zugriff darauf in der fertigen App nicht mehr möglich.

Wie versuchst du denn darauf zuzugreifen?

Mögliche Abhilfe:
a) den vollständigen Pfad angeben
b) das Verzeichnis zum Suchpfad hinzufügen ( addpath )

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TomF
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 24.09.2017, 20:33     Titel:
  Antworten mit Zitat      
Hallo und Danke für die Antwort,

ich habe alle subfolder hinzugefügt:

Code:

addpath(genpath('./'))
 


und greife dann über handles auf den Inhalt eines "edit text box" zu:

Code:

 member_select = get(handles.edit_member,'String');

% einlesen der variablen
member = eval(member_select,'String');
 


dass funktioniert auch, sofern ich das programm in matlab ausführe, oder den Ordner "models" und die beinhalteten "member" mit exportieren lasse, jedoch möchte ich dem Nutzer ermöglichen in genau diesem Ordner eigene Bauteile ablegen zu können um sie dann zu berechnen. Dieser Ordner ist allerdings in der App nicht mehr zu finden, bzw. werden Dateien in dem zu Beginn neu erstellten Ordner nicht erkannt.
_________________

Beste Grüße

TomF
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.09.2017, 20:56     Titel:
  Antworten mit Zitat      
Hallo,

der Befehl fügt alle momentanen Unterordner hinzu. Führst du denn den Befehl auch aus, nachdem du den Ordner erstellt hast?

Viel mehr als vorher weiß ich nun leider nicht. Was können denn die member_select-Werte sein? Sind das MATLAB-Dateien, Simulink-Dateien, oder was? Was für dich ein "Bauteil" ist, weiß ich nicht und hier möglicherweise auch sonst niemand.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TomF
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 24.09.2017, 21:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

Wie gesagt, sry für die Verwirrung, ich versuche mal ein wenig Licht in die Sache zu bringen:

Ein Bauteil ("member") ist eine struct-variable mit Werten wie:

Code:

function member = member3

%% geometrical parameters

    % heigth [mm]
    member.h = 200;
   
    % length [mm]
    member.l_0x = 6000;                 % main span direction
   
    % width [mm]
    member.b = 1000;
   
    % Cross section
    member.A_c = member.b * member.h;
 


Diese werden vom Benutzer erstellt und als member3.m z.B. im Ordner models gespeichert. Im eigentlichen Programm muss der User dann im Feld "select member" den Namen eingeben (z.B." member3"). Dieser wird dann wie oben beschrieben über die handles ausgelesen und soll dann in den workspace geladen werden.
Dies funktioniert in Matlab, aber nicht in der App, weil dort der Ordner anscheinend nicht erkannt wird.

den addpath-Befehl habe ich aber nach der Erstellung der Ordner ausgeführt, sodass diese eigentlich auch erkannt werden sollten.

Ich hoffe, dass es jetzzt ein bisschen verständlicher geworden ist und bedanke mich für die Hilfe!

gui.PNG
 Beschreibung:

Download
 Dateiname:  gui.PNG
 Dateigröße:  50.61 KB
 Heruntergeladen:  376 mal

_________________

Beste Grüße

TomF
Private Nachricht senden Benutzer-Profile anzeigen
 
TomF
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 25.09.2017, 12:31     Titel:
  Antworten mit Zitat      
Hallo nochmal,

nach einigen weiteren Probeläufen habe ich mich mitlerweile für folgende "Lösung" entschieden:

Code:

[filename, pathname] = uigetfile({'*.m'},'File Selector');
fullpathname = strcat(pathname, filename);

member = dir(fullpathname);
 


dadurch ist es mir möglich die Bauteile (member) aus einem beliebigen Ordner einzulesen. Dies funktioniert in Matlab hervorragend und genau wie es soll, allerdings nicht in der standalone App...

Ich weiß einfach nicht mehr weiter und verstehe es nicht. Das Problem ist auch, das ich nur einen Errorton höre und sehe, dass eben nichts passiert, aber nicht weiß, wo ich die Errormeldungen finde.

Besten Dank an euch und ich habe mal den installer hochgeladen, falls das hilft:

https://www.dropbox.com/s/nxeu2kznm.....AppInstaller_web.exe?dl=0

Sobald das Programm das erste mal gestartet wurde, werden zwei Ordner "models" und "results" erstellt. In den models Ordner kann man dann member1.m ablegen und es über den "Browse"-Button im Programm einladen - soweit die Theorie....

member1.m
 Beschreibung:

Download
 Dateiname:  member1.m
 Dateigröße:  8.4 KB
 Heruntergeladen:  351 mal

_________________

Beste Grüße

TomF
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.09.2017, 12:51     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das Problem ist auch, das ich nur einen Errorton höre und sehe, dass eben nichts passiert, aber nicht weiß, wo ich die Errormeldungen finde.

Dieses Problem sollte sich lösen lassen, indem du die Anwendung aus einer Betriebssystemkonsole (cmd) startest statt per Doppelklick.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TomF
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 25.09.2017, 13:33     Titel:
  Antworten mit Zitat      
Danke Harald,

traurig, dass ich da nicht selbst drauf gekommen bin...

Mittlerweile habe ich schon ein paar Errormeldungen beheben können, doch an dieser komme ich nciht weiter. Der Code sieht wie folgt aus

Code:

[filename, pathname] = uigetfile({'*.m'},'File Selector');
fullpathname = strcat(pathname, filename);
[filepath,name,ext] = fileparts(fullpathname) ;

dir(pathname);
member = eval(name,'String'); % Zeile 346
 



Die Errormeldung dazu:

ans =

Figure (figure1) with properties:

Number: []
Name: 'FlexStrengthGUI'
Color: [0.9400 0.9400 0.9400]
Position: [135.8000 13.8462 170.4000 64.6923]
Units: 'characters'

Use GET to show all properties


. .. member1.m

Cannot find an exact (case-sensitive) match for 'String'

The closest match is: string in C:\Program Files\MATLAB\R2016b\mcr\toolbox\matlab\strfun\@string\string.m


Error in FlexStrengthGUI>button_choose_file_Callback (line 346)


Error in gui_mainfcn (line 95)


Error in FlexStrengthGUI (line 45)


Error in matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)FlexStrengthGUI('button_choose_file_Callback',hObject,eventdata,guidata(hObject))

Error using waitforallfiguresclosed (line 20)
Error while evaluating UIControl Callback

Der Code sollte so ausführbar sein und in Matlab keine Probleme hervorrufen, nur in der standalone.
_________________

Beste Grüße

TomF
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.09.2017, 16:52     Titel:
  Antworten mit Zitat      
Hallo,

ich würde eval generell vermeiden, da es meist mehr Probleme verursacht als es löst. Vor allem nutzt du eval mit zwei Eingabeargumenten. Das ist so nicht dokumentiert, und mir ist auch nicht klar, was es bezweckt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TomF
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 25.09.2017, 17:17     Titel:
  Antworten mit Zitat      
Hallo,

den String-Zusatz im eval-Befehl habe ich schon entfernt, allerdings wird jetzt die member-Datein nicht mehr gefunden.
Gibt es denn eine sinnvolle und zweckmäßige alternative zu eval? Run funktioniert nicht und load geht ja nur bei .mat Dateien.

Im Endeffekt muss es nur möglich sein eine vom user erstellte Datei einzulesen, die dann im programm über member.variableA oder member.variableB usw. genutzt werden kann.

Besten Dank Harald
_________________

Beste Grüße

TomF
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.09.2017, 19:09     Titel:
  Antworten mit Zitat      
Hallo,

ein Function Handle würde eval vermeiden.
Um aus einem String ein Function Handle zu machen, hilft str2func.

Ich würde mir auch mal mit path den Suchpfad ansehen um zu schauen, ob das Hinzufügen aus welchen Gründen auch immer nicht geklappt hat, oder das Finden im Pfad.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TomF
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 26.09.2017, 13:05     Titel:
  Antworten mit Zitat      
Vielen Dank für den Hinweis, ich habe eval durch str2func ersetzt und in Matlab seolber funktioniert alles einwandfrei.

Code:

[filename, pathname] = uigetfile({'*.m'},'File Selector');
fullpathname = strcat(pathname, filename);
[filepath,name,ext] = fileparts(fullpathname) ;

member = str2func(name); %name = member1
member = member();
 


Wenn ich foedoch die exe ausführe spuckt mir die cmd folgende Errormeldung aus:

ans =

Figure (figure1) with properties:

Number: []
Name: 'FlexStrengthGUI'
Color: [0.9400 0.9400 0.9400]
Position: [135.8000 13.8462 170.4000 64.6923]
Units: 'characters'

Use GET to show all properties

Undefined function or variable 'member1'.

Error in FlexStrengthGUI>button_choose_file_Callback (line 354)


Error in gui_mainfcn (line 95)


Error in FlexStrengthGUI (line 45)


Error in matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)FlexStrengthGUI('button_choose_file_Callback',hObject,eventdata,guidata(hObject))

Error using waitforallfiguresclosed (line 20)
Error while evaluating UIControl Callback

Es muss doch aber mögliche seine eine .m-file einlesen und ausführen zu können ind der standalone. Im Endeffekt muss ich nur diese member-variablen irgendwie in den workspace der App bekommen...
_________________

Beste Grüße

TomF
Private Nachricht senden Benutzer-Profile anzeigen
 
TomF
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 26.09.2017, 14:14     Titel:
  Antworten mit Zitat      
Hallo nochmal,

ich bin mitlerweile daruaf umgestiegen, die member datei als .mat Datei einzuleden und dies funktioniert auch in der standalone.

Jedoch gibt es jetzt ein neues Problem, nämlich dass der user auch ohne Matlab (nur mit MCR) diese mat files erstellen können muss...
Dies werde ich aber an passender Stelle erfragen.

Vielen Danke für die Hilfe bis hier hin!
_________________

Beste Grüße

TomF
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: 26.09.2017, 18:51     Titel:
  Antworten mit Zitat      
Hallo TomF,

Und bist Du sicher, dass "pwd" der Ordner ist, in dem das Executable File liegt?

Zitat:
ich habe alle subfolder hinzugefügt:
Code:
addpath(genpath('./'))

Das ist eine gewagte Idee. Ich würde nicht den Matlab-Pfad großzügig ändern, sondern lieber den absoluten Pfad zu den Dateien angeben.

Code:
member_select = get(handles.edit_member,'String');

% einlesen der variablen
member = eval(member_select,'String');

Was soll denn "eval(member_select, 'String')" tun? EVAL wertet doch einen übergebenen String als Code aus. Was steht denn dann in "member_select"? Und was macht der 2. Input Parameter? Der ist bei EVAL doch gar nicht erlaubt?

Zitat:
dass funktioniert auch, sofern ich das programm in matlab ausführe,

Bist Du da sicher?

Zitat:
bzw. werden Dateien in dem zu Beginn neu erstellten Ordner nicht erkannt.

Was heißt "werden nicht erkannt" genau? Was geschieht denn?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 22.02.17
Wohnort: Hannover
Version: R2016b
     Beitrag Verfasst am: 26.09.2017, 19:24     Titel:
  Antworten mit Zitat      
Hallo Jan,

den Befehl

Code:

 addpath(genpath('./'))
 


habe ich schon modifiziert, da addpath in einer standalone Probleme macht, aber alle Unterordner gehören zu dem Programm dazu:

Code:

if ~isdeployed

% this is MATLAB, not compiled application

addpath(genpath('./'))

end
 



Von eval bin ich mitlerweile auch weg:

Code:

global member
global name

[filename, pathname] = uigetfile({'*.mat'},'File Selector');
fullpathname = strcat(pathname, filename);
[filepath,name,ext] = fileparts(fullpathname);
set(handles.text_choose_file,'String', name);
load(fullpathname, 'member');
 


Zitat:

Was heißt "werden nicht erkannt" genau? Was geschieht denn?


Das Problem konnte ich mit dem direkten Pfad lösen, bzw. lag es wohl auch daran, dass ein nicht kompilierter Code in der standalone nicht ausgeführt werden kann.

Jetzt muss ich es nur noch schaffen ohne Matlab .mat-files erstellen lassen zu können, oder einen Weg finden, wie die Standalone das für mich übernimmt Very Happy

Vielen Dank für die Hilfe und die Tipps!
_________________

Beste Grüße

TomF
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 - 2024 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.