Open/UseGadgetList zickt rum

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

Open/UseGadgetList zickt rum

Beitrag von GlassJoe »

Hi

Also ich angefangen mal zum Spass so nenn ganz banalen Bild Browser zu schreiben, der möglichst schnell startet (nicht so'n Rotz wie das überladene xnview) und alle Cores nutzt (geht zig mal schneller als ohne Threads)

Geht auch ziehmlich gut ab das Teil, aber ich hab keine andere Lösung gefunden als erst ButtonImageGadgets mit 1x1px Dummy Inhalt in einer Procdure zu erstellen, und von dort aus die Threads zu starten, die dann die Images per SetGadgetAttribute(#xy,#PB_Button_Image,ImageID(#xy)) auf die Buttons klatschen.

Ich habs sogar grade noch irgendwie hinkriegt das ein großes Bild angezeigt wird, wenn mann eines der 140x140 Preview Buttons anklickt (die in einer Scrollbar sind), Cursor Up,Down,Left,Right, Pos1,Ende, Bild auf, Bild Ab, alles passt soweit, Scrollbar macht was sie soll.

Was mich aber um den Verstand bringt ist diese ***#%*' >_< GadgetList Fehlermeldungen usw :bluescreen: :bluescreen: :bluescreen: :bluescreen:

Ich hab da jetzt locker 4 Stunden rumprobiert, mit allen möglichen Tricksereien, und an allen möglichen Stellen.

Aber es will einfach nicht !

Entweder

a) Ich hab ein großes ImageGadget das kein ButtonImageGadget ist, und dafür werden alle 140x140 nicht mehr
in der GadgetList vom ScrollGadget gezeichnett, und überdecken anderes

b) Ich hab ein großes ButtonImageGadget mit dem ich nichts weiter anfangen kann, kein Vollbild, kein Drag hin & her in dem ScrollGadget (es gibt 2, 1 für die 140x140 Buttons ist #XS, und ein's für das große XSBig) weil ich ja ums verrecken nicht CloseGadgetList() ausführen darf, da danach OpenGadgetList(#XS) zwar keine Fehlermeldung ausgibt aber verdammt noch mal nicht will, oder sonst irgenwelche Probleme auftretten.

Ich hab nicht versucht aus Threads Gadgets zu erstellen, ich weiß das das nicht geht.

Aber irgendeine Lösung muss es geben !
Weil ein uraltes Programm wie VallenJPegger (von 2004 rum) das in irgendeiner
uralt Sprache geschrieben ist, 0 Probleme damit hat, echte ImageButtons hinzuklatschen und das im Thread (es ist halt nur einer) während mann schon navigieren kann, und ein ImageGadget Bild vor sich hat.

Es geht dort sogar etwas das sehr wenige Tools (und das zum Teil viel später) drauf haben.

Anlicken, Taste gedrückt halten, und stufenlos hin & herschieben in der Scroll Area oder im Vollbildmodus, daß war der Grund vor zig Jahren warum ich es xnview, ifanview, ACDSee usw vorgezogen hab.

Aber es startet nun mal sau lahm, und das Bild Decodier Modul ist nicht grade das schnellste.

Wie gesagt ich hab stunden rum probiert, ich komm nicht mehr weiter. Und wenn das so weitergeht, mit diesen Verdammten "Es gibt keine aktuelle GadgetListe" Fehlermeldungen, obwohl eine geöffnet ist, oder das sie nicht geöffnett wird, oder die alte verloren geht usw usw

Hau ich den PC noch zu brei :bluescreen: :bluescreen: :bluescreen:

Ich kann nicht mal ein anderes Window öffnen lassen (dachte mir vl krieg ich so ein Vollbild hin) ohne daß dann die ScrollGadgetListe vom ersten Fenster auf einmal weck ist :bluescreen:

Viel Glück, vl schaft es ja einer von euch. Mir langts für heute :freak:

Code: Alles auswählen

  
  UseJPEG2000ImageDecoder() : UseJPEGImageDecoder() : UsePNGImageDecoder() : UseTIFFImageDecoder() : UseGIFImageDecoder()
  UseTGAImageDecoder()
  
  ;/ WIN
  Enumeration
    #MainWin
  EndEnumeration
  
  ;/ GADGET
  Enumeration 6001
    #List 
    #List2
    #ActivePath
    #XS
    #XSBig
  EndEnumeration
  
  Structure Ext
    JustStrings.s
  EndStructure
  
  Structure img
    Pic.s
  EndStructure
  
  #FIcon = 6001
  #Dummy = 6002
  #Big = 6003 
  #XBig = 6004
  #XX = 6005
  
  #WKon = 722
  
  Global Global_BigBSize = 344 ; 600 (Netbook Height) - TaskHeight (26) - 230 ListIconGadget
  
  Global Dim Ext.Ext(20)
  Global Global_Total_Ext
  Global Dim img.img(5000) 
  
  Global Global_Cell = 140
  Global Global_Pic_Count
  Global Global_Abort
  Global Global_ThreadsRunning
  Global Global_Big_Image 
  
  Global Global_TH1 , Global_TH2 , Global_TH3 , Global_TH4
  
  
  Procedure AddExtToExtStruc()
    
    Ext.s = "jpg;jpeg;png;bmp;tif;tiff;gif;tga;tpic;jp2;j2k;jpf;jpg2;jpx;jpm"
    
    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
      
      For tmp_p = 0 To tmp_max
        Debug Ext(tmp_p)\JustStrings
      Next
      
      Global_Total_Ext = tmp_max
    EndIf
    
  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(MaximumW)+":"+Str(MaximumW) 
      ElseIf MaximumW < MaximumH
        ;Debug "RAHMEN HÖHER ALS BREIT"
        ProcedureReturn Str(MaximumH)+":"+Str(MaximumH) 
      Else
        ; Debug "RAHMEN BREITE = HÖHE"
        ProcedureReturn Str(MaximumW)+":"+Str(MaximumH) 
      EndIf 
      
    EndIf 
    
  EndProcedure
  
  Procedure AddPic(egal)
    
    Debug "ADD PIC"
    
    PMAX = Global_Pic_Count
    
    For PTMP = 0 To PMAX
      Debug "xxx="+PTMP
      Debug img(PTMP)\Pic
      
      If Global_Abort
        Break
      EndIf
      
      If LoadImage(PTMP,img(PTMP)\Pic.S) 
        
        If PTMP = 0
          CopyImage(0,#Big)
          Global_Big_Image = #True 
        EndIf
        tmp_size$ = CalcImageSize(PTMP,Global_Cell,Global_Cell)
        ResizeImage(PTMP,Val(StringField(tmp_size$,1,":")),Val(StringField(tmp_size$,2,":")),#PB_Image_Raw)
        SetGadgetAttribute(PTMP,#PB_Button_Image,ImageID(PTMP))  
      Else
        Debug "FAIL="+img(PTMP)\Pic
      EndIf 
      
    Next   
    
  EndProcedure 
  
  Procedure AddPic2(Start)
    
    Debug "ADD PIC"
    
    PMAX = Global_Pic_Count
    
    For PTMP = Start To PMAX Step 2
      Debug "x2x="+PTMP
      ;Debug img(PTMP)\Pic
      
      If Global_Abort
        Break
      EndIf
      
      If LoadImage(PTMP,img(PTMP)\Pic.S) 
        
        If PTMP = 0
          CopyImage(0,#Big)
          Global_Big_Image = #True 
        EndIf
        tmp_size$ = CalcImageSize(PTMP,Global_Cell,Global_Cell)
        ResizeImage(PTMP,Val(StringField(tmp_size$,1,":")),Val(StringField(tmp_size$,2,":")),#PB_Image_Raw)
        SetGadgetAttribute(PTMP,#PB_Button_Image,ImageID(PTMP))  
      Else
        Debug "FAIL="+img(PTMP)\Pic
      EndIf
      
    Next   
    
  EndProcedure 
  
  Procedure AddPic3(Start)
    
    Debug "ADD PIC"
    
    PMAX = Global_Pic_Count 
    
    For PTMP = Start To PMAX Step 3
      Debug "x3x="+PTMP
      ;Debug img(PTMP)\Pic
      
      If Global_Abort
        Break
      EndIf
      
      If LoadImage(PTMP,img(PTMP)\Pic.S) 
        
        If PTMP = 0
          CopyImage(0,#Big)
          Global_Big_Image = #True 
        EndIf
        tmp_size$ = CalcImageSize(PTMP,Global_Cell,Global_Cell)
        ResizeImage(PTMP,Val(StringField(tmp_size$,1,":")),Val(StringField(tmp_size$,2,":")),#PB_Image_Raw)
        SetGadgetAttribute(PTMP,#PB_Button_Image,ImageID(PTMP))  
      Else
        Debug "FAIL="+img(PTMP)\Pic
      EndIf
    Next   
    
  EndProcedure 
  
  Procedure AddPic4(Start)
    
    Debug "ADD PIC"
    
    PMAX = Global_Pic_Count
    
    For PTMP = Start To PMAX Step 4
      ;Debug "x4x="+PTMP
      ;Debug img(PTMP)\Pic
      
      
      If Global_Abort
        Break
      EndIf
      
      If LoadImage(PTMP,img(PTMP)\Pic.S) 
        
        If PTMP = 0
          CopyImage(0,#Big)
          Global_Big_Image = #True 
        EndIf
        tmp_size$ = CalcImageSize(PTMP,Global_Cell,Global_Cell)
        ResizeImage(PTMP,Val(StringField(tmp_size$,1,":")),Val(StringField(tmp_size$,2,":")),#PB_Image_Raw)
        SetGadgetAttribute(PTMP,#PB_Button_Image,ImageID(PTMP))  
      Else
        Debug "FAIL="+img(PTMP)\Pic
      EndIf
      
    Next
    
  EndProcedure 
  
  Procedure Refill(Dir$)
    
    Debug "IN="+Dir$ 
    
    If Right(Dir$,1) <> "\"
      ProcedureReturn
    EndIf 
    
    Global_Abort = 1 
    
    Repeat
      Debug "Wait"
      If IsThread(Global_TH1) = 0
        Global_ThreadsRunning -1
      EndIf
      If IsThread(Global_TH2) = 0
        Global_ThreadsRunning -1
      EndIf
      If IsThread(Global_TH3) = 0
        Global_ThreadsRunning -1
      EndIf
      If IsThread(Global_TH4) = 0
        Global_ThreadsRunning -1
      EndIf
      Delay(100) 
    Until Global_ThreadsRunning <= 0
    Global_Abort = 0
    Debug "WEITER"  
    
    ClearGadgetItems(#List)
    ClearGadgetItems(#List2)
    
    Dim img.img(1)
    Redim img.img(5000)  
    
    For tmp_p = 0 To Global_Pic_Count
      If IsImage(tmp_p)
        FreeGadget(tmp_p)
        FreeImage(tmp_p)
      EndIf
    Next 
    
    SetGadgetAttribute(#XS,#PB_ScrollArea_Y,0) 
    
    Global_Pic_Count = 0
    
    If ExamineDirectory(0,Dir$,"*.*") 
      
      While NextDirectoryEntry(0)
        If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
          AddGadgetItem(#List,-1,DirectoryEntryName(0)+"\",ImageID(#FIcon)) 
        EndIf 
      Wend
      FinishDirectory(0)   
      
      If ExamineDirectory(0,Dir$,"*.*") 
        While NextDirectoryEntry(0)
          If DirectoryEntryType(0) = #PB_DirectoryEntry_File
            tmp_ext$=LCase(GetExtensionPart(DirectoryEntryName(0)))
            
            For tmp_p = 0 To Global_Total_Ext
              
              If tmp_ext$ = Ext(tmp_p)\JustStrings
                
                AddGadgetItem(#List2,-1,DirectoryEntryName(0)) 
                
                img(Global_Pic_Count)\Pic = Dir$+DirectoryEntryName(0)
                
                Result = ButtonImageGadget(Global_Pic_Count,x_pos,y_pos,Global_Cell,Global_Cell,ImageID(#Dummy),#PB_Button_Toggle)
                Debug "RESULT="+Result
                tmp_x + 1 : x_pos + Global_Cell 
                
                If tmp_x = 2
                  x_pos = 0 : tmp_x = 0 : y_pos + Global_Cell
                EndIf  
                
                Global_Pic_Count + 1
                
                Break
              EndIf
            Next
          EndIf 
        Wend
        FinishDirectory(0) 
        
      EndIf 
      
      If Global_Pic_Count  
        
        If Global_Pic_Count = 1
          CreateThread(@AddPic(),#Null) 
        EndIf
        
        Global_Pic_Count -1
        
        If Global_Pic_Count = 0
          TH = 1
        EndIf
        
        If Global_Pic_Count > 0 ; DUAL
          TH = 2 
        EndIf
        
        If Global_Pic_Count > 1 ; Tripple
          TH = 3 
        EndIf
        
        If Global_Pic_Count > 2 ; QUAD
          TH = 4 
        EndIf
        
        Global_ThreadsRunning = TH
        
        Debug "-----------"
        Debug "PICS="+Global_Pic_Count
        Debug "THREADS="+TH
        Debug "---------"
        
        If TH = 2
          Global_TH1 = CreateThread(@AddPic2(),0)
          Global_TH2 = CreateThread(@AddPic2(),1)  
        EndIf
        
        If TH = 3
          Global_TH1 = CreateThread(@AddPic3(),0) 
          Global_TH2 = CreateThread(@AddPic3(),1) 
          Global_TH3 = CreateThread(@AddPic3(),2)  
        EndIf
        
        If TH = 4
          Global_TH1 = CreateThread(@AddPic4(),0) 
          Global_TH2 = CreateThread(@AddPic4(),1) 
          Global_TH3 = CreateThread(@AddPic4(),2)
          Global_TH4 = CreateThread(@AddPic4(),3)  
        EndIf
        
        SetGadgetAttribute(#XS,#PB_ScrollArea_InnerHeight,y_pos+Global_Cell) 
        
      EndIf
      
      SetGadgetText(#ActivePath,Dir$)
      
    EndIf  
    
  EndProcedure
  
  Procedure.w MouseWheelDelta() 
    Protected x.w
    
    x.w = ((EventwParam()>>16)&$FFFF) 
    ProcedureReturn -(x / 120) 
  EndProcedure 
  
  Procedure DirBack(IN.S)
    
    If IN.S
      tmp_max = CountString(IN.S,"\")
      If tmp_max > 1
        For tmp_p = 1 To tmp_max -1
          tmp_str1$ = ""
          tmp_str1$ + StringField(IN.S,tmp_p,"\") 
          If tmp_str1$
            tmp_str2$+tmp_str1$+"\" 
          EndIf
        Next 
        
        If FileSize(tmp_str2$) <> -2
          tmp_str2$ = Left(IN.S,3) ; GO BACK TO DRIVE ROOT
          If FileSize(tmp_str2$) <> -2 ; GO BACK TO C:\
            tmp_str2$ = "C:\"
          EndIf
        EndIf
        
        Refill(tmp_str2$)
        
      ElseIf tmp_max = 1
        tmp_str2$ = InputRequester("Change","to Drive",UCase(Left(IN.S,1)))
        If tmp_str2$
          tmp_str2$ = Left(tmp_str2$,1) 
          If FileSize(tmp_str2$+":\") = -2
            Refill(tmp_str2$+":\")
          EndIf
        EndIf
        
      EndIf
      
    EndIf
    
  EndProcedure
  
  AddExtToExtStruc()
  
  SystemParametersInfo_(#SPI_GETWORKAREA,0,@DesktopWorkArea.RECT,0) 
  task_h = GetSystemMetrics_(#SM_CYSCREEN)-DesktopWorkArea\Bottom
  Debug "TASKH="+task_h
  ExamineDesktops() 
  Debug "DEKH="+DesktopHeight(0)
  win_h = DesktopHeight(0)-task_h
  ScrollH = win_h - 230
  Global_BigBSize = ScrollH + 20 ;( Scroll Area Balken unten)
  Debug "BIGB="+Global_BigBSize
  Debug "---"
  PageJump = ScrollH / Global_Cell
  Debug "---"
  Debug "SCROLLH="+ScrollH  
  
  CreateImage(#Dummy,1,1) 
  
  OpenWindow(#MainWin,100,-3,1024,win_h-30,"New Prog",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
  
  AddWindowTimer(#MainWin,10,250)
  
  ListIconGadget(#List,0,0,420,200,"",380,#PB_ListIcon_AlwaysShowSelection)
  ListIconGadget(#List2,420,0,604,200,"File",480,#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect) 
  
  SetGadgetAttribute(#List,#PB_ListIcon_DisplayMode,#PB_ListIcon_List)
  ;SetGadgetAttribute(#List2,#PB_ListIcon_DisplayMode,#PB_ListIcon_Report)
  SetGadgetAttribute(#List2,#PB_ListIcon_DisplayMode,#PB_ListIcon_List)
  
  SetActiveGadget(#List) 
  
  
  If LoadImage(#FIcon,"D:\Cleopatra-00-Folder-icon.png") = 0
    Debug "NO FOLDER ICON FOUND"
    CreateImage(#FIcon,10,10) 
  EndIf 
  
  TextGadget(#ActivePath,10,400,0,0,"")  
  
  
  ScrollAreaGadget(#XSBig,300,200,Global_BigBSize+40,ScrollH,Global_BigBSize+200,Global_BigBSize*2,Global_Cell) 
    ButtonImageGadget(#Big,0,0,#WKon,Global_BigBSize,ImageID(#Dummy)) 
  CloseGadgetList() 
  

  ScrollAreaGadget(#XS,0,200,300,ScrollH,280,3000,Global_Cell)

  Refill("c:\") 
  
  SetGadgetItemState(#List,0,1)
  SetGadgetItemState(#List2,0,1)
  
  Debug "SCROLL="+GetGadgetAttribute(#XS,#PB_ScrollArea_Y)
  
  MainSC = 0 
  
  Repeat 
    
    Event = WaitWindowEvent()  
    
    If Event = #PB_Event_Timer And EventTimer() = 10
      
      If Global_Big_Image = #True
        tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
        ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
        SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))
        Global_Big_Image = #False
      EndIf  
      
    ElseIf Event =#WM_MOUSEWHEEL
      
      Main_ActiveG = GetActiveGadget()
      If Main_ActiveG <> #List And Main_ActiveG <> #List2
        If MouseWheelDelta()=1
          ;Debug "MOUSE DOWN"
          MainSC + 1 
        Else
          ;Debug "MOUSE UP"
          MainSC - 1
          ;AddMore(0) 
        EndIf  
      EndIf 
      
    ElseIf Event = #WM_KEYDOWN
      
      Main_KeyCode = EventwParam() 
      
      If Main_KeyCode = #VK_ESCAPE
        HideGadget(#XS,0)
      EndIf
      
      If Main_KeyCode = #VK_BACK
        DirBack(GetGadgetText(#ActivePath)) 
      EndIf
      
      If Main_KeyCode = #VK_Add
        Debug "JOA"
      EndIf
      
      If Main_KeyCode = #VK_Subtract
        Debug "JOA"
      EndIf
      
      If Main_KeyCode = #VK_RETURN And GetActiveGadget() = #List
        If GetGadgetState(#List) >= 0
          Dir$ = GetGadgetText(#ActivePath) : Entry$ = GetGadgetItemText(#List,GetGadgetState(#List))
          Refill(Dir$+Entry$)
          SetGadgetItemState(#List,2,1)
        EndIf
        
      EndIf
      
      If Main_KeyCode = #VK_LEFT
        
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001 And IsGadget(ActiveG-1)
          Debug "Prev Pic"
          If LoadImage(#Big,img(ActiveG-1)\Pic.S)
            tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
            ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
            SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
            LastClicked = ActiveG-1 
            SetActiveGadget(ActiveG-1)
            SetGadgetItemState(#List2,ActiveG-1,1)
            If GadgetX(ActiveG-1) = Global_Cell
              SetGadgetAttribute(#XS,#PB_ScrollArea_Y,GetGadgetAttribute(#XS,#PB_ScrollArea_Y)-Global_Cell) 
            EndIf
          EndIf
        EndIf
        
      EndIf
      
      If Main_KeyCode = #VK_Right
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001 And IsGadget(ActiveG+1)
          Debug "Next Pic" 
          
          If LoadImage(#Big,img(ActiveG+1)\Pic.S)
            tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
            ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
            SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
            LastClicked = ActiveG+1 
            SetActiveGadget(ActiveG+1)
            SetGadgetItemState(#List2,ActiveG+1,1) 
            If GadgetX(ActiveG+1) = 0
              SetGadgetAttribute(#XS,#PB_ScrollArea_Y,GetGadgetAttribute(#XS,#PB_ScrollArea_Y)+Global_Cell)  
            EndIf
          EndIf
          
        EndIf
      EndIf
      
      
      If Main_KeyCode = #VK_Up
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001 And IsGadget(ActiveG-2)
          Debug "Pic Up" 
          If LoadImage(#Big,img(ActiveG-2)\Pic.S)
            tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
            ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
            SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
            LastClicked = ActiveG-2 
            SetActiveGadget(ActiveG-2) 
            SetGadgetItemState(#List2,ActiveG-2,1) 
            SetGadgetAttribute(#XS,#PB_ScrollArea_Y,GetGadgetAttribute(#XS,#PB_ScrollArea_Y)-Global_Cell)  
          EndIf 
        EndIf  
      EndIf
      
      
      If Main_KeyCode = #VK_Down
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001 And IsGadget(ActiveG+2)
          Debug "Pic Down"
          If LoadImage(#Big,img(ActiveG+2)\Pic.S)
            tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
            ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
            SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
            LastClicked = ActiveG+2 
            SetActiveGadget(ActiveG+2)
            SetGadgetItemState(#List2,ActiveG+2,1) 
            SetGadgetAttribute(#XS,#PB_ScrollArea_Y,GetGadgetAttribute(#XS,#PB_ScrollArea_Y)+Global_Cell) 
          EndIf
        EndIf 
      EndIf
      
      If Main_KeyCode = #VK_Home
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001 And IsGadget(0)
          Debug "FIRST PIC"
          If LoadImage(#Big,img(0)\Pic.S)
            tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
            ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
            SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
            LastClicked = 0 
            SetActiveGadget(0) 
            SetGadgetItemState(#List2,0,1) 
            SetGadgetAttribute(#XS,#PB_ScrollArea_Y,0)   
          EndIf
        EndIf 
      EndIf
      
      
      If Main_KeyCode = #VK_End
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001 And IsGadget(Global_Pic_Count)
          Debug "LAST PIC"
          If LoadImage(#Big,img(Global_Pic_Count)\Pic.S)
            tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
            ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
            SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
            LastClicked = Global_Pic_Count
            SetActiveGadget(Global_Pic_Count)  
            SetGadgetItemState(#List2,Global_Pic_Count,1) 
            SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Cell * LastClicked / 2)  
          EndIf
        EndIf 
      EndIf
      
      If Main_KeyCode = #VK_Prior
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001
          Main_PG = ActiveG - (PageJump * 2)
          Debug Main_PG
          If IsGadget(Main_PG) = 0
            Main_PG = 0
          EndIf
          If IsGadget(Main_PG) 
            Debug "Page UP"
            If LoadImage(#Big,img(Main_PG)\Pic.S)
              tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
              ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
              SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
              LastClicked = Main_PG
              SetActiveGadget(Main_PG)
              SetGadgetItemState(#List2,Main_PG,1) 
              SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Cell * LastClicked / 2) 
            EndIf 
          EndIf 
        EndIf 
      EndIf
      
      If Main_KeyCode = #VK_Next
        ActiveG = GetActiveGadget()
        If ActiveG > -1 And ActiveG < 6001
          Main_PG = ActiveG + (PageJump * 2)
          Debug Main_PG
          If IsGadget(Main_PG) = 0
            Main_PG = Global_Pic_Count
          EndIf
          If IsGadget(Main_PG) 
            Debug "Page DOWN"
            If LoadImage(#Big,img(Main_PG)\Pic.S)
              tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
              ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
              SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
              LastClicked = Main_PG
              SetActiveGadget(Main_PG)
              SetGadgetItemState(#List2,Main_PG,1) 
              SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Cell * LastClicked / 2)  
            EndIf 
          EndIf 
        EndIf 
      EndIf
      
    ElseIf Event = #PB_Event_Gadget
      
      EventGadget = EventGadget()
      
      If EventGadget = #List And EventType() = #PB_EventType_LeftDoubleClick
        
        Dir$ = GetGadgetText(#ActivePath) : Entry$ = GetGadgetItemText(#List,GetGadgetState(#List))  
        Refill(Dir$+Entry$)
        If IsGadget(0)
          SetActiveGadget(0)  
        EndIf 
        
      EndIf
      
      If EventGadget > -1 And EventGadget < 6001
        
        Debug EventGadget
        
        If IsImage(EventGadget) And EventGadget <> LastClicked 
          If LoadImage(#Big,img(EventGadget)\Pic.S)
            tmp_sizeX$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
            ResizeImage(#Big,Val(StringField(tmp_sizeX$,1,":")),Val(StringField(tmp_sizeX$,2,":")))
            SetGadgetAttribute(#Big,#PB_Button_Image,ImageID(#Big))  
            LastClicked = EventGadget
          EndIf
          
        EndIf
        
      EndIf  
      
      If EventGadget = #Big
        HideGadget(#XS,1)
        LoadImage(#XBig,img(LastClicked)\Pic)
        SetGadgetAttribute(#XX,#PB_Button_Image,ImageID(#XBig))
        HideGadget(#XX,0)
      EndIf
     
    EndIf 
    
    If Event = #PB_Event_CloseWindow
      Break
    EndIf
    
  ForEver 
 
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: Open/UseGadgetList zickt rum

Beitrag von GlassJoe »

jaaaaaaaaaaaaaaaaa ich habs endlich hingekriegt :bounce: (benutze aber weiterhin ButtonImageGadgets für die Thumbs, hat paar Vorteile) dieses verdammte OpenGadgetList.
Ich habs an zig Stellen probiert, und die einzige Stelle an der ich es nicht probiert hab war in den Threads selbst, da ich dachte wenn ein Thread OpenGadgetList benutzt und noch läuft, aber schon wieder aufgerufen wird, und dann wieder OpenGadgetList benutzt wird, wird das auf keinen Fall gehen, wenn dieses verdammte OpenGadgetList an zig anderen Stellen die nicht in Threads sind, zwar keinen Fehler ausgibt aber ignoriert wird.............ok ich wusste auch nicht das OpenGadgetList überhaupt in Threads geht.

Das große Hauptbild hab ich endlich als ImageGadget hingekriegt, und Fullscreen geht auch.

Habs den OpenGadgetList Kram und LoadImage für's Große Bild hier plaziert

Code: Alles auswählen


...
..
..
If ExamineDirectory(0,Dir$,"*.*") 
        While NextDirectoryEntry(0)
          If DirectoryEntryType(0) = #PB_DirectoryEntry_File
            tmp_ext$=LCase(GetExtensionPart(DirectoryEntryName(0)))
            
            For tmp_p = 0 To Global_Total_Ext
              
              If tmp_ext$ = Ext(tmp_p)\JustStrings 
                
                AddGadgetItem(#List2,-1,DirectoryEntryName(0)) 
                
                img(Global_Pic_Count)\Pic = Dir$+DirectoryEntryName(0) 
                
                If Global_Pic_Count = 0
                  If LoadImage(#Big,img(0)\Pic)
                    Debug "LOAD OK"
                    UseGadgetList(#MainWin)
                    OpenGadgetList(#XSBig)
                      tmp_size$ = CalcImageSize(#Big,#WKon,Global_BigBSize)
                      ResizeImage(#Big,Val(StringField(tmp_size$,1,":")),Val(StringField(tmp_size$,2,":")))
                      ImageGadget(#BigGadget,250,100,#WKon,Global_BigBSize,ImageID(#Big))
                    CloseGadgetList()
                  EndIf 
                  UseGadgetList(#MainWin)
                  OpenGadgetList(#XS)
                EndIf               
    
                Result = ButtonImageGadget(Global_Pic_Count,x_pos,y_pos,Global_Cell,Global_Cell,ImageID(#Dummy),#PB_Button_Toggle)
                
                Debug "RESULT="+Result
                tmp_x + 1 : x_pos + Global_Cell  
                If tmp_x = 2
                  x_pos = 0 : tmp_x = 0 : y_pos + Global_Cell
                EndIf   
                Global_Pic_Count + 1 
                
                Break
                
                
              EndIf
            Next
          EndIf 
        Wend
        FinishDirectory(0) 
        
      EndIf 

If Global_Pic_Count  
        
        If Global_Pic_Count = 1
          CreateThread(@AddPic(),#Null) 
        EndIf
        
        Global_Pic_Count -1
        
        If Global_Pic_Count = 0 : TH = 1 : EndIf
        
        If Global_Pic_Count > 0 : TH = 2 : EndIf
        
        If Global_Pic_Count > 1 : TH = 3 : EndIf
        
        If Global_Pic_Count > 2 : TH = 4 : EndIf
        
        Global_ThreadsRunning = TH
        
        Debug "-----------"
        Debug "PICS="+Global_Pic_Count
        Debug "THREADS="+TH
        Debug "---------"
        
        If TH = 2
          Global_TH1 = CreateThread(@AddPic2(),0)
          Global_TH2 = CreateThread(@AddPic2(),1)  
        EndIf
        
        If TH = 3
          Global_TH1 = CreateThread(@AddPic3(),0) 
          Global_TH2 = CreateThread(@AddPic3(),1) 
          Global_TH3 = CreateThread(@AddPic3(),2)  
        EndIf
        
        If TH = 4
          Global_TH1 = CreateThread(@AddPic4(),0) 
          Global_TH2 = CreateThread(@AddPic4(),1) 
          Global_TH3 = CreateThread(@AddPic4(),2)
          Global_TH4 = CreateThread(@AddPic4(),3)  
        EndIf
        
        Debug y_pos+Global_Cell
        SetGadgetAttribute(#XS,#PB_ScrollArea_InnerHeight,y_pos+Global_Cell) 
        
      EndIf
      
      SetGadgetText(#ActivePath,Dir$)

...
..

und das hatte ich vor paar Tagen schon ewig probiert, aber da ging es nur wenn dafür die Thumb Buttons nicht mehr sichtbar/verschoben waren, oder es ging nicht und dafür die Thumb Buttons, und alles nur weil ich nicht drauf gekommen bin OpenGadgetList in Treads zu benutzen :bluescreen: :bluescreen: :bluescreen:

Das einzige was jetzt noch Probleme macht ist der Zoom, ich krieg den hin, aber die Ausrichtung vom Scroll Gadget ist teils unberechenbar für mich :freak:

Und was im Beispiel Code geht, aber bei mir nicht, ist diese ScrollGadget zusammen pap Technik damit
das Ding mehr als 32767Pixel hoch sein kann.

http://forums.purebasic.com/german/view ... ilit=32767
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Open/UseGadgetList zickt rum

Beitrag von Bisonte »

Mal so als Tipp nebenbei : Erstelle zuerst ALLE Fenster und ihre Gadgets, verstecke sie wenn nötig.
Dann brauchst du auch nie mit UseGadgetList rumhantieren, dann reicht ein OpenGadgetList()/CloseGadgetList()
Das ganze noch mit einem Flag merken lassen (z.B. in SetGadgetData) ob das gerade auf oder zu ist.

Aber ich hab auch die komplette Frage nicht verstanden, weil in deinem ersten geposteten Code kein OpenGadgetList()
oder gar ein UseGadgetList() vorkommt....
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
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: Open/UseGadgetList zickt rum

Beitrag von NicTheQuick »

Er zeigt ja dynamisch Bilder an. Ich denke nicht, dass er dann gut im Voraus alle Gadgets erstellen kann.

Davon abgesehen hätte ich es sowieso mit einem CanvasGadget gemacht. Die Bilder in Threads vorladen und dann im Hauptthread alles auf das Canvas malen, was zu sehen ist. Beim Scrollen und Zoomen entsprechend anpassen.
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: Open/UseGadgetList zickt rum

Beitrag von GlassJoe »

NicTheQuick hat geschrieben:Er zeigt ja dynamisch Bilder an. Ich denke nicht, dass er dann gut im Voraus alle Gadgets erstellen kann.

Davon abgesehen hätte ich es sowieso mit einem CanvasGadget gemacht. Die Bilder in Threads vorladen und dann im Hauptthread alles auf das Canvas malen, was zu sehen ist. Beim Scrollen und Zoomen entsprechend anpassen.
@Bisonte:

Ich hatte in dem Code aus dem ersten Post die gesammten OpenGadgetList Versuche ausgebaut.
Ich kann leider schlecht Wissen wieviel Gadgets ich am Ende brauche, ist ja in jedem Ordner anders, und
das Ding muss möglichst schnell starten imo bin ich bei ~ 500ms Startzeit wenn ich den Stromsparmodus der CPU an habe, so das möglichst 4x 1ghz anliegen und die Reaktionszeiten wegen dem AMD Cool & Quiet höher sind.

Es gab auch nicht wirklich eine Frage, ich hab einfach stundenlange probier Frust rausgelassen und ein Tag aufgegeben gehabt, und dachte mir, wenn es irgendwie geht....ich komm gewiss nicht mehr drauf :freak:

@NicTheQuick

Canvas Gadget daran dachte ich auch schon, aber das ist so als müsste mann komplett neu PB lernen, so viel neues ist da :shock:

Im Moment hab ich nur ein Problem, der Code aus dem 5.Post geht nicht.

http://forums.purebasic.com/german/view ... ilit=32767

Erst dachte ich ich mach was falsch, aber der Code im Zusammespiel mit ImageGadgets ist das Problem.

Code: Alles auswählen

 TextGadget(10, 10, 32747, 80, 20, "32767")
erscheint noch.

TextGadget(11, 10, 49980, 80, 20, "50000")

nicht mehr.

TextGadget(12, 10, 0, 80, 20, "Win 2")

wird überdeckt vom ersten Scroll Area Gadget

und

TextGadget(13, 10, 32747, 80, 20, "Unten")

erscheint auch nicht, wenn mann es nicht anpasst, wegen dem obsoleten "CreateGadgetList()"

Ich glaube nicht das einer der so einen komplizierten API Kram hingekriegt hat, zu blöd war
die Dinger richtig zu plazieren, daß Problem scheint zu sein daß auf dem reingschmugelten ScrollGadget anscheinend keine Bilder gehen, und
auch 2007 nicht gingen :D (habs auch in PB 4.20 probiert, was älteres hab ich nicht mehr da)

Hier der Probe Code, es ist nichts verändert, nur 2 Stellen wo ich versuche ein ImageGadet zu plazieren.

Code: Alles auswählen

  Define.l *OldWProcSc, hWnd, hwnd2
  
  UseJPEGImageDecoder()
  
  Procedure SaCB(Sa_hwnd, msg, wParam, lParam)
    Shared *OldWProcSc, hwnd1, hwnd2
    Protected sc.SCROLLINFO
    If Sa_hwnd = GadgetID(0)
      Select msg
        Case #WM_VSCROLL
          If wParam & $FFFF <> #SB_THUMBTRACK
            sc\cbSize = SizeOf(SCROLLINFO)
            sc\fMask = #SIF_POS
            GetScrollInfo_(GadgetID(0), #SB_VERT, @sc)
            SetWindowPos_(hwnd1, 0, 0, 32767 - sc\nPos, 0, 0, #SWP_NOSIZE | #SWP_NOZORDER)
            InvalidateRect_(hwnd1, 0, #True)
            InvalidateRect_(hwnd2, 0, #True)
          Else
            sc\cbSize = SizeOf(SCROLLINFO)
            sc\fMask = #SIF_TRACKPOS
            GetScrollInfo_(GadgetID(0), #SB_VERT, @sc)
            SetWindowPos_(hwnd1, 0, 0, 32767 - sc\nTrackPos, 0, 0, #SWP_NOSIZE | #SWP_NOZORDER)
            InvalidateRect_(hwnd1, 0, #True)
            InvalidateRect_(hwnd2, 0, #True)
          EndIf
      EndSelect
    EndIf
    ProcedureReturn CallWindowProc_(*OldWProcSc, Sa_hwnd, msg, wParam, lParam)
  EndProcedure
  
  LoadImage(0,"somejpeg")
  ResizeImage(0,140,140,#PB_Image_Raw)
  
  OpenWindow(0, #PB_Ignore, #PB_Ignore, 320, 800, "")
  ;CreateGadgetList(WindowID(0))
  ScrollAreaGadget(0, 5, 5, 310, 790, 290, 1000, 100)
    hWnd = FindWindowEx_(GadgetID(0), 0, "PureScrollAreaChild", "")
    SetWindowPos_(hWnd, 0, 0, 0, 290, 32767, #SWP_NOZORDER | #SWP_NOMOVE | #SWP_NOREPOSITION)
    Define si.SCROLLINFO
    si\cbSize = SizeOf(SCROLLINFO)
    si\fMask = #SIF_RANGE
    si\nMin = 0
    si\nMax = 65534
    SetScrollInfo_(GadgetID(0), #SB_VERT, @si, #True)
    TextGadget(10, 10, 32747, 80, 20, "32767")
    
    ;/ First Test
    ImageGadget(30,10,33047,140,140,ImageID(0))
    
    TextGadget(11, 10, 49980, 80, 20, "50000")
  CloseGadgetList()
  hwnd2 = FindWindowEx_(GadgetID(0), 0, "PureScrollAreaChild", "")
  hwnd1 = CreateWindowEx_(0, "PureScrollAreaChild", "", #WS_CHILD | #WS_VISIBLE, 0, 32767, 290, 50000, GadgetID(0), 0, 0, 0)
  ;CreateGadgetList(hwnd1)
  UseGadgetList(hwnd1)
  TextGadget(12, 10, 0, 80, 20, "Win 2")
  
  ;/ Second Test
  
  ImageGadget(31,10,33547,140,140,ImageID(0))
  
  TextGadget(13, 10, 32747, 80, 20, "Unten")
  *OldWProcSc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @SaCB())
  
  Repeat
    Event = WaitWindowEvent()
    
  Until Event = #PB_Event_CloseWindow
  
  Debug GetGadgetAttribute(0, #PB_ScrollArea_InnerHeight); Ausgabe: 32767
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Antworten