kostenloser Webspace werbefrei: lima-city


C# falscher Rückgabetyp

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    biberiusmero

    Kostenloser Webspace von biberiusmero

    biberiusmero hat kostenlosen Webspace.

    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
    string[] pict_list = Load_Pictures(sender, e);
    aufrufen können.
    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 Codezeile
    this.button1.Click += new System.EventHandler(this.Load_Pictures);


    Warum gibt es hier den Fehler?

    biberiusmero
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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.
  4. Autor dieses Themas

    biberiusmero

    Kostenloser Webspace von biberiusmero

    biberiusmero hat kostenlosen Webspace.

    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
  5. 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
  6. 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.
  7. 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
  8. biberiusmero schrieb:
    try
                    {
                        pictures = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.jpg");
                        pictureBox1.Image = Image.FromFile(pictures[1]);
                    }

    Ich vermute du willst das erste Bild.
    Dann muss der Wert 0 sein, statt 1.
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!