Autor Beitrag
AlanWake
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Fr 27.08.10 19:14 
Hallo Leute,

ich bins mal wieder :)

Nach dem ich das Projekt www.c-sharp-forum.de/topic_101225.html geschafft habe wollte ich dieses noch erweitern.

Ist es möglich eine .jpg Datei direkt mit einer Windows Form zu öffnen also wenn ich auf die .jpg Datei klicke mit der rechten Maustaste und dann öffne mit auswähle und mein Programm heraussuche :?:

gruß Alan
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 28.08.10 01:20 
Hi,

Suche bei Google DATEITYP REGISTRIEREN, Suche in der Entwickler-Ecke DATEITYP REGISTRIEREN - wer sucht, der findet. :les:

Grüße,
Yogu

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Sa 28.08.10 01:50 
Nein das meinte ich nicht, ich habe mir eine Windows Form mit einer pictureBox1 erstellt gehabt und wollte das wenn ich auf ein Bild mit Doppelklick oder der rechten Maustaste gehe und dann auf öffne mit, und suche unter Projects, WindowsFormsApplication1, WindowsFormsApplication1, obj, x86, Debug, WindowsFormsApplication1.exe heraus, sodas dann das Bild in die pictureBox1 geladen wird :)

Ist so etwas machbar :?:

Und muss ich dafür die Form1_Load programmieren :?:

gruß Alan
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 28.08.10 08:31 
Hi,

sowas geht über Kommandozeilenargumente. Ich weiss, es ist eine Windows-Forms-App, geht aber trotzdem:
ausblenden C#-Quelltext
1:
string[] args = Environment.GetCommandLineArgs();					

Das könntest Du z.B. im Konstruktur der Form aufgerufen, und dann mit den übergebenen Wert weiterarbeiten.

Kleiner Tip: an Stelle 0 steht bei Ausführung immer der komplette Pfad der Anwendung. Wenn also ein Pfad zu einem Bild übergeben wird, dann ab Stelle 1 im Array.

