Absolute unlogisches Verhalten bei Images

Anfängerfragen zum Programmieren 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

Absolute unlogisches Verhalten bei Images

Beitrag von GlassJoe »

Hi

Also ich hab hier PB 5.60.

Und ich hab ein Tool geschrieben das zig mal aufwendiger ist, und zig mal mehr Events verarbeitet als das kleine an dem ich gerade hänge.

Aber das Kleine zeigt absolute unlogisches Verhalten, daß ich so in 12 Jahren noch nicht erlebt habe.

Ich weiss das der Code richtig ist, daß er funktionieren muss, daß sagt mir der Debugger und der Aufbau der Event Schleife.

Hier das Verhalten in der Version mit Threads.

29 jpg Dateien, die im anderen Tool (das zig mehr Events hat, und vieles ähnlich macht) in eine FileList geschmissen werden.

Filelist einlesen, in ein Array. Zähler fängt bei 0 an endet natürlich bei 28 (jedenfalls sollte es das !)

Das übliche

Code: Alles auswählen

    While Eof(0) = 0      
      in.S = ReadString(0)      
      If FileSize(in.S) > 10
      img(max)\pic = in.S
      img(max)\xpos = xpos
      img(max)\ypos = ypos
      ...
      ...
      max + 1
    Wend
danach eine stinknormale For-Next Schleife in einer Threaded Procedure ( wie ich sie schon 21923839483 x gemacht habe, um die Images zu laden (sie werden auch alle geladen, keine Fehler)

Und da gebe ich

For x = 0 to Max an, und erstelle alle Images per

ImageGadget(x,img(x)\xpos,img(x)\ypos,Global_Cell,Global_Cell,ImageID(x))

Und genau wenn die bescheuerte Schleife fertig ist, und alle Bilder geladen (ich sehe ja wie sie in die Buttons gesetzt werden, und im anderen Tool das zig mal aufwendiger ist, passiert das auch nicht) verschwinden alle !

Ich habe nichts danach ausgeführt, keine GadgetListe geschlossen, keine Events ausgeführt, rein gar nichts !

Einfach weg ! ????????????

So führe ich das >nicht< als Thread aus, muss ich For x = 0 to Max -1 machen, was ja auch logisch ist, 0 erste Position, 29 Bilder, also kann sonst das letzte nicht geladen werden. So gebe ich in der Thread Version
For x = 0 to Max an, werden alle ohne Fehler geladen ! Mach ich -1 fehlt das letzte. ?????????

So, dann hab ich halt ButtonImageGadget gemacht, damit ich mich nicht mit diesem lahmen non threaded aufbau rumschlagen muss, und damit die Bilder nicht einfach verschwinden.

Erst die Buttons in der While Schleife setzen, und mit einem Dummy Image aufüllen, alles Ok.

In der Thread Schleife (dies mal ohne Max -1) die Bilder laden (keine Fehler) und setzen

SetGadgetAttribute(x,#PB_Button_Image,ImageID(x))

Alles Ok ! Bilder und Buttons verschwinden nicht auf mysteriöse weise.

So dann das übliche EventWParam zeug.

Code: Alles auswählen

      Event = WaitWindowEvent() 
      
      If Event = #WM_KEYDOWN
        
        Main_KeyCode = EventwParam() 
        
        If Main_KeyCode = #VK_Right
        MoveStuff(1,GetActiveGaget())
        EndIf

     Endif
Was macht MoveStuff(1,GetActiveGadget() ?

Nimm Image 0 aus aktuellem ButtonImageGadget (auch 0), setz es auf das nächste (also ButtonImageGadget 1) nimm Image 1 und setze es für ButtonImageGadget 0, setze ButtonImageGadget 1 als Actives Gadget

So Bilder wurden vertauscht, genau so wie ich schon in zig Tools in einem ListIconGaget Einträge vertauscht hab, oder verschoben (ja auch mehrere auf einmal, ohne Probleme) und wenn ich das noch mal mache, tauscht der 1 mit 3, dann mal die 3 mit der 1 usw ! Total unlogischer Mist, ich hab es 333333 geprüft es ergibt keinen Sinn !

Ich sehe im Debugger ganz genau, was das aktive Image ist, was das nächste, welches danach ! Die zahlen sagen alles Ok, aber PB macht ganz eigenartige Sachen !

Ok irgendwann hab ich aufgegeben, und es ohne Threads probiert, und das selbe unlogische Verhalten.
Danach wieder auf ImagesGadgets statt ButtonImageGadgets umgebaut und mit Drag & Drop probiert.

Und hier genau so unlogisches Verhalten.

Ich Drag Bild 1 auf 3, ok wird überschrieben (Debugger zeigt nichts unlogisches an) ich scrolle runter und wieder rauf. Image 0 ist weck ! Nein es ist noch irgendwie da, daß Stealth Image, reagiert auf DoubleClicks !

Ok schliessen, neu starten. Ich Drag Image 0 das sichtbar ist, und geladen wurde, auf irgendein anderes Bild, und es gibt einen Speicherfehler ! ????????????

Ok darum kümmer ich mich dann schon, erst mal soll der andere Mist gehen, ich versuche per Drag & Drop Bilder
zu vertauschen, kriege es natürlich nicht hin.

Wieder zurück zum Image 0 Problem, angucken, grübeln...............sich denken das ergibt keinen Sinn !

Es ist genau wie mit PB Versionen vor 5.60 vor ein paar Wochen, als ich Bilder die mit ffmpeg erstellt wurden, auf ein großes Bild drauf klatschen lies, was super gefunzt hat, und mit einem cli Tool das ich in PB geschrieben hab, und das auch Einzelne Bilder aus VideoFiles erstellt, wurden mit exakt dem selben Code, nur weise Kästchen auf das Bild geklatscht.

Völlig unlogisch ! Aber mit PB 5.60 ging es dann mysteriöser weise !
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
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: Absolute unlogisches Verhalten bei Images

Beitrag von GlassJoe »

Hier kann es jeder selbst ausprobieren. Ich verstehe es nicht !

Code: Alles auswählen

  
  
  Enumeration 
    #MainWin
  EndEnumeration
  
  ;/ Gadgets Normal
  Enumeration 6001
    #Make
    #XS
    #XS2
    #XS3
  EndEnumeration
  
  
  Structure Ext
    JustStrings.S
  EndStructure
  
  Structure img
    Pic.S
    State.b
    HPos.i
    WPos.i
  EndStructure
  
  Global Dim Ext.Ext(20)
  Global Global_Total_Ext
  Global Dim img.img(1) 
  
  Global Global_Cell = 200
  Global Global_FullGW, Global_FullGH
  Global Global_HScroll
  Global Global_Init_win_h, Global_init_task_h, Global_PageJump
  Global Global_Pic_Count
  Global Global_Total_Ext
  Global Global_CPU_COUNT
  
  
  #Dummy = 7000 
  #WKon = 1004
  
  UseJPEGImageDecoder() : UsePNGImageDecoder() : UseTIFFImageDecoder()
  UseGIFImageDecoder() : UseTGAImageDecoder()
  
  Procedure AddExtToExtStruc()
    
    Ext.S = "jpg;jpeg;png;bmp;tif;tiff;gif;tga"
    
    tmp_max = CountString(Ext.S,";")
    
    Redim Ext.Ext(tmp_max)
    
    If tmp_max
      For tmp_p = 1 To tmp_max +1
        tmp_str1$ = StringField(Ext.S,tmp_p,";")
        Ext(tmp_p-1)\JustStrings = tmp_str1$ 
      Next
      
      Global_Total_Ext = tmp_max
      
    EndIf
    
  EndProcedure 
  
  Procedure InitWindowSizeStuff()
    
    SystemParametersInfo_(#SPI_GETWORKAREA,0,@DesktopWorkArea.RECT,0) 
    Global_init_task_h = GetSystemMetrics_(#SM_CYSCREEN)-DesktopWorkArea\Bottom
    ExamineDesktops()
    
    Global_FullGW = DesktopWidth(0)
    Global_FullGH = DesktopHeight(0)
    
    Debug "DEKH="+DesktopHeight(0)
    Global_Init_win_h = DesktopHeight(0)-Global_init_task_h
    Debug "TaskH="+Global_init_task_h
    Global_HScroll = Global_Init_win_h - 30
    Debug "---"
    Global_PageJump = Global_HScroll / Global_Cell
    Debug "---"
    Debug "Global_HScroll="+Global_HScroll  
    
  EndProcedure
  
  Procedure.S CalcImageSize(ProtTmpPic.i,MaximumW,MaximumH)
    
    IMG_W = ImageWidth(ProtTmpPic) : IMG_H = ImageHeight(ProtTmpPic) 
    ;Debug "INPUT W="+Str(IMG_W)+" | INPUT H="+Str(IMG_H)
    
    
    If IMG_W > IMG_H
      
      ;Debug "BILD -> BREITER ALS HÖHER"
      
      ASPECT.f=IMG_W/IMG_H
      ; Debug "ASPECT RATIO" : Debug ASPECT 
      ; 
      New_H=MaximumW/ASPECT
      ; 
      ; Debug "MAXIMUM WIDTH"
      ; Debug MaximumW
      ; 
      ; Debug "NEW HEIGHT" 
      ; Debug New_H 
      ; 
      If New_H > MaximumH
        
        Differenz=New_H-MaximumH
        
        New_H=New_H-Differenz
        New_W=MaximumW-Differenz 
        
        ; Debug "NEUE HÖHE IST HÖHER ALS DER RAHMEN"
        ; Debug "DIFFERENZ="+Str(Differenz)
        ; 
        ; Debug "NEUE MASSE NACH DER DIFFERENZ BERECHNUNG"
        ; Debug "W"+Str(New_W)+"xH"+Str(New_H)
      Else
        New_W=MaximumW
      EndIf
      
      ProcedureReturn Str(New_W)+":"+Str(New_H)
      
    ElseIf IMG_W < IMG_H
      
      ;Debug "BILD -> HÖHER ALS BREITER"
      
      ;Debug "MAXIMUM HEIGHT"
      ;Debug MaximumH
      ; 
      
      ASPECT.f=IMG_H/IMG_W
      ;Debug "ASPECT RATIO" : Debug ASPECT
      
      New_W=MaximumH/ASPECT
      
      ;Debug "MAXIMUM HEIGHT"
      ;Debug MaximumH
      ; 
      ;Debug "NEW WIDTH"
      ;Debug New_W
      
      If New_W > MaximumW 
        Differenz=New_W-MaximumW
        
        New_W=New_W-Differenz
        New_H=MaximumH-Differenz 
        
        ;Debug "NEUE BREITE IST BREITER ALS DER RAHMEN"
        ;Debug "DIFFERENZ="+Str(Differenz)
        ; 
        ;Debug "NEUE MASSE NACH DER DIFFERENZ BERECHNUNG"
        ;Debug "W"+Str(New_W)+"xH"+Str(New_H) 
      Else
        New_H=MaximumH
        ;Debug "JOA="+New_H
      EndIf
      
      ProcedureReturn Str(New_W)+":"+Str(New_H)
      
    Else
      
      ;Debug "BILD -> HAT SELBE HÖEHE UND BREITE"
      
      If MaximumW > MaximumH
        ;Debug "RAHMEN BREITER ALS HOCH"
        ProcedureReturn Str(MaximumH)+":"+Str(MaximumH) 
        
      ElseIf MaximumW < MaximumH
        ;Debug "RAHMEN HÖHER ALS BREIT"
        ProcedureReturn Str(MaximumW)+":"+Str(MaximumW) 
      Else
        ; Debug "RAHMEN BREITE = HÖHE"
        ProcedureReturn Str(MaximumW)+":"+Str(MaximumH) 
      EndIf 
      
    EndIf 
    
  EndProcedure
  
  Procedure AddPic(egal)
    
    Debug "ADD PIC" 
    
    PMAX = Global_Pic_Count 
    
    OpenGadgetList(#XS)
    
    For PTMP = 0 To PMAX -1 ; Logisch
    ; For PTMP = 0 To PMAX  ; <--- unlogisch aber nur funzt es im Thread
     
      If LoadImage(PTMP,img(PTMP)\Pic.S) 
        Debug PTMP 
        tmp_size$ = CalcImageSize(PTMP,Global_Cell,Global_Cell)
        ResizeImage(PTMP,Val(StringField(tmp_size$,1,":")),Val(StringField(tmp_size$,2,":")))
        ;SetGadgetAttribute(PTMP,#PB_Button_Image,ImageID(PTMP)) ; Thread Version
        ImageGadget(PTMP,img(PTMP)\WPos,img(PTMP)\HPos,Global_Cell,Global_Cell,ImageID(PTMP))
        EnableGadgetDrop(PTMP,#PB_Drop_Image,#PB_Drag_Copy)
        
        Debug "....."
      Else
        Debug "FAIL="+img(PTMP)\Pic
        Debug "PTMP="+PTMP
        ImageGadget(PTMP,img(PTMP)\WPos,img(PTMP)\HPos,Global_Cell,Global_Cell,ImageID(#Dummy))
        ;SetGadgetAttribute(PTMP,#PB_Button_Image,ImageID(#Dummy)) ; Thread Version
        DisableGadget(PTMP,1) 
      EndIf 
      
    Next  
    
  EndProcedure  
  
  Procedure Refill(Dir$)
    
    Dim img.img(1)
    Redim img.img(6000) 
    
    OpenGadgetList(#XS)
    
    SetGadgetAttribute(#XS,#PB_ScrollArea_Y,0)   
    
    Global_Pic_Count = 0  
    
    While Eof(0) = 0
      
      IN.S = ReadString(0)
      
      If FileSize(IN.S) > 10
        
        For tmp_p = 0 To Global_Total_Ext
          
          tmp_ext$=LCase(GetExtensionPart(IN.S))
          
          If tmp_ext$ = Ext(tmp_p)\JustStrings  
            
            ;Debug IN.S
            ;Debug Global_Pic_Count
            
            img(Global_Pic_Count)\Pic = IN.S 
            
            tmp_y +1 
            
            img(Global_Pic_Count)\WPos = x_pos
            img(Global_Pic_Count)\HPos = y_pos 
            
            Debug ""
            Debug img(Global_Pic_Count)\Pic 
            Debug img(Global_Pic_Count)\WPos 
            Debug img(Global_Pic_Count)\HPos
            
            ;ButtonImageGadget(Global_Pic_Count,x_pos,y_pos,Global_Cell,Global_Cell,ImageID(#Dummy)) ; Thread Version
            
            tmp_x + 1 : x_pos + Global_Cell
            
            If tmp_x = 5
              x_pos = 0 : tmp_x = 0 : y_pos + Global_Cell
            EndIf
            
            Global_Pic_Count + 1 
            
            Break 
            
          EndIf
          
        Next
      EndIf 
      
    Wend 
    CloseFile(0)
    
    If Global_Pic_Count  
      
      Global_CPU_COUNT = 1
      
      If Global_Pic_Count >= 1 And Global_CPU_COUNT = 1 
        
        ;Global_TH1 = CreateThread(@AddPic(),#Null) 
        AddPic(0)
        
      EndIf
      
      
      Debug y_pos+Global_Cell
      If y_backup 
        SetGadgetAttribute(#XS,#PB_ScrollArea_InnerHeight,y_backup+Global_Cell) 
      Else
        SetGadgetAttribute(#XS,#PB_ScrollArea_InnerHeight,y_pos+Global_Cell + 2000)  
      EndIf
      
    EndIf 
    
  EndProcedure 
  
  Procedure MarkPic(Pic,Mode)
    
    If IsImage(Pic) = 0
      ProcedureReturn
    EndIf
    Width = ImageWidth(Pic) : Height = ImageHeight(Pic)
    If Mode ; SEL
      Color = $FF8000
      StartDrawing(ImageOutput(Pic))
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(0,0,Width,Height,Color)
        Box(1,1,Width-2,Height-2,Color) 
        Box(2,2,Width-4,Height-4,Color)  
      StopDrawing()
    Else
      Color = $F3EFEF
      StartDrawing(ImageOutput(Pic))
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(0,0,Width,Height,Color)
        Box(1,1,Width-2,Height-2,Color) 
        Box(2,2,Width-4,Height-4,Color)   
      StopDrawing()
    EndIf
    
  EndProcedure
  
  If CountProgramParameters()
    
    Debug "OK"
    FileList$ = ProgramParameter(0)
    Debug FileList$
    
    If FileSize(FileList$) > 10 And ReadFile(0,FileList$)
      Debug "OK2"
    Else
      Debug "no input file"
      Delay(200)
      End 
    EndIf 
  Else
    MessageRequester("","no param")
    Debug "no param"
    Delay(200)
    End
  EndIf 
  
  InitWindowSizeStuff() 
  
  If OpenWindow(#MainWin,(Global_FullGW - 1024) /2,-3,1024,Global_Init_win_h-30,"test",#PB_Window_SystemMenu)
    
    CreateImage(#Dummy,Global_Cell,Global_Cell)
    
    ScrollAreaGadget(#XS,0,0,#WKon+10,Global_HScroll,#WKon-15,1000,Global_Cell)
    CloseGadgetList() 
    
    AddExtToExtStruc()
    
    LastClicked = 0
    
    Repeat 
      
      Event = WaitWindowEvent() 
      
      If Event = #WM_KEYDOWN
        
        Main_KeyCode = EventwParam() 
        
        If Main_KeyCode = #VK_F5 
          
          Refill(FileList$) 
         
        EndIf
        
        
        If Main_KeyCode = #VK_F1
          
          For tmp_p = 0 To 10
            Debug img(tmp_p)\Pic
            Debug GetGadgetAttribute(tmp_p,#PB_Button_Image)
          Next
          
        EndIf 
        
        If Main_KeyCode = #VK_Right ;
          
          x = LastClicked
          Debug "WTC ?"
          Debug x
          
          If x >= 0 And x < 6001
            
            Debug "-------"
            Debug x 
            Debug "-----"
            
            xx = x + 1
            
            ;/ ImageGadget Version
            x1$ = img(x)\Pic
            x2$ = img(xx)\Pic
            
            Debug "Davor=img("+Str(x)+")\Pic = "+x1$
            Debug "Davor=img("+Str(xx)+")\Pic = "+x2$
            
            img(x)\Pic = x2$
            img(xx)\Pic = x1$ 
            
            Debug "Danach=img("+Str(x)+")\Pic = "+img(x)\Pic
            Debug "Danach=img("+Str(xx)+")\Pic = "+img(xx)\Pic
            
            SetGadgetState(x,ImageID(xx)) 
            SetGadgetState(xx,ImageID(x)) 
            
            SetActiveGadget(xx)
            LastClicked = GetActiveGadget()
            Debug "New Active"+LastClicked  
            ;/
            
            
            
            ; ;/ ButtonImageGadget Version
            ; x1$ = img(x)\Pic
            ; x2$ = img(xx)\Pic
            ; 
            ; Debug "Davor=img("+Str(x)+")\Pic = "+x1$
            ; Debug "Davor=img("+Str(xx)+")\Pic = "+x2$
            ; 
            ; img(x)\Pic = x2$
            ; img(xx)\Pic = x1$ 
            ; 
            ; Debug "Danach=img("+Str(x)+")\Pic = "+img(x)\Pic
            ; Debug "Danach=img("+Str(xx)+")\Pic = "+img(xx)\Pic
            ; 
            ; SetGadgetAttribute(x,#PB_Button_Image,ImageID(xx)) 
            ; SetGadgetAttribute(xx,#PB_Button_Image,ImageID(x)) 
            ; 
            ; SetActiveGadget(xx)
            ; LastClicked = GetActiveGadget()
            ; Debug "New Active"+LastClicked  
            ; ;/
            
            
            
          EndIf 
          
        EndIf 
        
      EndIf 
      
      If Event = #PB_Event_Gadget  
        
        If EventType() = #PB_EventType_LeftDoubleClick
          
          Debug EventGadget()
          
        ElseIf EventType() = #PB_EventType_DragStart
          
          DragG = EventGadget() 
          
          If DragG >= 0 And DragG < 6001
            If IsImage(DragG)
              Debug "Drag="+DragG 
            EndIf
            Debug DragG 
            DragImage(ImageID(DragG))
          EndIf 
          
        EndIf 
        
      EndIf
      
      If Event = #PB_Event_GadgetDrop 
        
        DropG = EventGadget()
        
        Debug "Drop="+DropG
        
        If EventDropImage(DropG) ; setz ich schon hier das Image ohne das Joa und CopyImage Zeug, kann ich unmöglich vertauschen
          ;dafür kackt es nicht ab wenn ich Image 0 irgendwohin drope
          joa = 1
        EndIf 
        
      EndIf
      
      If joa
        
        Debug DragG
        Debug DropG
        
        ; Wird nicht vertauscht, stattdessen wird nur eines gesetz, ich scroll runter, und wieder rauf und erstes Bild
        ; ist weck ! reagiert aber noch auf DoubleClicks... WTF ? Drag ich Image 0 auf z.B 5 gibt es einen Speicherfehler.
        CopyImage(DragG,wtf1)
        CopyImage(DropG,wtf2)
        
        SetGadgetState(DragG,ImageID(wtf2)) 
        SetGadgetState(DropG,ImageID(wtf1)) 
        
        joa = 0
      EndIf
      
      If Event = #PB_Event_CloseWindow
        Break
      EndIf 
      
    ForEver 
    
  EndIf 
Tool erwartet eine Input Liste, mit jpg files als Parameter.

Sobald die Bilder geladen sind, ist Gadget 0 aktiv (Lastclicked steht auf 0) einmal Cursor right, alles ok, noch max 2 x und es gibt Chaos.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Absolute unlogisches Verhalten bei Images

Beitrag von STARGÅTE »

Hallo GlassJoe,

so ganz konnte ich deinen Ausführungen nicht folgen, aber hier mal ein paar Sachen die mir Aufgefallen sind:
  • Du verwenst in Zeile 455 IsImage(DragG), aber DragG enthält die Gadget-Nummer des Drags, nicht das Image!
  • In Zeile 486 schreibst du CopyImage(DragG,wtf1), wtf1 ist aber nirgends definiert, somit also 0, somit wird Image 0 hier gelöscht! bzw. kannst du nicht 0 in 0 kopieren
Ansonsten würde ich vorschlagen:
  • Mit DragImage(GetGadgetState(DragG)) das Image des angefassten Gadgets aufnehmen
  • Mit DropG = EventGadget() das Drop-Gadget bestimmen.
  • Mit SetGadgetState(DragG, GetGadgetState(DropG)) das Image vom Drop-Gadget zum Drag-Gadget kopieren
  • Und dann halt erst das Drop Image setzen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: Absolute unlogisches Verhalten bei Images

Beitrag von GlassJoe »

STARGÅTE hat geschrieben:Hallo GlassJoe,

so ganz konnte ich deinen Ausführungen nicht folgen, aber hier mal ein paar Sachen die mir Aufgefallen sind:
  • Du verwenst in Zeile 455 IsImage(DragG), aber DragG enthält die Gadget-Nummer des Drags, nicht das Image!
  • In Zeile 486 schreibst du CopyImage(DragG,wtf1), wtf1 ist aber nirgends definiert, somit also 0, somit wird Image 0 hier gelöscht! bzw. kannst du nicht 0 in 0 kopieren
Ansonsten würde ich vorschlagen:
  • Mit DragImage(GetGadgetState(DragG)) das Image des angefassten Gadgets aufnehmen
  • Mit DropG = EventGadget() das Drop-Gadget bestimmen.
  • Mit SetGadgetState(DragG, GetGadgetState(DropG)) das Image vom Drop-Gadget zum Drag-Gadget kopieren
  • Und dann halt erst das Drop Image setzen
Also die Sache mit Zeile 455. Soweit ich das noch weis ist es doch egal ob ein Image die ID 0 hat und ein Gadget auch.
Sofern es 2 verschiedene Dinge sind, ist das doch valid, und weil ich die Image ID (meine nicht das Handle) und die Gadget ID, aus dem Wert von PTMP in der AddPic() Procedure vergeben lasse. Also müssten sie ja synrchon sein, so wie im anderen Tool, daß keine Probleme macht.
Desshalb hab ich auch IsImage gemacht, um ganz sicher zu gehen, daß das Image auch geladen ist (ich habs ja auch als Threaded Version probiert, und da musste ich natürlich drauf achten)

Ah das mit Zeile 486, ich Pfeife, von der Seite hab ich das gar nicht bedacht :oops: ich war zu faul (und auch genervt) eine Konstante zu erstellen, dann wäre mir das aufgefallen :oops: :oops:

Ich werde es so probieren wie du gesagt hast, ein fettes Danke :praise:

Das hat mich tierisch genervt, hab fast ne Woche an meinem Turbo Image Explorer geschrieben, daß viel aufwendiger ist, und viel mehr Key Events usw benutzt, war fertig, wollte noch schnell ein kleines Mini Zusatz Tool schreiben, und konnte sehr viel Code einfach modifizieren & benutzen. Nach ca einer Halben Stunde war ich soweit, und dann hing ich stundenlang dran und hab einfach nicht gerafft wo das Problem ist, und bei den Image Vertausch Sachen per Tastatur (Mouse ist mir zu lahm) versteh ich es immer noch nicht.

edit: ich habs jetzt so probiert.

Code: Alles auswählen

If Event = #PB_Event_Gadget  
        
        bla = EventGadget()
        
        If bla >= 0 And bla < 6001
          LastClicked = bla
          Debug "OVERWRITE"
        EndIf
        
        
        If EventType() = #PB_EventType_LeftDoubleClick
          
          Debug EventGadget()
          
        ElseIf EventType() = #PB_EventType_DragStart
          
          DragG = EventGadget() 
          
          If DragG >= 0 And DragG < 6001
            
            If IsImage(DragG)
              Debug "Drag="+DragG 
              Debug GetGadgetState(DragG)
              DragImage(GetGadgetState(DragG))
            EndIf
            
          EndIf 
          
        EndIf 
        
      EndIf
      
      If Event = #PB_Event_GadgetDrop 
        
        DropG = EventGadget()
        
        Debug "Drop="+DropG
        SetGadgetState(DragG,GetGadgetState(DropG))
        SetGadgetState(DropG,ImageID(DragG)) 
        
      EndIf
Ich kann z.B Bild 0 auf 2 ziehen, dann klappt es.
Wenn ich jetzt wieder Bild 2 das zuvor 0 war, auf 0 ziehe sind beide das gleiche wie Bild 2.
Zieh ich dann wieder 0 (was ursprünglich 2 war) auf 2, ist 0 die ursprüngliche 2, und die 2 die 0.

0 -> 2 = 2,0 ok
2 -> 0 = 2,2 ?????
0 -> 2 = 2,0 ?????

Nach und nach enstehen lauter doppelte....ich bin nur noch verwirrt :freak: wie kann sowas banales. mir solche Probleme bereiten ? :freak:

Wenn das doch nur mit Tasten klappen würde, dieses Drag & Drop Zeugs macht mich Wahsinnig.

Edit2: Ok ich glaub ich habs mit den Tasten hingekriegt (aber das dachte ich schon öfter, und dann viel mir auf, daß nach paar mal doch wieder doppeltes entsteht)

Code: Alles auswählen


Define TMPPIC1 = 7000
Define TMPPIC2 = 7001

If x >= 0 And x < 6001
            
            Debug "-------"
            Debug x 
            Debug "-----"
            
            xx = x + 1
            
            ;/ ImageGadget Version
            x1$ = img(x)\Pic
            x2$ = img(xx)\Pic
            
            Debug "Davor=img("+Str(x)+")\Pic = "+x1$
            Debug "Davor=img("+Str(xx)+")\Pic = "+x2$
            
            img(x)\Pic = x2$
            img(xx)\Pic = x1$ 
            
            Debug "Danach=img("+Str(x)+")\Pic = "+img(x)\Pic
            Debug "Danach=img("+Str(xx)+")\Pic = "+img(xx)\Pic
            
            ; SetGadgetState(x,ImageID(xx)) 
            ; SetGadgetState(xx,ImageID(x)) 
            ; 
            
            CopyImage(x,TMPPIC1)
            CopyImage(xx,TMPPIC2)
            
            Debug TMPPIC1
            CopyImage(TMPPIC1,xx)
            CopyImage(TMPPIC2,x)
            
            SetGadgetState(x,ImageID(x))
            SetGadgetState(xx,ImageID(xx)) 
            
            SetActiveGadget(xx)
            LastClicked = GetActiveGadget()
            Debug "New Active"+LastClicked  
            ;/
            
        EndIf
Ich hoffe das ist es jetzt. Weis vl einer warum alle ImageGadgets direkt nach der For-Next Schleife einfach verschwinden, wenn ich die For-Next Schleife im Thread ausführe ? oder warum ich im Thread nicht logische
For x = 0 to Max -1 machen muss, sondern unlogische 0 to Max
?
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Absolute unlogisches Verhalten bei Images

Beitrag von STARGÅTE »

Das mit der synchronen vergabe der ImageNummern und GadgetNummer ist erst mal ok:

Code: Alles auswählen

Gadget  0  1  2
Image   0  1  2
Fall 0-->2:
Wenn du nun ein Drag&Drop von Gadget 0 nach Gadget 2 dann holst du dir im ersten Schnitt mit DragImage das Image 0, soweit ok.
Jetzt Dropts du in Gadget 2, setzt also Gadget 0 auf Image 2 und dann Gadget 2 auf die ImageID(DragG), was in diesem Fall Image 0 ist.
Ergebnis ist:

Code: Alles auswählen

Gadget  0  1  2
Image   2  1  0
Ab jetzt sind Gadgets und Images nicht mehr synchron!

Fall 2-->0:
Wenn du nun aber ein Drag&Drop von Gadget 2 nach Gadget 0 dann holst du dir im ersten Schnitt mit DragImage das Image 0, weils ja nicht mehr synchron ist.
Jetzt Dropts du in Gadget 0, setzt also Gadget 2 auf das Image von Gadget 0, was Image 2 ist! und dann Gadget 0 auf die ImageID(DragG), was in diesem Fall ja auch DragG = 2 war hier also Image 2 ist.
Ergebnis ist:

Code: Alles auswählen

Gadget  0  1  2
Image   2  1  2
Meiner Meinung reicht es eigentlich, Bilder wie Folgt zu tauschen:

Code: Alles auswählen

Temp = GetGadgetState(DragG)
SetGadgetState(DragG, GetGadgetState(DropG))
SetGadgetState(DropG, Temp)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: Absolute unlogisches Verhalten bei Images

Beitrag von GlassJoe »

STARGÅTE hat geschrieben:Das mit der synchronen vergabe der ImageNummern und GadgetNummer ist erst mal ok:

Code: Alles auswählen

Gadget  0  1  2
Image   0  1  2
Fall 0-->2:
Wenn du nun ein Drag&Drop von Gadget 0 nach Gadget 2 dann holst du dir im ersten Schnitt mit DragImage das Image 0, soweit ok.
Jetzt Dropts du in Gadget 2, setzt also Gadget 0 auf Image 2 und dann Gadget 2 auf die ImageID(DragG), was in diesem Fall Image 0 ist.
Ergebnis ist:

Code: Alles auswählen

Gadget  0  1  2
Image   2  1  0
Ab jetzt sind Gadgets und Images nicht mehr synchron!

Fall 2-->0:
Wenn du nun aber ein Drag&Drop von Gadget 2 nach Gadget 0 dann holst du dir im ersten Schnitt mit DragImage das Image 0, weils ja nicht mehr synchron ist.
Jetzt Dropts du in Gadget 0, setzt also Gadget 2 auf das Image von Gadget 0, was Image 2 ist! und dann Gadget 0 auf die ImageID(DragG), was in diesem Fall ja auch DragG = 2 war hier also Image 2 ist.
Ergebnis ist:

Code: Alles auswählen

Gadget  0  1  2
Image   2  1  2
Meiner Meinung reicht es eigentlich, Bilder wie Folgt zu tauschen:

Code: Alles auswählen

Temp = GetGadgetState(DragG)
SetGadgetState(DragG, GetGadgetState(DropG))
SetGadgetState(DropG, Temp)
ah stimmt, daß kann ja dann nicht mehr synchron sein :oops: Danke für die Aufklärung :)

Ich hab das Tool fertig, kann aber Drag&Drop jetzt nicht mehr ausprobieren, da ich wieder auf ButtonImageGadgets
ausweichen musste, weil die in Threads gehen.

Macht einen Wahnsinns Unterschied beim Laden, von Bildern die eine anständige Größe haben, ob sie mit einem Thread oder 4 geladen werden :)

Wollte keinen Cache Algo einbauen, da ich das sowieso nicht hinkriegen würde :lol: und mich diese cache files immer nerven.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Antworten