Ich habe ein Klasse erstellt Bilder, kann die im Hauptform 1 zwar aufrufen, aber nur mit Fehlermeldung

  • VB.NET

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

    Ich habe ein Klasse erstellt Bilder, kann die im Hauptform 1 zwar aufrufen, aber nur mit Fehlermeldung

    Hallo Gemeinde,

    ich hab da mal wieder eine Frage, ich arbeite an einem Projekt wo Kartenbilder angezeigt werden (Tarot).
    Nun hab ich das Problem, dass ich Bilder als Klasse anlegen will, was soweit auch funktioniert. Hintergrund, ich will die als Klasse haben, um mehr Übersicht zu bekommen. Da das Programm schon jetzt sehr groß ist.

    Public Class karte

    Public Function Narr1() As Integer
    Narr1 = System.IO.File.ReadAllText("C:\Users\Joachim\Desktop\Tarot\Narr3.jpg")
    End Function


    Public Function Magier1() As Integer
    Magier1 = System.IO.File.ReadAllText("C:\Users\Joachim\Desktop\Tarot\Magier1.jpg")
    End Function

    end Klass
    wobei mich etwas wundert dass, er bei readalltext nicht meckert. Bei mir wird kein Fehler angezeigt. Soweit so gut.

    Wenn ich jetzt aber das Jpg im Hauptform aufrufen will, geht das nicht. Irgenwo ist wohl ein Denkfehler, hab schon ganz viel ausprobiert
    und könnte mir zur Not damit behelfen. Dass ich die Picturbox als leer im Form anlege und die Bilder dann per Pfad lade, was wunderbar läuft.

    ich habe im Hauptform

    Dim Tarot2 As New karte


    und versuche jetzt über Tarot2 an mein jpg in der Klasse zu kommen. Leider klappt das nicht. Meine Frage jetzt, geht das generell nicht, bin ich auf dem falschen Weg? Oder ist das generell verkehrt?

    das ist mein Hauptform

    mit den Pfaden lade ich die leere Picturebox, wie gesagt, aber ich brauche mehr Übersicht.


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click


    Select Case x

    Case 0
    PictureBox1.Load("C:\Users\Joachim\Desktop\Tarotbilder\herrscher1.jpg")

    Case 1
    PictureBox1.Load("C:\Users\Joachim\Desktop\Tarotbilder\Magier1.jpg")

    Case 2
    PictureBox1.Load("C:\Users\Joachim\Desktop\Tarotbilder\Turm1.jpg")
    Case 3

    PictureBox1.Image = Tarot2.Narr1 (hier klappt es Nicht)


    x = -1
    End Select
    x += 1

    End Sub


    End Class


    Vielen Dank im Vorraus, falls ihr eine Idee habt, ansonsten wünsche ich allen ein schönes WE

    Gruß Joahim

    Abe2012 schrieb:

    VB.NET-Quellcode

    1. Public Function Narr1() As Integer
    2. Narr1 = System.IO.File.ReadAllText("C:\Users\Joachim\Desktop\Tarot\Narr3.jpg")
    3. End Function
    What?
    Gib Deinem Programm schleunigst Option Strict On.
    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!
    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt

    hab doch geschrieben, dass ich mich gewundert hatte, dass er bei readalltext nicht meckert. Ich wäre gar nicht in die Verlegenheit gekommen zu fragen, wenn ich das Option Strict On gekannt hätte. Geht das überhaupt? Bilder als Klasse.

    der Narr1 ist ein Bild in meiner Resourcendatei. -:)

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

    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt

    Ich schreibe ein Programm, das verschiedene Kartenauslagen (Tarot anzeigt) ungefähr 10 verschiedene Auslagen. Funktioniert bislang auch alles.
    Mein Problem ist der Programm Umfang, ich habe eine Resource mit momentan 75 Bildern die mittels Zufallscode zur Laufzeit generiert und in Pictureboxen angezeigt werden. mein Problem ist, das Programm wird sehr umfangreich, ich werde etwa 80 Pictureboxen brauchen, etwa 10 Formulare, und im Anfang 75 Karten. Später wenn ich mehr Kartendecks anzeigen lassen will, werden es wohl um die 300 Bilder werden.
    Ich hatte ja versucht die Klasse mit allreaad zu schreiben. Ok, inzwischen ist mir klar das war blöd. Ich möchte das so hinbekommmen.

    Public class karte

    Public Function (bla)

    Image = ("") hier dann der Pfad wo das Bild geladen werden soll.

    Function end

    end class

    das ganze möchte ich dann im Hauptform über Klasse aufrufen.

    dim tarot as New karte

    picturbox.image = hier müsste dann der klassen Aufruf folgen.

    das bekomme ich nicht hin.

    Allerdings wie gesagt, kann ich das auch so aufrufen, in dem ich die Picturebox einfach leer anlege und dann die Karte aus dem recourcen Pool über den Dateipfad aufrufe, geht ja wunderbar.

    wie gesagt, es geht mir um die Übersicht. Es wäre schön, wenn ich die ganzen Dateipfade zu den Bildern als Klasse auslagern könnte, und im Hauptprogramm nur noch der Aufruf zur Klasse stehen bleibt.

    ich hoffe das war jetzt etwas klarer.

    ;)

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

    @Abe2012
    Wieso legst du eine Klasse für die Bilder an und machst nicht gleich eine Klasse für die Karten und das zugehörige Bild ist eine Property der Klasse. Die ganzen Bilder der Karten würde ich noch in einen Ordner packen und so benennen, dass man mit dem Kartentyp direkt den Pfad zum Bild bestimmen kann. (Beispiel: Die Karte Magier soll als Eigenschaft "Karte" Magier haben und das Bild soll Magier.jpg heißen und im bin/Debug/cards Ordner deines Projekts liegen). Hier ein kleines Beispiel:
    Karte.vb

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Karte
    3. Public Property Karte As TarotKarte
    4. 'In der Bild-Property wird das Bild gespeichert
    5. Public Property Bild As Image
    6. Public Sub New(tarotKarte As TarotKarte)
    7. Karte = tarotKarte
    8. 'Die Bilder würde ich nicht in die Ressourcen packen, sondern in einen Bilderordner geben, den du später mitlieferst
    9. 'Die Bilder benennst du dann so wie die TarotKarte
    10. GetPicture()
    11. End Sub
    12. 'Benennung der Karten
    13. Public Enum TarotKarte
    14. Magier
    15. Narr
    16. 'usw.
    17. End Enum
    18. Public Sub GetPicture()
    19. 'Der Bilderordner heißt cards und befindet sich im Debug/bin Ordner deines Projektes
    20. Dim pfad As String = "cards" + Karte.ToString() + ".jpg"
    21. Bild = Image.FromFile(pfad, True)
    22. End Sub
    23. End Class

    Zeichnen würde ich das ganze nicht in Pictureboxen, sondern entweder direkt auf die Form oder auf ein Panel. Das ganze Zeichnen spielt sich im Paint-Event des jeweiligen Steuerelements ab. Falls du einen Kartenstapel zeichnen möchtest (List (Of Karte)) würde ich in einer Schleife die ganzen Karten zeichnen lassen.

    Hier noch ein kurzes Codebeispiel mit einer einzelnen Karte, die auf die Form gezeichnet wird:

    VB.NET-Quellcode

    1. Private TestKarte As New Karte(Karte.TarotKarte.Magier)
    2. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    3. 'Koordinaten (10|10) Breite = 50 Pixel und Höhe = 80 Pixel
    4. e.Graphics.DrawImage(TestKarte.Bild, 10, 10, 50, 80)
    5. End Sub

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom

    Abe2012 schrieb:

    jetzt wird der Fehler angezeigt.
    1. Welcher?
    2. Beseitige solch Fehler, um mit den Datentypen richtig zu arbeiten.
    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!

    Hallo Switcherlap997

    Danke an euch alle, du hast genau das Problem erfasst. So meinte ich das eigentlich. Ich hab die Picturebox verwendet, weil ich noch nicht viel mit GDI gemacht habe und gerade eben erst angefangen mich mit GDI auseinanderzusetzen. Das mit dem Panel hatte ich auch schon überlegt, hatte da aber das Problem mit dem stretchImage, das ich unbedingt brauche um die Bilder anzupassen. Bin deshalb erst mal bei der ungeliebten Picturebox geblieben.

    Der Punkt ist ja, dass das mit der Picturebox nicht die reine Freude ist. Aber hat bislang so weit ja gut funktioniert. Nur langsam merke ich dass das nicht die beste Idee ist.

    Deshalb will ich die Bilder ja auslagern. Genau wie du es schreibst. Danke für den Ansatz. Vielleicht löst das dann auch das Problem, dass das Programm zwar läuft, aber sich ab und an recht hakelig verhält. Ich werde mich zunächst wohl mehr mit GDI beschäftigen.

    Der Ansatz hilft sehr weiter.

    Noch Mal besten Dank an alle, für die Hilfe

    Gruß Joachim

    RodFromGermany schrieb:

    Abe2012 schrieb:

    jetzt wird der Fehler angezeigt.
    1. Welcher?
    2. Beseitige solch Fehler, um mit den Datentypen richtig zu arbeiten.
    Dieser Fehler mit dem Readalltext, hatte mich ja eh schon gewundert, dass da keine Fehlermeldung kam. Mit Option strict,
    kam sie, leider nicht nur der Fehler *stöhn*
    Aber dein Tip war wirklich hilfreich, auch wenn ich jetzt einiges zu tun habe die Fehler auszumerzen die mir mit Option strict off nicht gezeigt
    wurden.
    Aber unsauber programmierter Code ist auch nicht der Burner, auch wenns klappt.
    ReadAllText("C:\Users\Joachim\Desktop\Tarot\Narr3.jpg")

    Danke

    Abe2012 schrieb:

    auch wenns klappt.
    Wenn Du so rangehst, werden Dir diejenigen unter uns, die beim Erklären weniger Fehler machen, Dir auch weniger helfen.

    VB.NET-Quellcode

    1. Dim bmp = New Bitmap("C:\Temp\xxx.jpg")
    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!