LG, Marko

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Sa 28.08.10 16:46 
Tut mir leid ich habe kein Meter verstanden :(

Könntest du mir ein Beispiel geben mit deinem Code oder mir sagen wo ich den genau rein kopieren muss als in die Form1.cs oder in die Form1.Designer.cs und wo da :?:

gruß Alan
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 28.08.10 18:04 
Du willst die Datei öffnen, die an das Programm gesendet wurde. Dazu musst du zuerst an den Dateinamen kommen. Wie das geht, hat user profile iconTrashkid2000 beschrieben:

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
string[] args = Environment.GetCommandLineArgs();					

In args sind nun
  • an Stelle 0 der Dateipfad des Programms und
  • an allen weiteren stellen die Pfade zu den Dateien, die an das Programm gesendet wurden.

Wenn also mehr als ein Element vorhanden ist, kannst du auf das Element mit dem Index 1 zugreifen, um an den Dateinamen des Bildes zu kommen.

Nun musst du das Bild nur noch anzeigen. Den Code dürftest du schon haben, momentan wird die Datei ja per Dialog ausgewählt, oder?

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Sa 28.08.10 18:15 
Tut mir leid ich verstehe es immer noch nicht :(

Könntest du mir bitte ein Beispiel Code geben wie du eine Bild Datei öffnen würdest mit Trashkid2000 Code, und bitte nicht in Stichpunkten erklären sondern bitte mit einem Code, sonst verstehe ich es nicht :?:

gruß Alan

ps. Immoment wähle ich ein Bild mit einem Dialog aus aber das stört einfach das ich erst immer über das Programm gehen muss um eine Datei auszuwählen :(

pps. Ein Bild öffne ich so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
            OpenFileDialog Bild = new OpenFileDialog();
            Bild.Filter = "Alle Dateien (*.*)|*.*";

            if (Bild.ShowDialog() == DialogResult.OK)
            {
                this.pictureBox1.Image = new Bitmap(Bild.OpenFile());
            }
            Bild.Dispose();
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 28.08.10 21:00 
Hi,

ich bins wal wieder :wink:

Also, die Methode kannst Du z.B. direkt im Konstruktor der Form aufrufen, oder halt auch auslagern.

Hier mal der Weg im Konstruktor:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public Form1()
{
  InitializeComponent();
  string[] args = Environment.GetCommandLineArgs();
  if (args.Length > 1)
  {
    pictureBox1.Image = Image.FromFile(args[1]);
  }
}


Allerdings wird bei diesem Code halt nur das erste Bild in der pictureBox angezeigt. Also, wenn ich mehrere Bilder ausgewählt habe, müsstest Du festlegen, wie mit den anderen verfahren wird.

LG, Marko

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Sa 28.08.10 22:12 
@ Trashkid2000: Du bist mein Superheld ^^

Ich habe jetzt für Bild,Musik,Text den Code geschrieben :)

Mein Problem jetzt ist, ich habe eine pictureBox, eine richtextBox und einen axWindowsMediaPlayer, wie kann ich es bei der IF programmieren das erkannt wird welche Datei ich versuche zu öffnen, nähmlich es sollen immer 2 von den 3 versteckt sein also wenn ich ein Bild hinein lade, das er nur die pictureBox anzeigt und bei den anderen das gleiche :?:

gruß Alan

ps. Mein Code zu Bild,Musik,Text:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
                pictureBox1.Image = Image.FromFile(args[1]);
                listBox1.Items.AddRange(Directory.GetFiles(Path.GetDirectoryName(args[1]), "*.jpg"));
                listBox1.SelectedItem = args[1];
                WindowsMediaPlayer1.Hide();   
                richTextBox1.Hide();
                pictureBox1.Show();
                listBox1.Select();

                Text = args[1];
                richTextBox1.LoadFile(Text, RichTextBoxStreamType.RichText);
                WindowsMediaPlayer1.Hide();   
                richTextBox1.Show();
                pictureBox1.Hide();

                WindowsMediaPlayer1.URL = args[1];
                WindowsMediaPlayer1.Show();   
                richTextBox1.Hide();
                pictureBox1.Hide();
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Sa 28.08.10 23:31 
Ich habe bis jetzt herausgefunden das ich mit dem Code 2 von 3 öffnen kann:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Hide();
            richTextBox1.Hide();
            axWindowsMediaPlayer1.Hide();
            string[] args = Environment.GetCommandLineArgs();
            if (args.Length > 1)
            {
                try
                {
                    pictureBox1.Image = Image.FromFile(args[1]);
                    pictureBox1.Show();
                }
                catch
                {
                    Text = args[1];
                    richTextBox1.LoadFile(Text, RichTextBoxStreamType.RichText);
                    richTextBox1.Show();
                }
            }
        }


Ich weiß es sieht ziemlich verwirrend aus :(

Brauche Hilfe :)

gruß Alan
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: So 29.08.10 18:03 
Hi,

Sorry, aber diese Lösung ist nicht wirklich gut.
Da ist das try..catch ganz schön misshandelt und nicht zweckgemäß eingesetzt. Und vor allen Dingen könnte im catch-Block auch noch ein Fehler auftreten.

Was ich aber auch lustig finde, wenn man versucht, einen Text als Bild anzuzeigen, dass dann eine OutOfMemoryException geschmissen wird!? Ich meine, nicht anzeigbar und kein Speicher ist schon ein Unterschied. Aber na ja.

Also, eine Unterscheidung von Dateitypen kann schon eine Wissenschaft für sich sein. Schon, wenn man Texte mit verschiedenen Encodings verarbeiten will, muss man schon ganz schön viel Ahnung haben.
Es gibt schon Dateitypen, die eine eindeutige Signatur besitzen, und die man auch auslesen könnte, aber halt (leider) nicht alle.

Für Dein Projekt würde ich vorschlagen, dass Du nach der Dateiendung des Dateinamens, der übergeben wird, unterscheiden tust, wie der Inhalt angezeigt werden soll. Habe das davor geschrieben, weil diese Lösung nicht der beste Weg ist. Denn eine Dateiendung muss erstens nicht vorhanden sein und könnte ich zweitens auch einfach ändern.

So eine Unterscheidung würde dann so aussehen:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
string[] args = Environment.GetCommandLineArgs();

if (args.Length > 1)
{
  FileInfo fi = new FileInfo(args[1]);
  switch (fi.Extension.ToLower())
  {
    case ".jpg":
    case ".jpeg":
    case ".bmp":
    case ".png":
      {
        pictureBox1.Image = Image.FromFile(args[1]);
        break;
      }
    case ".txt":
    case ".rtf":
      {
        //zeige Text an
        break;
      }
    case ".avi":
    case ".mpg":
    case ".mpeg":
      {
        //spiele Video ab
        break;
      }
    default:
      {
        MessageBox.Show("Nicht unterstütztes Dateiformat");
        break;
      }
  }
}

Bestimmt sind noch nicht alle Dateiendungen drin, die denn durch Dein Programm ünterstützt werden würden, und auch einen Fehlerbehandlung muss auf jeden Fall auch noch rein.

LG, Marko

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: So 29.08.10 19:10 
Ich weiß das meine Lösung eine Katastrophe ist :)

