AddImageFrame macht was es will !

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

AddImageFrame macht was es will !

Beitrag von GlassJoe »

Ich will nicht viel dazu sagen, probiert es einfach aus, und schaut euch die Kommentare
im Code an, und ihr werdet schnell merken das sie unlogisches Verhalten hat. Egal ob Möglichkeit

a) Müll Frame vorne abschneiden (wenn mann da nicht aufpasst, verliert mann schnell ein nützliches Frame)

oder

b) Müll Frame am Ende abschneiden.

PB 5.72 32Bit unter Windows

Code: Alles auswählen

  

  #pic = 0
  #gd = 0
  #Win = 0

  OpenWindow(#Win,0,0,500,400,"New Prog",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
  
  If CreateImage(#pic, 200, 200)
    StartDrawing(ImageOutput(#pic))
      Box(0,0,200,200,#blue)
      DrawText(5,5,"Bla",#yellow)
    StopDrawing() 
    ImageGadget(#gd, 0, 0, 200, 200, ImageID(#pic))
  EndIf  
  
  
  Repeat 
    
    Event = WaitWindowEvent()  
    
    If Event = #PB_Event_Gadget
      
      EventGadget = EventGadget()
      
      If EventGadget = #gd And EventType() = #PB_EventType_LeftClick
        x = ImageFrameCount(#pic) 
        Debug x ; 1 ? Wirklich ? Ok dann schmeissen wir eins drauf
        
        ;AddImageFrame(#pic,2) ; HMM liegt ausserhalb des gültigen bereichs. Schon klar, fängt ja auch bei 0 an, dann probieren wir die 1.
        ;AddImageFrame(#pic,1) ; Was immer noch ein Fehler ? Wieso ? Das ist total unlogisch. Ok dann halt 0 !
        
        AddImageFrame(#pic,0) ; Das geht ? Warum ist dann x schon davor 1 gewesen ?
        ; Ok ein Bild drin, aber die erste Pos ist 0 !
        ; warum ist dann AddImageFrame(#pic,1) out of bounds ? Und was passiert wenn ich vor schon direkt nach CreateImage
        ; auf #pic zeichnen würde, und dann AddImageFrame(#pic,0) benutze ? geht dann der Inhalt flöten ? Probieren wir es aus.
        
        SetImageFrame(#pic,0)
        SetGadgetState(#gd,ImageID(#pic)) ; Ja geht es oder ? ! Wo ist dann die Bla Box hin ?
        MessageRequester("ImageFramePos=0","Wo ist sie die Box ?")
        SetImageFrame(#pic,1) ; Setzen wir mal auf 1 !
        SetGadgetState(#gd,ImageID(#pic)) ; Da ist sie wieder ? WTF ? Und was ist dann die 0 ?
        ;ein unnötiges schwarzes Frame ! Gut dann schneiden wir das halt raus. Aber davor fügen wir noch ein paar Frames dazu.
        MessageRequester("ImageFramePos=1","Da ist sie ja. Auf der 1. Wurde also einfach so von 0 auf 1 verschoben") 
        For p = 1 To 4 ; Ok da BLA jetzt auf 1 ist, überschreiben wir gerade BLA
          AddImageFrame(#pic,p)
          StartDrawing(ImageOutput(#pic))
            Box(0,0,200,200,#blue)
            DrawText(5,5,Str(p),#yellow)
          StopDrawing() 
        Next
        MessageRequester("","Nach Draw: for p = 1 to 4")
        For p = 0 To 4 
          SetImageFrame(#pic,p)
          SetGadgetState(#gd,ImageID(#pic))
          MessageRequester("",Str(p))
        Next
        y = ImageFrameCount(#pic)
        Debug y ; 6 ????? Wirklich ? Wir haben 4 hinzugefügt (p = 1 to 4) und die erste Position ist 0 !
        ;RemoveImageFrame(#pic,6) ; Out of bounds, war ja klar.
        RemoveImageFrame(#pic,5) ; OK
        ;SetImageFrame(#pic,5) ; Natürlich nicht ok ! Wir haben 4 hinzugefügt, und 0 ist das erste, nur ist das erste Schwarz !
        ; Und was ist wenn wir jetzt das erste enfernen ?
        RemoveImageFrame(#pic,0)
        h = ImageFrameCount(#pic)
        Debug h ; Aha also 5
        SetImageFrame(#pic,0)
        SetGadgetState(#gd,ImageID(#pic))
        
        MessageRequester("","Wieso kommt wenn p = 4 ist out of bounds ? Sagte das Ding nicht gerade das h = 5 ist ?"+Chr(10)+"Wir schaffen es ja nicht mal bis zur 4 !")
        For p = 0 To 4 
          SetImageFrame(#pic,p)
          SetGadgetState(#gd,ImageID(#pic))
          MessageRequester("p="+Str(p),"") 
        Next
        
        ; Und wenn mann AddFrameImage(#pic) benutzt ohne id hinten, dann ist halt das letzte Frame ein schwarzes unnötiges
        ; (das mann löschen sollte) aber immerhin geht nichts durch das WirWar verhalten das bei einem selbst auch für WirWar sorgt verloren ! 
        ; Die Funktion ist fast unbrauchbar, total unberechenbares verhalten, machste mit Zähler, macht sie vorne Müll, machste ohne
        ; dann hinten, setzt du sie über eine CopyImage Funtion benimmt sie sich wieder anders als direkt drunter ! Alles schon gehabt. 
        
      EndIf
      
    EndIf
    
    If Event = #PB_Event_CloseWindow
      End
    EndIf
    
  ForEver 
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: AddImageFrame macht was es will !

Beitrag von Mijikai »

Wenn ich es richtig verstehe fügt AddImageFrame() ohne 2ten Parameter ein Frame an der nächsten Stelle (Index 1) hinzu!
AddImageFrame() mit 0 als Index dagegen schiebt das aktuelle Bild an die 2te Stelle (Index 1) das eingefügte Frame ist wie erwartet an 1ster Stelle (Index 0).

Also alles ok :)
Zuletzt geändert von Mijikai am 05.08.2020 18:01, insgesamt 1-mal geändert.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: AddImageFrame macht was es will !

Beitrag von NicTheQuick »

GlassJoe hat geschrieben:PB 5.72 32Bit unter Windows
Wieso nutzt du nicht die 64-Bit-Version?
Bild
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: AddImageFrame macht was es will !

Beitrag von GlassJoe »

Mijikai hat geschrieben:Wenn ich es richtig verstehe fügt AddImageFrame() ohne 2ten Parameter ein Frame an der nächsten Stelle (Index 1) hinzu!
AddImageFrame() mit 0 als Index dagegen schiebt das aktuelle Bild an die 2te Stelle (Index 1) das eingefügte Frame ist wie erwartet an 1ster Stelle (Index 0).

Also alles ok :)
Ja es schiebt je nachdem ob mit oder ohne Angabe.

Aber es rechnet auch falsch am Anfang und später auch noch.

Zeile 28. x = 1 (was eigentlich schon mal falsch ist, noch hab ich kein Frame erstellt, und desshalb ergibt das folgende
keinen Sinn wenn mann die Funktion das erste mal benutzt)

Wenn x = 1 ist, und ich AddImageFrame(bla,0) mache (ein 1 erzeugt ja ein out of bounds) und 0 die erste Position ist, und x = 1, ist alles ok bis auf die Tatsache das ""Frame"" 0 auf einmal an Position 1 ist !

Ich hab also keine Möglichkeit innerhalb einer Schleife mit AddImageFrame(bla,counter) in gewohnter Weise zu arbeiten
denn das Ding schiebt mir dann den ersten ""Frame"" einfach an Position 1 (zählt später irgendwas wirres zusammen)

Und dann zählt es noch falsch

Zeile 45: For 1 to 4

Ich zähle da 4, macht mit dem Frame der schon drin ist natürlich 5.

Da wir Frame 1 überschreiben.

Zeile 58 meint aber das y = 6 ist !

Und das kann nicht sein, denn wir haben 3 hinzugefügt, und einer (die 1) in "For 1 to 4" wurde überschrieben.

Zeile 60 erzeugt ein out of bounds, was schon klar ist, es können keine 6 drin sein.

Zeile 61 geht was Sinn ergibt.

Aber Zeile 71 ergibt keinen Sinn mehr !

1 + 4 = 5

Und trotzdem kackt das Ding bei "For p 0 to 4" bei 4 ab.

Jetzt stellt euch mal vor wie ich am abfluchen war, weil ich in der einen Procedure noch ohne 2. Paramter arbeiten konnte (aber erst mal nicht wollte, aber musste weil so verwirrend) und dann halt am Ende das letzte Frame (das den Inhalt vom ersten ""Frame"" hat, also das schwarze weil mit CreateImage erstellt) abschneiden musste

und in der anderen Procedure nicht am 2. Parameter vorbei gekommen bin, und erst viiiiiiiiiiiiiiiiiiiiiel später gemerkt hab das nicht einfach nur Frame 0 schwarz ist und mann das dann halt abschneidet, nein Frame 1 war das schwarze (und so hab ich ein nützliches abgeschnitten) weil das schwarze immer weiter verschoben wird, und mit Angabe von Param 2 und dem falschen Zähler irgendwann auf der 1 landet statt auf der letzten Position oder wenigstens Pos 0 (was ja der Ursprung wäre)

Frames können sich manchmal wahnsinnig ähnlich sehen (nebeneinander betrachtet ist auf den ersten Blick kein Unterschied)

Bild

CountGagetItems, ListSize usw millionen mal benutzt, alles völlig logisch, auch das ne Pos Angabe immer bei 0 anfängt* aber das da einfach verschoben wird, daß Ding mehr Frames angibt obwohl eines überschrieben wurde, und dann bei Pos 4 abkackt obwohl 5 Frames drin sein sollten (laut Zeile 71) ist unlogisch.

*ausser bei StringField, und beim mehrdimensionalen Array also Dim MultiArray.b(NbColumns, NbLines)
NBColumns darf beim abfragen nicht unter 1 sein (bei einem ListIcon geht aber 0, war verwunderlich für mich) sonst OutOfBounds, bei NBLines geht 0 (also wie gewohnt) und was auch erst mal gewöhnungsbedürftig war (weil ich sonst zu 90% andersherum arbeite, immer erst Row Angeben und hinten Col Param) daß NBColumns der erste ""Param"" ist, und Lines danach abgefragt werden, aber auch daran konnte ich mich schnell gewöhnen.

@NicTheQuick

Lieber erschiesse ich mich als unnötig mehr Ram für bisschen mehr Leistung aufm Papier zu verbrauchen :lol: Ich bin mit MS-DOS groß geworden, und hab ein RAM Trauma dabei erlitten :lol: und bis heute geize ich am Ram wo es nur geht.
Ram wird nur benutzt wenn es damit viel schneller geht
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Antworten