C# falscher Rückgabetyp
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
aufrufen
bild
code
datei
dialog
erlauben
fazit
fehler
filter
globales string
image
methode
null
problem
programm
sender
stil
string
system
url
-
Hallo zusammen,
ich schreibe gerade an einem Programm in C#.
Hier habe ich eine Methode mit Rückgabewert, die so aussieht:
public string[] Load_Pictures(object sender, EventArgs e) { DialogResult result = folderBrowserDialog1.ShowDialog(); string[] pictures = null; if (result == DialogResult.OK) { pictureBox1.Image = null; try { pictures = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.jpg"); pictureBox1.Image = Image.FromFile(pictures[1]); } catch (Exception error1) { pictures = null; MessageBox.Show(Convert.ToString(error1)); } } return pictures; }
Den Wert der Variable "pictures" soll man dann von anderen Methoden aus mit
aufrufen können.string[] pict_list = Load_Pictures(sender, e);
Mein Problem ist, dass, wenn ich das Programm starte, mir ein Fehler angezeigt wird:
"'string[] MyApplication.Form1.Load_Pictures(object, System.EventArgs)' hat den falschen Rückgabetyp."
Der Fehler entsteht in Form1.Designer.cs in der Codezeilethis.button1.Click += new System.EventHandler(this.Load_Pictures);
Warum gibt es hier den Fehler?
biberiusmero
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo
Dieser Fehler kommt weil du versuchst, eine Methode mit einem Rückgabewert als Methode für ein Event zu nutzen (button-click). Dies ist laut framework aber so nicht vorgesehen.
Lösung: Ruf in deiner Event-Methode (mit void) deine Methode mit deinem String-Array-Rückgabewert auf.
MfG Trancer. -
Hallo trancedrome,
vielen Dank für deine schnelle Antwort. Ich hätte das Problem schon so gelöst, dass ich den string[] pictures allgemein deklariere und dann die Methode Load_Pictures in diesen string[] schreiben lasse. Aber deine Lösung werde ich mir auch merken.
@zu24: Diese Antwort hättest du dir sparen können...
biberiusmero -
Hallo biberiusmero,
deine Lösung funktioniert zwar, aber im allgemeinen ist davon abzuraten.
Das globale Feld "string[] pictures" ist im Prinzip unnötig und wird dich in Zukunft nur verwirren
(Sobald du dir den Code nach Fertigstellung nochmals ansiehst).
trancedromes Lösung ist zudem fehlersicherer, da der Rückgabewert schlecht verfälscht werden kann.
Bei deiner Lösung könnte z.B. eine andere Methode "string[] pictures" ändern, was im Programm zu unvorhergesehenen Zuständen führt (z.B. beim Auslesen von "string[] pictures").
Fazit: geht auch, ist aber schlechter Stil.
Mfg -
ikatools schrieb:
[...]
Fazit: geht auch, ist aber schlechter Stil.
[...]
Wie wäre es denn besser (mit Code-Beispiel)?
Dass man prüfen muss, ob die Variable gesetzt/gefüllt ist, sollte klar sein. -
Kommt drauf an wie sein restliches Programm aussieht...
Will er nur die Bilder öffnen und in kurzer Zeit was damit machen, würde ich es so lösen (wie du es ja auch schon vorgeschlagen hast):
public void Load_Pictures(object sender, EventArgs e) { //am besten beides im Konstruktor erledigen: //zu öffnende Dateien auf pngs, jpgs und gifs beschränken (nur beispielsweise) folderBrowserDialog1.Filter = "Bilddatei.png (*.png)|*.png|Bilddatei.jpg (*.jpg)|*.jpg|GIF (*.gif)|*.gif"; //oder nur jpgs erlauben: //folderBrowserDialog1.Filter = "Bilddatei.jpg (*.jpg)|*.jpg"; //auswahl mehrerer Dateien erlauben folderBrowserDialog1.Multiselect = true; DialogResult result = folderBrowserDialog1.ShowDialog(); if (result == DialogResult.OK) { string[] pictures = folderBrowserDialog1.FileNames; pictureBox1.Image = null; if(pictures[1] != null){ try{ pictureBox1.Image = Image.FromFile(pictures[1]); }catch (Exception e) { //siehe https://msdn.microsoft.com/de-de/library/stf701f5%28v=vs.110%29.aspx für //alle möglichen Exceptions, evtl. Fehlermeldung an User durchreichen und anpassen/"übersetzen", damit er weiß was gemeint ist } } //hier dann eine weiter verarbeitende Methode aufrufen und pictures übergeben //wie du (trancedrome) ja auch schon vorgeschlagen hast } }
Dauert die Operation tendenziell länger (z.B. wenn die Bilder übers Netzwerk übertragen werden sollen), würd ich das ganze parallelisieren (nur Dateiliste vom user per Dialog abfragen und dann parallel zum aktuellen Thread damit arbeiten)...
Evtl. soll der User aber auch die Möglichkeit haben aus mehreren Ordnern Bilder auszuwählen (Dialog mehrmals öffnen), was wiederum eine Auflistung für den User z.B. in irgendeiner Box/ListView notwendig macht (damit man weiß was man ausgewählt hat), womit man um ein globales "string[] pictures" prinzipiell nicht herumkommt und natürlich wieder auf "Inhaltlichkeit" der Variable geprüft werden muss.
Mir gings nur darum ein globales "string[] pictures", wenn möglich, zu vermeiden.
Mfg
Arthur Dent -
biberiusmero schrieb:
Ich vermute du willst das erste Bild.
try { pictures = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.jpg"); pictureBox1.Image = Image.FromFile(pictures[1]); }
Dann muss der Wert 0 sein, statt 1. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage