Picturebox ein bild zuweisen?

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von M-Jay.

    Picturebox ein bild zuweisen?

    Hi,

    habe eine kurze wahrscheinlich recht einfache frage zu der ich leider nirgendwo eine antwort gefunden habe:

    in meinem programm erstelle ich pictureboxen mit folgendem code:

    Quellcode

    1. Dim grafikgestartet(j) As PictureBox
    2. grafikgestartet(j) = New PictureBox
    3. Panel1.Controls.Add(grafikgestartet(j))
    4. grafikgestartet(j).Name = "grafikgestartet" & j
    5. grafikgestartet(j).Size = New Size(34, 34)
    6. grafikgestartet(j).Location = New Point(Xposzeiten + 95, Ypos + 40)
    7. grafikgestartet(j).Visible = False
    8. grafikgestartet(j).BackgroundImage = Image.FromFile("C:\Users\anhorn.SANIVISION\Documents\MultiTimer\Testversion2.9\TimerMitDragAndDrop\TimerMitDragAndDrop\My Project\Gruener-Haken.jpg")


    funktioniert super , da ich das programm aber auch an zb meinem tablet ausführen möchte , brauche ich einen code damit er immer also auch an anderen pcs das bild findet , geht das oder muss ich an jedem pc einen neuen pfad eingeben?

    Vielen dank im vorraus
    auch wenns peinlich ist kannst du mir mal anhand meines beispiels : grafikgestartet(j).BackgroundImage = Image.FromFile("C:\Users\anhorn.SANIVISION\Documents\MultiTimer\Testversion2.9\TimerMitDragAndDrop\TimerMitDragAndDrop\My Project\Gruener-Haken.jpg")

    einen kurzen codeschnippsel basteln weil ich nicht weiß wo ich das einbauen muss ?

    Danke erstmal für deine antwort :)
    Ich glaube, du hast das Bild nicht im selben Ordner (oder einem Unterordner), wie die Anwendung (die liegt nämlich immer in "bin\Debug" oder "bin\Release"). So geht das natürlich nicht, da du am Ende ja nur die Anwendung auslieferst und nicht noch irgendwelche Ordner. Du musst also zuerst einmal die Bilder zu der Anwendung legen (mach dort irgend nen Unterordner "Images" oder so). Dann kannst du so den Pfad zu einem Bild erstellen:

    VB.NET-Quellcode

    1. Path.Combine(Application.StartupPath, "Images\Image1.jpg")
    Du musst natürlich dann die richtigen Namen einsetzen, da hier ist nur ein Beispiel.
    Außerdem brauchst du nicht manuell eine Image-Instanz zu erstellen, du musst der PictureBox nur sagen wo sich das Bild befindet, der Rest passiert automatisch:

    VB.NET-Quellcode

    1. PictureBox1.ImageLocation = pfadZumBild


    Warum du da so viele Pictureboxen erstellst will ich garnicht wissen xD
    lg

    Artentus schrieb:

    Path.Combine(Application.StartupPath, "Images\Image1.jpg")

    also mein code sieht nun folgendermaßen aus :

    Quellcode

    1. grafikgestartet(j).BackgroundImage = Path.Combine(Application.StartupPath, "Bilder\Gruener-Haken.jpg")


    das "Path" wird als fehler angezeigt : Fehler 1 "Path" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden. C:\Users\anhorn.SANIVISION\Documents\MultiTimer\Testversion 2.8\TimerMitDragAndDrop\TimerMitDragAndDrop\Start.vb 666 50 TimerMitDragAndDrop


    was mache ich noch falsch?

    FreakJNS schrieb:


    Außerdem brauchst du nicht manuell eine Image-Instanz zu erstellen, du musst der PictureBox nur sagen wo sich das Bild befindet, der Rest passiert automatisch:








    Visual Basic Quellcode




    1



    PictureBox1.ImageLocation = pfadZumBild






    Warum du da so viele Pictureboxen erstellst will ich garnicht wissen xD
    lg

    warum ich soviele pictureboxen brauche : immer wenn einer meiner teilnehmer gestartet ist soll das mit dem grünen haken angezeigt werden, könnte man auch mit text oder ähnlichem machen womit ich das problem nicht mehr hätte aber das sieht so schon hübscher aus ;)

    Danke euch beiden für das interesse an einer Problemlösung :thumbup:
    Was ist denn "j" bei dir?
    Du deklarierst erst ein Array von j+1 Pictureboxen und erstellst dann für den letzten Element eine Instanz mit New? Und greifst dann immer auf diese neue PictureBox zu oder wie? Wozu dann vorher ein Array deklarieren?
    aber dann stehe ich doch wieder vor dem gleichen problem: Es wird das bild nur dann gefunden wenn es immer an der gleichen stelle ist was ja kein problem ist wenn es auf einem einzigen pc gestartet wird aber schon ein problem ist wenns auf verschiedenen pcs laufen soll?



    Was ist denn "j" bei dir?
    Du deklarierst erst ein Array von j+1 Pictureboxen und erstellst dann für den letzten Element eine Instanz mit New? Und greifst dann immer auf diese neue PictureBox zu oder wie? Wozu dann vorher ein Array deklarieren?


    j ist die anzahl der teilnehmer in einem späteren zeitpunkt wird jeweils zu einem bestimmten zeitpunkt eine bestimmte picturebox visible=true dafür habe ich dann halt eine genaue bezeichnung mit dem j , mag vielleicht unnötig oder unsauber sein, aber ich arbeite damit schon das ganze programm hindurch und werde das erst ab meinem nächsten projekt dann ändern , ist halt mein erstes großprojekt und ich habe einige dinge die ich beim nächstenmal anders machen würde ;)
    Ich glaube du verstehst nicht richtig, Application.Startuppath gibt dir immer den Pfad zurück, in dem sich gerade die Anwendung befindet. Wenn du das verwendest, dann ist es also egal, wo sich die Anwendung befindet, Hauptsache die Bilder sind relativ dazu adressierbar.
    Nein, du musst den Ordner mit Bildern bei der Installation mitgeben, dann findet er den immer.

    EDIT:

    VB.NET-Quellcode

    1. Dim grafikgestartet(j) As PictureBox ' hier deklarierst du ein Array der Grösse j+1
    2. grafikgestartet(j) = New PictureBox 'hier erstellst du EINE PictureBox, am letzten Index
    3. Panel1.Controls.Add(grafikgestartet(j)) 'hier fügst du diese EINE PictureBox deinem Panel zu
    4. grafikgestartet(j).Name = "grafikgestartet" & j' sie bekommt den Namen grafikgestartetX, wo X für j steht
    5. grafikgestartet(j).Size = New Size(34, 34)
    6. grafikgestartet(j).Location = New Point(Xposzeiten + 95, Ypos + 40)
    7. grafikgestartet(j).Visible = False
    8. grafikgestartet(j).BackgroundImage = Image.FromFile("C:\Users\anhorn.SANIVISION\Documents\MultiTimer\Testversion2.9\TimerMitDragAndDrop\TimerMitDragAndDrop\My Project\Gruener-Haken.jpg")
    Was du schreibst:

    VB.NET-Quellcode

    1. grafikgestartet(j).BackgroundImage = Path.Combine(Application.StartupPath, "Bilder\Gruener-Haken.jpg")


    Was ich sagte:

    VB.NET-Quellcode

    1. PictureBox1.ImageLocation = pfadZumBild


    => .ImageLocation

    lg

    FreakJNS schrieb:

    Außerdem brauchst du nicht manuell eine Image-Instanz zu erstellen, du musst der PictureBox nur sagen wo sich das Bild befindet, der Rest passiert automatisch:

    VB.NET-Quellcode

    1. PictureBox1.ImageLocation = pfadZumBild


    Warum du da so viele Pictureboxen erstellst will ich garnicht wissen xD
    lg

    sonne75 schrieb:

    Was ist denn "j" bei dir?
    Du deklarierst erst ein Array von j+1 Pictureboxen und erstellst dann für den letzten Element eine Instanz mit New? Und greifst dann immer auf diese neue PictureBox zu oder wie? Wozu dann vorher ein Array deklarieren?

    Artentus schrieb:

    Application.Startuppath



    okay ich denke das dürfte jetzt soweit der richtige code sein:

    Quellcode

    1. grafikgestartet(j).ImageLocation = Application.StartupPath("Bilder\Gruener-Haken.jpg")


    mekert auch beim erstellen nicht aber wenn ich das starte crasht es weil er das in integer umwandeln will?? warum zum teufel tut er sowas :cursing: ?(
    Wie kommst du von

    Artentus schrieb:

    VB.NET-Quellcode

    1. Path.Combine(Application.StartupPath, "Images\Image1.jpg")

    zu

    M-Jay schrieb:

    VB.NET-Quellcode

    1. grafikgestartet(j).ImageLocation = Application.StartupPath("Bilder\Gruener-Haken.jpg")

    ?????

    EDIT:

    M-Jay schrieb:

    mekert auch beim erstellen nicht aber wenn ich das starte crasht es weil er das in integer umwandeln will?? warum zum teufel tut er sowas :cursing: ?(


    Damit IDE beim Erstellen schon meckert, musst du Option Strict On einschalten, die ist bei dir nämlich aus (sonst könntest du kein "j" als Zahl an den Namen als String anketten).

    Und was ist mit deinem PictureBox-Array, den du nicht nutzt? Habe dir deinen Code doch weiter oben kommentiert.

    sonne75 schrieb:

    Wie kommst du von

    Artentus schrieb:

    VB.NET-Quellcode

    1. Path.Combine(Application.StartupPath, "Images\Image1.jpg")

    zu

    M-Jay schrieb:

    VB.NET-Quellcode

    1. grafikgestartet(j).ImageLocation = Application.StartupPath("Bilder\Gruener-Haken.jpg")

    ?????

    EDIT:

    M-Jay schrieb:

    mekert auch beim erstellen nicht aber wenn ich das starte crasht es weil er das in integer umwandeln will?? warum zum teufel tut er sowas :cursing: ?(


    Damit IDE beim Erstellen schon meckert, musst du Option Strict On einschalten, die ist bei dir nämlich aus (sonst könntest du kein "j" als Zahl an den Namen als String anketten).

    Und was ist mit deinem PictureBox-Array, den du nicht nutzt? Habe dir deinen Code doch weiter oben kommentiert.



    Ja du hast meinen Array kommentiert , allerdings sehe ich da jetzt keinen fehler , denn genauso wie du es kommentiert hast solls ja auch sein ?(


    wie ich von dem 1



    Path.Combine(Application.StartupPath, "Images\Image1.jpg")

    zu
    grafikgestartet(j).ImageLocation = Application.StartupPath("Bilder\Gruener-Haken.jpg")

    komme ist : bei Path.Combine(Application.StartupPath, "Images\Image1.jpg") mekert er / sie / es über das Path daher hab ich was anderes was hier so stand bzw was ich mir so zusammengeformt habe aus dem was hier stand genommen was zuerst gut aussah aber leider nicht funktioniert :(

    M-Jay schrieb:

    Ja du hast meinen Array kommentiert , allerdings sehe ich da jetzt keinen fehler , denn genauso wie du es kommentiert hast solls ja auch sein ?(


    Es soll so sein, dass du ein Array deklarierst und dann nur EINE erstellst? Was für einen Sinn hat es?
    Warum deklarierst du nicht gleich nur eine PictureBox?

    VB.NET-Quellcode

    1. Dim pb As New PictureBox


    Wie kommst du darauf, dass du "Application.StartupPath" etwas in Klammern übergeben kannst???? Es ist ein Pfad, was kannst du einem Pfad übergeben? Dafür gibt es eben Path.Combine() und warum es bei dir nicht lief, hat Artentus schon gesagt.
    Oder du schreibst halt "System.IO.Path.Combine(....)"
    Importe sind aller grundlegendste Grundlagen, wenn man sowas nicht weiß, dann kann man nichts ordentliches zu Stande bringen.
    Ich empfehle dir also dringend, dich erst einmal gründlich mit der Sprache, die du verwendest, auseinanderzusetzen -> *Link*