Ich weiß nicht mal für was try und catch gut ist ^^, ich habe das einfach ausprobiert gehabt, weil ich dachte wenn ich nur try schreibe also zu Deutsch, versuche, glaute ich das das Programm es nur Versucht und wenn es nicht klappt einfach weitermacht :) ^^
Aber dann hatte ich die Fehlermeldung das entweder catch oder finnaly dazu geschrieben werden müsste, so hatte ich beide ausprobiert und bei catch hat es dann funktioniert ^^
Werde deinen Code nacher gleich ausprobieren, bin gerade am falschen Computer :)

gruß Alan

ps. Bei switch und case habe ich auch noch nicht so wirklich durchgeblickt, bin halt ein hoffnungsloser Fall ^^
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: So 29.08.10 21:11 
user profile iconAlanWake hat folgendes geschrieben Zum zitierten Posting springen:
bin halt ein hoffnungsloser Fall ^^


Du fängst doch gerade mit der Programmierung an. Und jeder hat mal klein angefangen. Es kommt nur auf das Verständnis und der Fähigkeit des analytischen Denkens an. Also nicht so schnell den Kopf in den Sand stecken!

Ansonsten, try...catch...finally ist eine Fehlerbehandlungsroutine. Im try-Block stehen die Anweisungen, die kurz gesagt schief gehen können, im catch-Block dann, was im Falle einer Exception (dabei sollte man auch die auftretenden Exceptions unterscheiden) zu tun ist, und der finally-Anweisung stehen Anweisungen, die mit und ohne Fehler ausgeführt werden - also IMMER.

Aber das solltest Du mal in einem schlauen Buch nachlesen!

Hier noch eine Lösung, die noch viel eleganter ist, wie ich finde.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
private Dictionary<string, FileType> fileTypes = null;
public enum FileType

  Text,
  Graphic,
  Video
}

public Form1()
{
  InitializeComponent();

  fileTypes = new Dictionary<string, FileType>()
  {
    {".jpg", FileType.Graphic},
    {".jpeg", FileType.Graphic},
    {".bmp", FileType.Graphic},
    {".png", FileType.Graphic},
    {".txt", FileType.Text},
    {".rtf", FileType.Text},
    {".avi", FileType.Video},
    {".mpg", FileType.Video},
    {".mpeg", FileType.Video}
  };

  string[] args = Environment.GetCommandLineArgs();

  if (args.Length > 1)
  {
    FileInfo fi = new FileInfo(args[1]);
    string extension = fi.Extension.ToLower();
    if (fileTypes.ContainsKey(extension))
    {
      switch (fileTypes[extension])
      {
        case FileType.Text:
          //zeige Text
          break;
        case FileType.Graphic:
          pictureBox1.Image = Image.FromFile(args[1]);
          break;
        case FileType.Video:
          //spiele Video ab
          break;
      }
    }
    else
    {
      MessageBox.Show("Nicht unterstützter Dateityp");
    }
  }
}


LG, Marko

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Mo 30.08.10 02:05 
Es funktioniert mal wieder einbandfrei, mein C# Held ^^ :)

Ich wollte von Anfang an was mit .mp3,.jpg Erkennung :)

Wegen dir habe ich jetzt nach Jahrelanger Arbeit mein Programm endlich fertig schreiben können :)

Und das mein Programm wenn er den Datei Typ nicht erkennt die Fehlernaricht kommt, ist einfach nur genial :)

Vielen vielen dank Trashkid2000 :!:

Ich verstehe sogar den Code ein bisschen :) , ich habe zu den 3 FileTypes noch ein 4 hinzugefügt, Music :)

Code:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
      private Dictionary<string, FileType> fileTypes = null;
        public enum FileType
        {
            Text,
            Graphic,
            Music,
            Video
        }
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Hide();
            richTextBox1.Hide();
            axWindowsMediaPlayer1.Hide();
            fileTypes = new Dictionary<string, FileType>()
  {
    {".jpg", FileType.Graphic},
    {".jpeg", FileType.Graphic},
    {".bmp", FileType.Graphic},
    {".png", FileType.Graphic},
    {".txt", FileType.Text},
    {".rtf", FileType.Text},
    {".mp3", FileType.Music},
    {".avi", FileType.Video},
    {".mpg", FileType.Video},
    {".mpeg", FileType.Video}
  };

            string[] args = Environment.GetCommandLineArgs();

            if (args.Length > 1)
            {
                FileInfo fi = new FileInfo(args[1]);
                string extension = fi.Extension.ToLower();
                if (fileTypes.ContainsKey(extension))
                {
                    switch (fileTypes[extension])
                    {
                       case FileType.Text:
                            Text = args[1];
                            richTextBox1.LoadFile(Text, RichTextBoxStreamType.RichText);
                            richTextBox1.Show();
                            break;
                       case FileType.Graphic:
                            pictureBox1.Image = Image.FromFile(args[1]);
                            pictureBox1.Show();
                            break;
                       case FileType.Music:
                            axWindowsMediaPlayer1.URL = args[1];
                            axWindowsMediaPlayer1.Show();
                            break;
                       case FileType.Video:
                            axWindowsMediaPlayer1.URL = args[1];
                            axWindowsMediaPlayer1.Show();
                            break;
                    }
                }
                else
                {
                    MessageBox.Show("Nicht unterstützter Dateityp");
                }
            }
        }


