Bitmap kann Image nicht in Picturebox setzen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bitmap kann Image nicht in Picturebox setzen

    Guten Tag!
    Ich habe irgendwie einen komischen Fehler, den ich irgendwie nicht lösen kann.
    Ich habe an der Stelle ein break gesetzt und anscheinend ist pictureBox1.Image = null

    Mein Code:

    C#-Quellcode

    1. private void CaptureDesktopToolStripMenuItem_Click(object sender, EventArgs e)
    2. {
    3. using (Bitmap desktop = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
    4. Screen.PrimaryScreen.Bounds.Height))
    5. {
    6. using (Graphics g = Graphics.FromImage(desktop))
    7. {
    8. g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
    9. Screen.PrimaryScreen.Bounds.Y,
    10. 0, 0,
    11. desktop.Size,
    12. CopyPixelOperation.SourceCopy);
    13. Debug_LastResult lastresult = new Debug_LastResult();
    14. lastresult.pictureBox1.Image = desktop;
    15. }
    16. }

    Habe auch in der Zeile 3 ein break gesetzt und anscheinend sind alle Werte gefüllt 8|
    Was hab ich falsch gemacht?

    Mit freundlichen Grüßen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „meikel__“ ()

    Was ist Debug_LastResult denn für ein Typ? Eine Form? Wenn ja, schlechte Architektur.
    Controls sind privat zu halten und sollten nur von der entsprechenden Klasse angesprochen werden, nicht von außen.

    Gib' somit das Bild lieber über den Konstruktor mit und setze es dann intern.
    Ansonsten bleibt nur zu sagen, dass wir noch mehr Code brauchen (auch von Debug_LastResult).

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Vollzitat entfernt. ~Trade
    Danke für den Tipp!
    Ja, "Debug_LastResult" ist eine Form und hat nur eine Picturebox und somit "keinen" Code.
    Debug_LastResult

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace W8
    11. {
    12. public partial class Debug_LastResult : Form
    13. {
    14. public Debug_LastResult()
    15. {
    16. InitializeComponent();
    17. }
    18. }
    19. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „meikel__“ ()

    meikel__ schrieb:

    Was hab ich falsch gemacht?
    Du hast Deine Bitmap desktop in einem using-Statement erzeugt.
    Wenn das using beendet ist, wird die Bitmap disposed, also das Image der PB.
    Die Bitmap wird beräumt, wenn die PictureBox disposesd wird oder ihr ein neues Image zugewiesen wird.
    Mach aus dem using eine normale lokale Variable.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jo, das ist sehr schlechte Architektur. Deine PictureBox müsste dann ja public sein, oder? Controls sind aber eigentlich private Member und folglich auch so zu behandeln. Das ist sonst nicht OOP-konform.
    Ändere das mal zu private und überlade den Konstruktor bzw. verändere ihn so, dass er ein Bitmap annimmt und die kannst Du dann der PictureBox zuweisen.

    Und dann wie RodFromGermany sagt, solltest Du diese von Hand disposen, wenn Du sie nicht mehr brauchst.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:


    Controls sind privat zu halten und sollten nur von der entsprechenden Klasse angesprochen werden, nicht von außen.


    Werden in VB.NET nicht alle Controls als Friend automatisch vom Designer generiert?
    Das ist meine Signatur und sie wird wunderbar sein!
    Weiß nicht, aber wenn dem so sein sollte, dann bestätigt sich halt mal wieder, was Microsoft bei VB.NET für einen Mist gebaut hat.^^
    Dann würde mal wieder das OOP-Prinzip missachtet, nur, um das Verständnis und die Benutzung zu erleichtern. In C# zumindest ist es standardmäßig private, was ja auch vollkommen korrekt ist.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hast Du das nun OOP-konform angepasst? ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    solltest Du diese von Hand disposen
    Nein. Die Instanz wird an die PB übertragen, sie darf nicht disposed werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bin ich jetzt retarded oder muss er nicht dann noch das Bild in der PictureBox disposen?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    disposen
    Wenn Du nix machst, wird alles bei Programmbeendigung oder GC.Collect() aufgeräumt.
    Bei ressource-intensiven Vorgängen sollte das PictureBox1.Image disposed werden, bevor das neue Bild zugewiesen wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!