Laden...

picturebox, image im quellcode eingeben

Erstellt von Vernichter vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.584 Views
V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren
picturebox, image im quellcode eingeben

Tag,

ich moechte gerne, dass der user ueber einen openFileDialog sich die quelle fuer ein bild selber auswaehlen kann. das oeffnen und auswaehlen vom openFileDialog funktioniert auch so weit, nur leider will er einfach nicht meine picturebox damit fuellen 🙁

so weit sieht mein code aus:


private void btnPfad_Click(object sender, System.EventArgs e)
{
string strEingabe = "";
string strKontrolle = "";
openFileDialog1.ShowDialog();
strEingabe = openFileDialog1.FileName.ToString();
strKontrolle = strEingabe.Substring(strEingabe.IndexOf(".",0,strEingabe.Length));
if(strKontrolle == ".jpg" || strKontrolle == ".bmp" || strKontrolle == ".JPG" || strKontrolle == ".jpeg" || strKontrolle == ".gif" || strKontrolle == ".png")
{
txtPfad.Text = strEingabe;
pbFyler.Image == strEingabe; // hier moechte ich den pfad eintragen, was aber leider nicht geht.
}
else
{
MessageBox.Show("Sie haben keine Grafik ausgewählt.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtPfad.Text = "";
}

} 

139 Beiträge seit 2006
vor 17 Jahren

string System.Windows.Forms.PictureBox.ImageLocation....
Probiers mal damit...
Dein Fehler müsste sein: Image != Srting....einfaches debuggen hätte vlt auch geholfen!

und == ist ein Vergeliuchsoperator....

Gruß
Nordwald

Aber wofür soll das gut sein? – Advanced Computing Systems Division von IBM, 1968, zum Microchip

225 Beiträge seit 2006
vor 17 Jahren

Im Prinzip wurde schon alles gesagt. Ich machs nur noch mal deutlich.

Bei pbFyler.Image erwartet er eine Variable vom Typ Image. Du gibst ihm aber einen String.

Was Du brauchst ist pbFyler.ImageLocation = strEingabe.
Da erwartet er wirklich des sourceString.

Und nebenbei würde es, wenn überhaupt, pbFyler.Image = strEingabe; heißen und nicht pbFyler.Image == strEingabe;.

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

1.373 Beiträge seit 2004
vor 17 Jahren

Kleiner Tipp: wenn du aus einem Dateinamen die Endung haben willst, verwende Path.GetExtension(string).

Grüße,
Andre

1.271 Beiträge seit 2005
vor 17 Jahren

Noch ein Tipp: Du kannst bei dem OpenFileDialog auswählen, welche Datei-Typen nur geöffnet werden dürfen! Dann nimmt dieser dir die Arbeit ab und dem Nutzer werden von vornherein nur diese Dateien angezeigt. Hier der Beispielcode aus der MSDN-Doku:

private void button1_Click(object sender, System.EventArgs e)
{
    Stream myStream;
    OpenFileDialog openFileDialog1 = new OpenFileDialog();

    openFileDialog1.InitialDirectory = "c:\\" ;
    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ;
    openFileDialog1.FilterIndex = 2 ;
    openFileDialog1.RestoreDirectory = true ;

    if(openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        if((myStream = openFileDialog1.OpenFile())!= null)
        {
            // Insert code to read the stream here.
            myStream.Close();
        }
    }
}

EIn Beispiel-Pattern für Bilddateien aus der MSDN-Doku: "Image Files(.BMP;.JPG;.GIF)|.BMP;.JPG;.GIF|All files (.)|."
.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

D
128 Beiträge seit 2005
vor 17 Jahren

@Progger: Du musst aber noch bei dem Dialog bedenken, dass Du den Filter per Eingabe von . in die Adressleiste umgehen kannst. Dann zeigt Dir der OpenFileDialog wieder alle Dateien an. Also um das zu verhindern ist eine interne Abfrage schon nicht schlecht. Der Filter erleichtert nur die Auswahl.

Gruss DaMoe

1.271 Beiträge seit 2005
vor 17 Jahren

Du musst . ja nicht in den Filter dazufügen, du kannst es auch weg lassen. Und außerdem schützt kein einziger Mechanismus, man braucht immer eine Fehlerbehandlung: nicht überall, wo JPEG draufsteht (bzw .jpg hinten dran steht), ist auch JPEG drin! Du kannst jeder beliebigen Datei jede beliebige Endung geben, somit schützt dich die Prüfung auf die Endung gar nicht.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

D
128 Beiträge seit 2005
vor 17 Jahren

@Progger: Du hast mich falsch verstanden. Selbst, wenn Du in dem Filter . weg laesst, dann kannst Du trotzdem in der Dateiadresszeile . eingeben, anschliessend auf Oeffnen klicken und er zeigt Dir saemtliche Dateien an. Und kannst somit wieder andere Dateien auswaehlen.
Mir ist ausserdem schon klar, dass wenn jemand boeswillig die Dateiendung einer unbekannten Datei z.B. nach jpeg aendert, dass es damit Probleme gibt.
Das mit der Endung waere nur so eine Art Vorpruefung gewesen: Wenn Die Endung schon mal nicht stimmt, dann brauche ich die Datei gar nicht erst weiter untersuchen.

Gruss, DaMoe

P.S.:
Ich hatte nicht gesehen, dass der "." Filter in Deinem Beispiel integriert war.

V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Tag,

erstmal vielen dank fuer eure antworten, leider geht es immer noch nicht so wie es soll 🙁
der code sieht im moment so aus:


private void btnPfad_Click(object sender, System.EventArgs e)
{
string strEingabe = "";
string strKontrolle = "";
openFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF" ;
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
  strEingabe = openFileDialog1.FileName.ToString();
  strKontrolle = strEingabe.Substring(strEingabe.IndexOf(".",0,strEingabe.Length));
  if(strKontrolle == ".jpg" || strKontrolle == ".bmp" || strKontrolle == ".JPG" ||   strKontrolle == ".jpeg" || strKontrolle == ".gif" || strKontrolle == ".png")
  {
     txtPfad.Text = strEingabe;
     pbFlyer.ImageLocation = strEingabe;
  }
  else
  {
     MessageBox.Show("Sie haben keine Grafik ausgewählt.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Information);
     txtPfad.Text = "";
  }
}	
else
{ 
   txtPfad.Text = "";
}
}

bei "pbFlyer.ImageLocation = strEingabe;" sagt er mir: "D:\Vinyl-Management\frmBooking.cs(517): 'System.Windows.Forms.PictureBox' enthält keine Definition für 'ImageLocation'".

B
1.529 Beiträge seit 2006
vor 17 Jahren

(1)
Du machst zu viele Dinge selbst, für die es Klassen im Framework gibt.

(2)
Die ganze Deklaration der Einstellungen der openFileDialogBox kannst du im Designer vornehmen. Beachte dabei auch andere für dich wichtige Einstellungen wie AddExtension, CheckFileExists etc.
Der Filter wird hier nur zum besseren Verständnis aufgeführt.

(3)
Ich würde nicht jedesmal den Filter umstellen. Wenn der Nutzer ihn absichtlich umstellt, rechnet er auch damit, ihn absichtlich zurück stellen zu müssen. Ansonsten verärgert man den Nutzer nur, indem man ständig seine Einstellungen verändert.

(4)
Du solltest nicht das aktuelle Verzeichnis neu setzen. Siehe Anmerkung (3)
Aber wenn schon, dann nicht fix auf "c:&quot; (das gibt es nämlich nicht immer) sondern zum Beispiel so:

openFileDialog1.InitialDirectory = Path.GetPathRoot( Environment.SystemDirectory );

Oder auf das zuletzt eingestellte Verzeichnis:

openFileDialog1.InitialDirectory = Path.GetFullPath( (openFileDialog1.FileName.Length > 0) ? openFileDialog1.FileName : Environment.SystemDirectory );

(5)
Wenn du dem Nutzer "Fehler" sagst, musst du auch Fehler anzeigen. Daher entweder den MessageBox-Text umschreiben oder das Icon ändern

(6)
Wenn der Dialog nicht mit OK beendet wird (also Abbrechen, ESC oder weg-x-en), erwartet der Benutzer, dass alles beim Alten bleibt. Daher entfällt das äußere else.

(7)
PictureBox.ImageLocation bzw. PictureBox.Load gibt es erst ab Version 2.0. Vorher musste du ein neues Image zuweisen.

(8)
Es können beim Zuweisen eines neuen Bildes Exceptions geworfen werden. Daher muss das Zuweisen in einen try-catch-Block.

(9)
Wenn ein Fehler auftritt, erwartet der Benutzer, dass alles beim alten bleibt. Daher die ganzen Zuweisungen im Fehlerfall weg.

(10)

using System.IO;
using System.Drawing;
using System;

private void btnPfad_Click(object sender, System.EventArgs e)
{
   // wenn du den File-Dialog nicht weiter nutzt, solltest du diese ganze Initialisierung hier auslagern bzw. im Designer einstellen
   openFileDialog1.Filter = @"All Image Files|*.BMP;*.JPG;*.JPEG;*.GIF;*.PNG|Windows Bitmap|*.BMP|JPEG|*.JPG;*.JPEG|Compuserve GIF|*.GIF|Portable Network Graphics|*.PNG|Alle Dateien|*.*";
   // Dialog mit OK beendet = Auswahl erfolgreich ???
   if(openFileDialog1.ShowDialog() == DialogResult.OK)
   {
      try
      {
         // Dateiextension lesen und in Großbuchstaben wandeln
         string strExtension = Path.GetExtension( openFileDialog1.FileName.ToString() ).ToUpper();
         // prüfen, ob die Extension im Filter vorkommt, falls nein ist es keiner der Typen => weiter zur Fehlerbehandlung
         if( openFileDialog1.Filter.IndexOf( strExtension ) == -1 )
         {
            throw new Exception();
         }
         // diese Zeile für Version 1.1 und aufwärts
         pbFlyer.Image = Image.FromFile( openFileDialog1.FileName );
         // diese Zeile ab Version 2.0
         // Bild laden (und alle Backslash durch Slash ersetzen )
         pbFlyer.Load( @"file:///" + openFileDialog1.FileName.Replace( @'\', @'/' );
         // erst Bild laden, dann Namen ändern (kommt eine Exception, bleibt der Name beim Alten)
         txtPfad.Text = openFileDialog1.FileName;
      }
      catch
      {
         // hier landet jeder Fehler
         MessageBox.Show(@"Die angegebene Datei ist entweder beschädigt oder enthält kein bekanntes Bildformat",@"Unbekanntes Bildformat",MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
      finally
      {
         // anschließénd die Ansicht aktualisieren
         txtPfad.Refresh();
         pbFlyer.Refresh();
      }
   }
}

(11)
Dies ist eine ungestestete Version als Grundgerüst zum Bearbeiten.
(Take it or leave it)

V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Tag,

es geht, vielen vielen dank. ihr seit die besten 🙂

EDIT: ich bin verflucht 🙁 nun kann ich nicht mehr speichern.

er sagt mir jetzt:

System.Data.OleDb.OleDbException: Datei 'E:\vinyl-management.mdb' nicht gefunden.
at System.Data.OleDb.OleDbConnection.ProcessResults(Int32 hr)
at System.Data.OleDb.OleDbConnection.InitializeProvider()
at System.Data.OleDb.OleDbConnection.Open()
at Vinyl_Management.frmBooking.save() in d:\vinyl-management\frmbooking.cs:line 672

habe in form_load() zur datenbank anbindung folgendes stehen:

con.ConnectionString = "Data Source=vinyl-management.mdb;Provider=Microsoft.Jet.OLEDB.4.0";

damit er heit die datenbank ausm /debug-ordner nimmt. und jedesmal, wenn ich ein bild ausgewaehlt habe, geht er auf "'E:\vinyl-management.mdb'". habe auch schon vor dem speichern "con.ConnectionString = "Data Source=vinyl-management.mdb;Provider=Microsoft.Jet.OLEDB.4.0";" geschrieben, bringt leider auch nichts, da er weiterhin mir diesen fehler ausgibt 🙁

V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Tag,

*push* keiner eine ahnung?
tur mir echt leid, wenn ich auf den sac* gehe - aber ich hab echt keine ahnung wie ich das hinbekommen soll.

225 Beiträge seit 2006
vor 17 Jahren

Wie wärs du setzt den Pfad mal in Anführungszeichen und verwendest vor allem den kompletten Pfad. Und dabei nich vergessen die "&quot; in "\" umzuändern.

Der Fehler dürfte klar sein. Er findet die Datenbank nicht.
Also Pfad und Syntax checken.

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^

915 Beiträge seit 2006
vor 17 Jahren

Aufpassen unter VS2005 wegen: „\v“ Tabulator, vertikal \v Tabulator.
Hatte da letztens auch nicht schlecht gestaunt..

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

B
1.529 Beiträge seit 2006
vor 17 Jahren

Einfach angewöhnen vor jeden String, der kein Steuerzeichen enthält, ein @ zu setzen.

V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Tag,

also mit dem @:

con.ConnectionString = @"Data Source=vinyl-management.mdb;Provider=Microsoft.Jet.OLEDB.4.0";

ist das so richtig? was bringt mir das @ vor dem string?

mit dem absolut-pfad: das bringt mir doch nichts, wenn ich "E:&quot; vorgebe und der anwender installiert das prog auf "C:&quot; findet er die datenbank nicht. deshalb hab ich dort keine genauen-pfad stehen.

und das er die datenbank nicht findet war mir klar, nur ich weiß heit nicht, wie ich es beheben kann, da dieser fehler nur auftaucht, wenn ich bild in die picturebox lade.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Das @ vor einem String deaktiviert die Auswertung von Steuerzeichen.

So besteht der String "a\nb" aud drei Zeichen: einem a, einem b und dem Zeichen für Neue Zeile dazwischen.
Hingegen besteht der String @"a\nb" aus genau den vier Zeichen, die dort auch stehen.

Dem entsprechend muss man bei einem Pfadstring wie @"C.\test" auch nur noch einen Backslash schreiben.

Ich vermute mal, dass er die Datenbank nicht findet, weil beim Bild laden der aktuelle Pfad verstellt wird. Also würde ich dir empfehlen, die Datenbank einfach in den anwendungsspezifischen Pfad zu installieren (der ist nämlich genau dafür da).

Also mit

string dbpath = Environment.GetFolderPath( Environment.SpecialFolder.XXX ) + @"\Hersteller\Anwendung\vinyl-management.mdb"

und einem passenden SpecialFolders den gewünschten Pfad einstellen.
So etwas kann man gut im ctor erledigen und dann einer readonly Property speichern.

EDIT: spellcheck

V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Tag,

dann muesste ich jedoch dem benutzer vorgeben, wo er mein programm installieren muss?! und das moechte ich ja eigentlich nicht.

btw: mit dem satz "So etwas kann man gut im ctor erledigen und dann einer readonly Property speichern." kann ich nicht wirklich was anfangen. 🙁

B
1.529 Beiträge seit 2006
vor 17 Jahren

Du musst es dem Benutzer eben nicht vorgeben. Windows kümmert sich um die Pfade.
Diese liegen alle unter "Dokumente und Einstellungen\All Users&quot; für gemeinsame Daten (= für alle Benutzer gleich) oder "Dokumente und Einstellungen&lt;<Benutzername>>&quot; für persönliche (benutzerspezifische) Daten.
Der Name des Unterordners relativ zu den oben angegebenen Pfaden ist abhängig vom gewählten Spezialordner.
Dies hat einige Vorteile:
1.) Du brauchst dich überhaupt nicht um Pfade zu kümmern, macht alles Windows.
2.) Das Programm kann installiert sein, wo es will. Nur der Pfad zur Datenbank bleibt gleich.
3.) Du benutzt das Verzeichnis "Dokumente und Einstellungen" konsistent zu seinem Zweck (und nur dieses braucht gesichert zu werden, um alle Daten und Einstellungen zu haben).

Der Satz

So etwas kann man gut im ctor erledigen und dann einer readonly Property speichern. bedeutet ungefähr so etwas

public class MyClass
{
   public readonly string DataBaseFile;
   public MyClass() : base()
   {
      this.DataBaseFile = Environment.GetFolderPath( Environment.SpecialFolder.CommonApplicationData ) + @"\MyManufactorer\MyApplication\vinyl-management.mdb";
   }
}
V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Tag,

hab es nun so weit geschaft.
als letztes muesste ich jetzt wissen, wie ich eine picturebox leere - sprich das bild "loesche", damit das bild nach dem speichern wieder verschwindet.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Blende doch einfach die Picturebox aus.

V
Vernichter Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Tag,

omg, dass mir das nicht selber eingefallen ist 8o

vielen dank an alle, die mir geholfen haben.