Speicherfresser Image

  • VB.NET
  • .NET (FX) 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Olderman.

    @Olderman:

    Olderman schrieb:

    da das Programm nur diese eine Aufgabe (Speicherbedarf) hatte

    Olderman schrieb:

    Ich möchte mehrere Bilddateien (jpg) öffnen , sortieren, evtl. editieren und kopieren.
    Irgendwie widersprechen sich deine Aussagen.
    Was jetzt? Soll das Programm jetzt nur das Bild laden oder willst du es auch sortieren, evtl editieren und kopieren??


    Olderman schrieb:

    Ich hätte das Label auch noch weglassen können und den Dialog mit sonst etwas starten können
    Mir geht es nicht darum, dass du den Dialog mit den Falschen Pfad öffnest. Ich wollte dich nur darauf hinweisen, dass es schlechter Stil ist, im Code Daten, welche auf einem Control angezeigt werden, direkt und ungefiltert in deinem Programm ablauf zu verwenden. Eigentlich solltest du eine eigene Klasse haben, welche sich um die Datenbeschaffung kümmert (Bild laden). Diese kann dann eine (von mehreren) Propertieshaben, welche den Pfad beeinhaltet oder du übergibst der Funtkion zum Laden des Bildes den Pfad. ZUSÄTZLICH zum speichern des Pfades in der Property kannst du den Pfad auch in das Label schreiben. Aber wenn du den Pfad zum Laden des Bildes verwendest, dann bitte nicht den Text des Labels verwende, sondern entweder die Property der Klasse, eine interne, globale/lokale Variable der Form Klasse, in der du den Eventhandler definiert hast oder einfach der Funktion übergeben.
    Ich zum Beispiel würde das Ganze so machen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim m_Picture as Image
    3. Dim imageDataProvider = new ImageDataProvider()
    4. Private Sub LoadPicture_Click(sender As Object, e As EventArgs) Handles Label.Click
    5. Using ofd = new OpenFileDialog()
    6. if ofd.ShowDialog == OK then
    7. Me.imageDataProvider.Path = ofd.FileName
    8. end if
    9. End using
    10. Dim load_image as Image = Me.imageDataProvider.LoadImage()
    11. if (load_image is not Nothing) then
    12. dim copy_image = new Bitmap(load_image)
    13. load_image.dispose()
    14. m_Picture = copy_image
    15. Me.PictureBox.Image = m_Picture
    16. end if
    17. End Sub
    18. End Class
    19. Public Class ImageDataProvider
    20. Private _path As String
    21. Public Property Path As String
    22. Get
    23. Return Me._path
    24. End Get
    25. Set
    26. Me._path = Value
    27. End Set
    28. Public Function LoadImage() As Image
    29. if (String.IsNullOrEmpty(Me.Path)) then Return Nothing
    30. if (Not File.Exists(Me.Path)) then Return Nothing
    31. Dim image As Image = Nothing
    32. Try
    33. image = Image.FromFile(Me.Path)
    34. Catch (ex As Exception)
    35. image = Nothing
    36. End Try
    37. Return image
    38. end Function
    39. End Class
    Eventuell könnte man - sofern gewünscht - die Klasse ImageDataProvider noch weiter abstrahieren (Als Interface implementieren und davon diverse Implementationen bauen (für verschiedene Formate)

    Olderman schrieb:

    Ich hab es probiert und es läuft
    Das schon, aber damit eigenest du dir Angewohnheiten an, die dich vom professionellen Programmieren abbringen.

    Olderman schrieb:

    dass die beiden ersten Antworten es gelöst haben
    Könntest du dann bitte das Thema als Abgeschlossen markieren?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Also eigentlich wollte ich gar nicht mehr reagieren, aber da Du Dir die Zeit genommen hast mir diese lange Antwort zu schreiben, nun doch:
    Bitte lese doch mal meine Beiträge richtig durch, dann wirst du erkennen
    1- Ich habe in einem größeren Programm ein Problem (gehabt).
    2. Die von mir vermuteten Ursachen habe ich in einem anderen vereinfachten Programm nachvollzogen.
    3. Dieses andere vereinfachte Programm habe ich immer weiter reduziert bis diese einige wenige Zeilen übrig geblieben sind. DIeser, aus dem Kontext gerissene und teilweise aus schneller Vereinfachung wirklich nicht schöne, Code
    (Label zu Aufrufen des Dialoges usw) führte immer noch zu dem Fehler. Das war seine einzige Aufgabe und damit für mich ausreichend. Natürlich hätte ich ihn noch schön machen können. Aber ich habe nicht gewusst, dass nicht das Problem sondern mein Code zum Thema wird.
    4.

    Radinator schrieb:

    Olderman schrieb:



    Ich hab es probiert und es läuft
    Das schon, aber damit eigenest du dir Angewohnheiten an, die dich vom professionellen Programmieren abbringen.


    Jetzt verstehe ich diese negative Wertung nicht - wenn sich jemand die Mühe gibt mir eine Lösung vorzuschlagen so sollte ich mir diese wenigstens ansehen. Das habe ich getan und (wie Du eigentlich hättest sehen müssen) festgestellt das dieser Code keine Lösung darstellt, da das Problem weiter auftritt. Das habe ich auch hingeschrieben. Was ist daran falsch?

    Ohne Dir zu nahe treten zu wollen: Ich weiß, dass du es ja nur gut meinst. Aber wenn Du schon so viel Zeit opferst anderen zu helfen, solltest Du die Beiträge genau lesen und nicht nur daran vorbei den Code analysieren.
    Trotzdem Danke und das ist ehrlich gemeint.

    Ich schließe jetzt das Thema weil ich meinen Fehler ja schon lange aufgezeigt bekommen habe.