gruß Alan

ps. Ich hatte am Anfang Probleme mit dem Code weil das Programm FileInfo nicht erkannt hat aber nachdem ich
using System.IO; hinzugeschrieben hatte war das kein Problem mehr gewesen :)
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 30.08.10 05:46 
Schön,

aber die Fehlerbehandlung fehlt noch! Die muss auf jeden Fall noch rein,
denn bei der Arbeit mit Dateien kann immer was schief gehen.

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Mo 30.08.10 21:13 
Welche Fehlerbehandlung meinst du :?:

gruß Alan
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 30.08.10 21:42 
Nun ja, es können diese Fehler auftreten:

1. auf die Datei, die per Argument übergeben wurde, kann nicht zugegriffen werden, weil sie nicht existiert
2. auf die Datei, die per Argument übergeben wurde, kann nicht zugegriffen werden, weil keine Berechtigungen vorhanden sind
3. auf die Datei, die per Argument übergeben wurde, kann nicht zugegriffen werden, weil ein anderer Prozess sie blockiert
4. die Datei mit der Endung ist nicht der Typ, als welche sie sich ausgibt - es wird die falsche Anzeige gewählt - bum- Exception
5. die Datei ist fehlerhaft und kann nicht angezeigt bzw. abgespielt werden
6. irgendein anderer Fehler ist aufgetreten


Habe ich noch irgendwas vergessen? Ich denke aber, dass mit "irgendein anderer Fehler ist aufgetreten" eigentlich alle Fälle abgefangen sind!

Fehlerbehandlung ist nicht einfach - zugegeben. Und vor allen Dingen an alle Fehler zu denken, die denn auftreten könnten... aber man muss an alles denken. Gerade, wenn denn Benutzer ins Spiel kommen!

Also, zum Anfang würde ich prüfen , ob denn die Dateiendung ausgelesen werden kann. Damit müssten eigentlich Fehlerfall 1 und 2 abgefangen werden.

Die Fehlerfälle 3-6 kannst Du nur prüfen, indem Du versuchst, die Datei zu öffnen. Also so, wie Du die Datei zur Anzeige bringst. Da müsstest Du die Fehlerbehandlung reinsetzen.

Programmiern ist nicht einfach - es ich zwar ziemlich leicht, lauffähige Programme zu erstellen, aber dass diese auch fehlerfrei bzw. absturzsicher laufen, ist schon schwieriger!!

Marko

Für diesen Beitrag haben gedankt: AlanWake
AlanWake Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75
Erhaltene Danke: 2



BeitragVerfasst: Mo 30.08.10 21:49 
Bis jetzt hatte ich noch keine Probleme gehabt :)

Kann aber auftreten :!:

Ich glaube besonders der Fehler 3, den hatte ich schon oft bei anderen Programmen gehabt oder wenn ich versucht hatte eine Datei zu löschen :(

gruß Alan

Kann ich nicht einfach die Form schliesen wenn ein Fehler auftritt, also this.Close(); :?:
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 30.08.10 22:24 
Na ja, der Benutzer sollte schon darüber informiert werden, was für ein Fehler aufgetreten ist, und vielleicht auch, warum der Fehler aufgetreten ist.

Bei einem Close des Programms könntest Du die Fehlerbehandlung auch gleich ganz weglassen, was macht das schon für einen Unterschied, ob das Programm sich einfach schließt (ohne Meldung) oder ganz einfach abstürzt. Da wär der 2. Weg sogar noch der bessere, da der Beutzer dann noch wertvolle Informationen auslesen kann!

Nein ehrlich, die Form einfach zu schließen ist nicht toll!
Fehlerbehandlung sollte auch immer eine Information an den Benutzer weitergeben - oder wenn keine Interaktion mit einem Benutzer, dann wenigstens irgendwo speichern. Z.B. in einer LOG-Datei. Aber die wird dann meistens auch von einem Benutzer gelesen oder analysiert...

Marko

Für diesen Beitrag haben gedankt: AlanWake