Picturebox vor Flowlayoutpanel

  • VB.NET

Es gibt 185 Antworten in diesem Thema. Der letzte Beitrag () ist von Schmandal.

    Hust, na klar habe ich JETZT das Card-Objekt. Nun habe ich auch keine Fehler und habe die TabPage invalidated.

    Gezeichnete Bilder scheint es trotzdem "noch" nicht zu geben.

    Änderung:

    VB.NET-Quellcode

    1. e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    2. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    3. For Each card In cardobjects
    4. 'Hier komme ich JETZT weiter
    5. card.DrawMe(e.Graphics)
    6. Next
    Also ich kann daran nichts Auffälliges entdecken. Bei der Paint Prozedur kommt sowohl das Bild, wie auch die Koordinaten und der Kartenname wunderbar an.

    Wenn ich alles nun richtig verstanden habe, sollten sich die Bilder (10 Stück sind es) auf der TabPage zeichnen korrekt?

    Edit: Haltepunkt habe ich natürlich gesetzt, aber soweit ich alles verstanden habe, ist alles ok.
    also mir ist deine Zeichenmethode suspekt:

    VB.NET-Quellcode

    1. Public Sub Drawme(g As Graphics)
    2. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    3. g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    4. g.DrawImage(cardimage, New Rectangle(xcard, ycard, standardx, standardy))
    5. End Sub
    Wo kommt standardx, standardy her, und enthalten die sinnvolle Werte? Also befindet sich das Rechteck überhaupt im sichtbaren bereich der TabPage, und ist es größer als mw. 20 Pixel?


    und die Graphics-Konfiguration muss nicht jedesmal neu gemacht werden, sonder wie ich gezeigt: Einmal, vor der Schleife im Paint-Event, dann sind sie konfiguriert die Graphics.
    In standardx steht der Wert 70 und in standardy 110.
    xcard beginnt bei 0 und inkrementiert bei jedem aufruf um 30.
    ycard bleibt bei 0.

    Ich habe übrigens alle Werte auch durch Zahlen ersetzt um ausschließen zu können, dass es an den Variablen liegt. Habe alle Variablen in der Console ausgeben lassen. Alles in Ordnung.

    Danke, habe ich erledigt @ Graphics-Konfiguration.

    EDIT:
    @ErfinderDesRades
    /
    @RodFromGermany

    Ach super, es hat nun alles geklappt, ich hatte statt bmpindexed das bmp in das Objekt gespeichert.

    Leider kommt nun das nächste Problem :(.

    VB.NET-Quellcode

    1. For Each card In cardobjects
    2. card.DrawMe(e.Graphics)
    3. Next


    Bei card.DrawMe(e.Graphics) hab ich nun das Problem, dass Option Strict kein Latebinding erlaubt. Wie kann ich das ändern?

    // Erledigt!

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Schmandal“ ()

    Schmandal schrieb:

    card.DrawMe(e.Graphics)
    ist wie genau deklariert?
    Steht da ein Parameter vom Typ Object drin, wo der Typ Graphics drin stehen müsste?
    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!
    Also es funktioniert jetzt wunderbar.

    Ich habe es nun folgendermaßen gelöst:

    VB.NET-Quellcode

    1. Private Sub Tabpage2_Paint(sender As Object, e As PaintEventArgs) Handles TabPage2.Paint
    2. e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    3. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    4. For Each card As Cards In cardobjectski
    5. card.Drawme(e.Graphics)
    6. Next
    7. End Sub


    Und das andere Late Binding Problem habe ich mit einem Linq.Jarray gelöst, wobei ich nicht genau weiß ob ein anderer Weg besser gewesen wäre?

    VB.NET-Quellcode

    1. With New directwr
    2. Dim htmlki As String = String.Empty
    3. info.Text = info.Text & vbCrLf & "KIDeck wird geholt... bitte warten"
    4. htmlki = .GetResponse("haar tee tee Pe:Slash/xpiepXpiepx/controlki.PeHaarPe", "glogiccards=1")
    5. Dim sepdeckki As String() = htmlki.Split(CType("|", Char()))
    6. Dim objki As Linq.JArray
    7. objki = CType(JsonConvert.DeserializeObject(sepdeckki(0)), Linq.JArray)
    8. 'inhandki = CType(JsonConvert.DeserializeObject(sepdeckki(0)), Linq.JArray)
    9. 'offhandki = CType(JsonConvert.DeserializeObject(sepdeckki(1)), Linq.JArray)
    10. For Each lolki In objki
    11. Dim cardpicki As String = lolki("cardpicture").ToString
    12. Dim cardnameki As String = lolki("cardname").ToString
    13. Dim cardrangeki As String = lolki("cardrange").ToString
    14. Dim attackpowerki As Integer = CInt(lolki("cardvalue").ToString)
    15. Dim cardpropki As String = lolki("cardproperties").ToString
    16. Dim cidki As Integer = CInt(lolki("cardid").ToString)
    17. CartographerKI.Add(cardpicki)
    18. Dim complete = sAppPath & "karten\" & cardpicki
    19. Next
    20. End With

    Schmandal schrieb:

    VB.NET-Quellcode

    1. Dim sepdeckki As String() = htmlki.Split(CType("|", Char()))
    Char geht unter VB.NET so:

    VB.NET-Quellcode

    1. Dim sepdeckki As String() = htmlki.Split("|"c)

    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!

    Schmandal schrieb:

    Und das andere Late Binding Problem habe ich mit einem Linq.Jarray gelöst, wobei ich nicht genau weiß ob ein anderer Weg besser gewesen wäre?
    hab ich was verpasst - was war das andere LateBinding-Problem?

    Königsweg, um LatebindingProbleme zu lösen ist, die Datentypen so zu wählen, dass sie auch zueinander passen, und dass nur Member aufgerufen werden, die auch existieren.

    Was ist dieses directwr für ein Ding?

    ErfinderDesRades schrieb:

    directwr


    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Imports System.Text
    4. Public Class directwr
    5. Public Function GetResponse(ByVal url As String) As String
    6. request = CType(HttpWebRequest.Create(url), HttpWebRequest)
    7. request.CookieContainer = cookiecon
    8. response = CType(request.GetResponse(), HttpWebResponse)
    9. Return New StreamReader(response.GetResponseStream()).ReadToEnd()
    10. End Function
    11. Public Function GetResponse(ByVal url As String, ByVal post As String) As String
    12. request = CType(HttpWebRequest.Create(url), HttpWebRequest)
    13. request.CookieContainer = cookiecon
    14. request.Method = "POST"
    15. request.AllowAutoRedirect = True
    16. request.UserAgent = "Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0"
    17. request.ContentType = "application/x-www-form-urlencoded"
    18. Dim byteArr() As Byte = Encoding.Default.GetBytes(post)
    19. request.ContentLength = byteArr.Length
    20. Dim dataStream As Stream = request.GetRequestStream()
    21. dataStream.Write(byteArr, 0, byteArr.Length)
    22. response = CType(request.GetResponse(), HttpWebResponse)
    23. Return New StreamReader(response.GetResponseStream()).ReadToEnd()
    24. response.Close()
    25. End Function
    26. End Class
    Mahlzeit,

    wenn ich nun die Karten gezeichnet habe und nun eine oder mehrere Karten aus der List(of Object) entfernt habe, und ich die Karten neu zeichnen lasse, habe ich immer eine Lücke an den Stellen, aus denen ich die Karte entfernt habe. Kann ich die Liste dann einfach neu erstellen oder gibt es einen besseren Weg das Problem zu lösen?
    @Schmandal Du musst die Position jeder Karte als Funktion ihrer Position im Stapel berechnen. Wenn eine Karte weg ist, dann rücken alle anderen nach.
    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!

    RodFromGermany schrieb:

    Du musst die Position jeder Karte als Funktion ihrer Position im Stapel berechnen.


    Alles klar, habe ich kapiert. Ich war einfach nur der Meinung, dass es doch viel einfacher wäre einfach die Liste zu "erneuern". Denn die Offsets der Karte habe ich ja eh schon gespeichert und müsste so jedes Mal alles neu berechnen. Es geht hier ja nicht um den Nachziehstapel, sondern um die Karten auf der Hand :). Könnte ich einfach eine "neue" Liste nehmen und mit den verbliebenen Karten füllen, müsste ich nicht jedes Mal alles neu berechnen. Ist aber gar nicht möglich?
    doch.

    Ist eine Architektonische Frage.
    OwnerDrawing mit Figuren, die sich selber zeichnen ist vonne Code-Aufteilung her recht optimal: Das Zeichnungs-Gefummel mittm Graphics ist in der Figur angesiedelt, sodass die PaintEvent-Methode der Owner-Klasse die Figuren durchnudeln nur noch muss.
    Das ist deshalb sehr schön, weil die Owner-Klasse ist meist eh voll mit allem möglichen, da ist man für jedes Stückerl Code, was man auslagern kann, dankbar.

    Du aber willst nicht, dass die Figur selbst weiß, wo sie sich zeichnen soll, sondern die Drawing-Location ergibt sich aus der Liste, wo die Figuren drinne sind.
    Also muss die Owner-Klasse es wieder selbst übernehmen, die Drawing-Locations zu verwalten. Dazu musste die Signatur der Figure.Draw-Methode erweitern, damit den Figuren beim Drawen auch die Location übergeben werden kann

    VB.NET-Quellcode

    1. Public Sub Draw(g As Graphics, X as Integer, y as Integer)
    2. '...
    Und die X / Y - Property der Figure sollte gelöscht werden.

    übrigens vlt. eleganter:

    VB.NET-Quellcode

    1. Public Sub Draw(g As Graphics, Location As Point)
    2. '...


    Wie immer vor architektonischen Umbauten: mach ein Backup.

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

    Schmandal schrieb:

    nicht jedes Mal alles neu berechnen
    heißt, dass eine Lücke bleibt, die Du ja nicht haben willst. Also: Jedes Mal neu berechnen. Das hatten wir bereits in Post #29.
    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!

    RodFromGermany schrieb:

    Also: Jedes Mal neu berechnen. Das hatten wir bereits in Post #29.


    Ja, schon. Kurz zur Erklärung:

    Es ist mir klar @ Post#29 und ich habe das auch schon im Einsatz für das Spielbrett. Es ging mir jetzt um die Karten in der Hand der KI und die des Spielers. Dort müssen die Karten ja alle einfach nur "rumliegen" und können sich dort in was auch immer für ner Reihenfolge tummeln.

    Deshalb dachte ich.... dass ich dort sowas machen kann:
    1. Lade alle Karten aus List(of Object) und lass sie sich zeichnen.
    2. Eine Karte wird gespielt oder auch mehrere
    3. Lösche Object aus Liste der Objekte
    4. Bastel alle noch vorhandenen Karten wieder als List(of Object) zusammen ohne "Lücke"
    5. Alle Karten neu zeichnen lassen mit neuer List und fertig
    Ich hätte nicht gedacht, dass es so einfach nicht geht :) Frage mich immer noch ein wenig warum, aber ok, ihr seid die Profis!

    @ErfinderDesRades Danke, werde die Points-Geschichte verwenden.

    Ich überlege gerade ob ich nicht doch lieber ein Kartendeck mit nur einer Karte verwende, die es 255 Mal gibt. Wäre evtl einfacher :huh:
    Ich gehe von meim Vorschlag auch wieder ab.
    Also vergiss ihn. Eine Figur muss ja jederzeit auch ihre Abmasse angeben, und dazu ist unverzichtbar, dass sie ihre Position kennt, also selbst kennt. Also entweder eine Property Location as Point oder halt die Props X, Y.

    Was du machen kannst, ist, deine Karten in einer ObservableCollection(Of Card) zu halten, und deren CollectionChanged-Event zu überwachen.
    Und immer wenn die Collection changed, dann berechnest du die Locations der Karten neu und weist sie ihnen zu.

    Von der Idee, nur eine Karte zu verwenden, 255 mal halte ich nix, da könnteste die Figur-Klasse dann auch ganz weglassen, und das wars dann mitte Architektur.

    Hast du eiglich mein StoryCards-Beispiel mal runtergeladen und gestartet?
    Ich finde, das zeigt ganz viel von der Mächtigkeit des Prinzips OwnerDrawing.