Autor Beitrag
Mathias1
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 05.08.09 15:17 
Hallo Leute,

ich habe ein Problem beim Einbinden einer Grafik in meine Oberfläche. Beim Starten initialisiert sich die Oberfläche und die Grafik wird problemlos geladen. Diese Grafik soll jedoch mehrmals existieren, zwischen denen mittels einer ComboBox geschaltet wird. Mit dem "SelectedIndexChanged"-Ereignisses wird dann die Grafik neu geladen (es ist immer die selbe Grafikdatei, die geladen wird).

So sieht das Laden aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
try
{
  pbCoordinateSystemBox.Image = Image.FromFile("../../Resources/picture.jpg");
}


Das funktioniert soweit problemlos.

Nun habe ich in meinem Programm auch die Möglichkeit eine XML-Datei einzulesen. Das tue ich wie folgt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
System.Windows.Forms.OpenFileDialog objDialogXML = new OpenFileDialog();
            objDialogXML.Filter = "*.xml|*.xml";
            DialogResult objResultXML = objDialogXML.ShowDialog();
            if (objResultXML == DialogResult.OK)
            {
                MessageBox.Show("Funktioniert!");
                objDialogXML.Reset();
            }


Wenn ich nach dem Einlesen einer XML-Datei wieder mittels der ComboBox wechsle, zeigt er mir eine FileNotFound-Exception, die jedoch keinen Aufschluss auf die Ursache gibt.

Ich habe selber herausgefunden, dass, wenn ich die picture.jpg in das Verzeichnis reinkopiere, aus dem ich auch die XML-Datei eingelesen hab, alles wieder problemlos funktioniert. Das heißt also, dass der "Marker" (ich nenne das jetzt mal so, um zu zeigen welches Verzeichnis für das Programm das gerade aktuelle ist) zum Startzeitpunkt sich erst im Debug-Verzeichnis befindet. Wenn ich dann aber die XML-Datei aus einem anderen Verzeichnis lade, dann zeigt der "Marker" auf dieses XML-Verzeichnis, weswegen beim Laden der picture.jpg natürlich der relative Pfad "../../Resources/" nicht mehr gültig ist.

Bis jetzt habe ich noch nicht geschafft herauszufinden wie man das aktuelle Verzeichnis wieder umändert. Ich freue mich über eure Antworten. Vielen Dank.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4808
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 06.08.09 09:50 
Da gibt es mehrere Möglichkeiten:
- Application.StartupPath vor den Dateinamen hängen
- OpenFileDialog.RestoreDirectory = true
- Environment.CurrentDirectory = ...

Jedoch wäre es besser, du legst deine Resourcen NICHT in ein übergeordnetes Verzeichnis ab (wenn du dein Programm weitergeben willst).
Das beste ist, du legst in deinem VS-Projekt ein Unterverzeichnis 'Images' an und für jedes Bild setzt du dann die Eigenschaft 'CopyToOutputDir'.
Dann wird automatisch ein Unterordner 'Images' mit den Bildern in deinem Output-Verzeichnis (z.B. 'bin\debug') angelegt und du kannst dann mit "Images/picture.jpg" darauf zugeifen.
(ich habe den Ordner jetzt extra 'Images' genannt, da es standardmäßig beim VS schon einen Ordner 'resources' gibt)

Die andere Alternative wäre direkt die Verwendung von Resources, d.h. daß deine Bilder in die Assembly direkt reinkopiert werden.
Mathias1 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 10.08.09 07:52 
Vielen Dank für die Antwort,

ich habe mal geschaut und mein Verdacht hat sich bestätigt. Beim Start des Programms ist das Environment.CurrentDirectory das debug-Verzeichnis. Sobald ich jedoch etwas mit dem OpenFileDialog lade, ändert es sich in das Verzeichnis, in dem die geladene Datei ist. Nun lasse ich das Environment.CurrentDirectory einfach nach jedem Laden wieder in das debug-Verzeichnis umändern und schon funktioniert alles.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 10.08.09 08:05 
Das ist allerdings eine ungünstige Herangehensweise. Relative Pfade sind eine sehr schlechte Idee. Wenn du statt auf das aktuelle Arbeitsverzeichnis dich auf das deiner Exe (Application.StartupPath wurde ja bereits genannt) beziehst, dann funktioniert das auch ohne dass du den Benutzer nervst, indem du das Arbeitsverzeichnis änderst.

Denn es ist extrem nervig, wenn ein Dialog sich ständig auf das Verzeichnis der Exe zurückstellt, und ich jedesmal wieder das Zielverzeichnis neu suchen muss. Deshalb sollte man das Arbeitsverzeichnis besser unangetastet lassen...

Und dass du offenbar jetzt explizit aus dem Debug-Verzeichnis auf übergeordnete Ordner zugreifst, wird später dann Umbauarbeiten notwendig werden lassen für die Veröffentlichung. Keine gute Idee...