Probleme beim aktualisieren eines ProgressBarGadget

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Probleme beim aktualisieren eines ProgressBarGadget

Beitrag von funk.munich »

Hi zusammen,

ich möchte mir einen kleinen Uninstaller schreiben.
Während der Uninstaller z.B. Registry Einträge oder Dateien von der Festplatte entfernt soll der Benutzer eine ProgressBar sowie ein aktualisierendes Text Feld angezeigt bekommen. Jedoch dort habe ich zwei Probleme:

1. Text Feld setzt zwar einen neuen Wert aber lässt den vorherigen Wert dort stehen. Sieht eher so aus als ob das Gadget nicht aktualisert werden kann (hier gehe ich davon aus dass ich Mist gebaut habe).
2. Desweiteren bekomme ich auch keine Vernünftige Lösung mit der Progressbar hin. Ich meine damit, wenn das Prog Gadget aktualisiert wird und ich in das Fenster klicke, hängt sich das Programm auf :-(

Ich habe mal aus mehreren Codestücken eine PB Datei erstellt womit man das Problem reproduzieren kann.

Nachdem Starten des Programmes einfach die Schaltfläche "$BTN02$" anklicken. Dann sollte der Progress beginnen.

Das Setzen des TextGadgets sowie der ProgressBar passiert in der Prozedure "DelHC()". Findet Ihr ganz unten.

Habt Ihr eine Idee wie man die Aktualisierung eleganter bewerkstelligen kann?

Vielen Dank im vorraus,
Daniel

Code: Alles auswählen

; PB 4.0
; ProgressBar Problem

;- - - - - - - - CONSTANTS START
;- Required Image Decoders
;UsePNGImageDecoder()

;- Window Constants
Global MainWindow

;- Level Constants
Global Level

;- Arrays
Global Dim arrDEL.s(0)

; Gadget Constants
; gdt = Gadget
Enumeration 1

  Global gdt_IMG_HEADER
  Global gdt_IMG_BORDER01
  Global gdt_IMG_BORDER02
  Global gdt_BTN01
  Global gdt_BTN02
  Global gdt_BTN03
  Global gdt_TXT_HEADER
  Global gdt_TXT_TITLE
  Global gdt_TXT_CONTENT
  Global gdt_PROGBAR

EndEnumeration

#GadgetIndex = #PB_Compiler_EnumerationValue

;- Image Constants
; img = Image
;Enumeration 1

;  Global img_IMG_HEADER
;  Global img_IMG_BORDER01
;  Global img_IMG_BORDER02

;EndEnumeration

;#ImageIndex = #PB_Compiler_EnumerationValue

;- Load Images
;img_IMG_HEADER   = CatchImage(#PB_Any,?_OPT_IMG_HEADER)
;img_IMG_BORDER01 = CatchImage(#PB_Any,?_OPT_IMG_BORDER01)
;img_IMG_BORDER02 = CatchImage(#PB_Any,?_OPT_IMG_BORDER01)


;DataSection
;  _OPT_IMG_HEADER:IncludeBinary "images\header.PNG"
;  _OPT_IMG_BORDER01:IncludeBinary "images\border.PNG"
;EndDataSection

;- - - - - - - - CONSTANTS END

;- - - - - - - - SYSTEM START

Declare getArrLength(*arr)

Procedure getArrLength(*arr)

  ProcedureReturn PeekL(*arr-8)-1

EndProcedure

Procedure ReadPreferenceFile()

  If OpenPreferences("uninstall.dat")
    
      counter = 0
      ExaminePreferenceGroups()
  
      While NextPreferenceGroup()
  
        group.s = PreferenceGroupName()
        
          ExaminePreferenceKeys()
          While NextPreferenceKey()
  
            key.s = PreferenceKeyName()
            value.s = PreferenceKeyValue()
      
            ReDim arrDEL.s(counter)
            arrDEL(counter) = group + ", " + key + " , " + value
            counter + 1
      
          Wend
      Wend     
    
    ClosePreferences()
    
  Else
    ; ERROR
    MessageRequester("0","")
  EndIf

EndProcedure

;- - - - - - - - SYSTEM END

;- - - - - - - - UI START

Declare SetProgBar()
Declare SetWindowProperties(hWnd)
Declare SwitchLevel()
Declare DelHC()

Procedure InitWindow()

  MainWindow = OpenWindow(#PB_Any, 80, 80, 500, 356, "$TITLE$", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_WindowCentered|#PB_Window_Invisible)

  If MainWindow
  
    If CreateGadgetList(WindowID(MainWindow))
    
      SetWindowProperties(WindowID(MainWindow))
        
      ;gdt_IMG_HEADER=ImageGadget(#PB_Any,0,0,500,58,ImageID(img_IMG_HEADER))
      ;gdt_IMG_BORDER01=ImageGadget(#PB_Any,0,58,500,2,ImageID(img_IMG_BORDER01))
      ;gdt_IMG_BORDER02=ImageGadget(#PB_Any,0,311,500,2,ImageID(img_IMG_BORDER02))
      gdt_BTN01=ButtonGadget(#PB_Any,395,321,100,20,"$BTN01$")
      gdt_BTN02=ButtonGadget(#PB_Any,290,321,100,20,"$BTN02$")
      gdt_BTN03=ButtonGadget(#PB_Any,189,321,100,20,"$BTN03$")
      gdt_TXT_HEADER=TextGadget(#PB_Any,17,11,350,35,"$TXT_HEADER$")
        PVDynamic_AddColorGadget(gdt_TXT_HEADER, 0, -1)
      gdt_TXT_TITLE=TextGadget(#PB_Any,28,76,444,20,"$TXT_TITLE$")
        PVDynamic_AddColorGadget(gdt_TXT_TITLE, 0, -1)
      gdt_TXT_CONTENT=TextGadget(#PB_Any,28,100,444,200,"$TXT_CONTENT$")
        PVDynamic_AddColorGadget(gdt_TXT_CONTENT, 0, -1)
      gdt_PROGBAR=ProgressBarGadget(#PB_Any,28,100,444,20,0,5)
        SendMessage_(GadgetID(gdt_PROGBAR),#WM_USER+9,0,16711680)
      
      Level + 1
      SwitchLevel()      
      
      ProcedureReturn WindowID(MainWindow)
      
    EndIf
  EndIf
  
EndProcedure

Procedure SetWindowProperties(hWnd)

  ; Maximize Button
  nWindowLong.l = GetWindowLong_(hWnd, #GWL_STYLE) 
  SetWindowLong_(hWnd, #GWL_STYLE, nWindowLong & (#WS_MAXIMIZEBOX ! - 1)) 
  SetWindowPos_(hWnd, 0, 0, 0, 0, 0, #SWP_NOZORDER | #SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)

  ; Close Button
  hSysMenu = GetSystemMenu_(hWnd, #False) 
  EnableMenuItem_(hSysMenu, #SC_CLOSE, #MF_BYCOMMAND | Show ! 1) 
  DrawMenuBar_(hWnd) 
  
EndProcedure

Procedure SwitchLevel()

  Select level
    Case 1
      HideGadget(gdt_PROGBAR, 1)
      HideWindow(MainWindow,0)
      DisableGadget(gdt_BTN03, 1)
    Case 2
      HideGadget(gdt_TXT_CONTENT, 1)
      HideGadget(gdt_PROGBAR, 0)
      DisableGadget(gdt_BTN01, 1) : DisableGadget(gdt_BTN02, 1)
    Case 3
      HideGadget(gdt_TXT_CONTENT, 0) : 
      HideGadget(gdt_PROGBAR, 1)
      DisableGadget(gdt_BTN01, 0) : DisableGadget(gdt_BTN03, 1)
    Case 4 ; Abort
      DisableGadget(gdt_BTN02, 1)
  EndSelect

EndProcedure

; MIT DIESER PROCEDUR HABE ICH DAS PROBLEM!!
Procedure DelHC()

  counter = getArrLength(arrDel())
  SetGadgetAttribute(gdt_PROGBAR, #PB_ProgressBar_Maximum, counter)
  
  For i = 1 To counter
  
    SetGadgetText(gdt_TXT_TITLE, arrDEL(i))
    
    SetGadgetState(gdt_PROGBAR, i)
    Delay(500)
  Next

EndProcedure

;- - - - - - - - UI END

;- - - - - - - - CALLBACK START

Procedure WindowCallback(WindowID,Message,wParam,lParam)
  
  ReturnValue = #PB_ProcessPureBasicEvents
  
  If Message = #WM_CTLCOLORSTATIC Or Message=#WM_CTLCOLOREDIT Or Message=#WM_CTLCOLORLISTBOX
    ReturnValue = PVDynamic_ColorGadget(lParam,wParam)
  EndIf

  ProcedureReturn ReturnValue
  
EndProcedure

;- - - - - - - - CALLBACK END

;- - - - - - - - START

ReadPreferenceFile() 
  
If InitWindow()
  SetWindowCallback(@WindowCallback())
  quit = 0
  
  Repeat
      EventID  = WaitWindowEvent()
      MenuID   = EventMenu()
      GadgetID = EventGadget()
      WindowID = EventWindow()

      Select EventID
        Case #PB_Event_CloseWindow
          If WindowID = MainWindow
            quit = 1
          EndIf

        Case #PB_Event_Gadget
          Select GadgetID
            Case gdt_BTN01 ; CANCEL | FINISHED
              If Level = 1
                ; Abort
                Level = 4
                SwitchLevel()
              Else
                ; Finished
                quit = 1
              EndIf
            Case gdt_BTN02 ; NEXT
              Level + 1
              SwitchLevel()
              ; HIER FÄNGT MEIN PROBLEM AN!!
              DelHC()
              Level + 1
              SwitchLevel()
            Case gdt_BTN03 ; BACK
              Level - 1
              SwitchLevel()
          EndSelect

      EndSelect
    Until quit
  
    CloseWindow(MainWindow)
EndIf
End
Des weiteren benötigt Ihr noch eine "uninstall.dat" Datei:

Code: Alles auswählen

[Registry]
regkey = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df0
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df1
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df2
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df3
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df4
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df5
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df6
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df7
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df8
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df9
regvalue = HKEY_LOCAL_MACHINE\SOFTWARE\DF_TESTER\test\df10
Nutze hierfür:
PB 4.0 Windows
Windows XP SP2
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi zusammen,

ich habe doch schon eine Lösung gefunden.

1. TextGadget Problem taucht nur auf, wenn ich keine eindeutige ID nehme. Also Problem immer nur bei gadgetId = TextGadget(#PB_Any,...
jedoch mit TextGadget(500,... funxt es richtig.

2. ProgressBar lasse ich jetzt in einem Thread laufen. Funxt auch einwandfrei.

Gruß,
Daniel
Benutzeravatar
kinghanno
Beiträge: 7
Registriert: 17.01.2005 19:16
Wohnort: Granstedt
Kontaktdaten:

Beitrag von kinghanno »

Häng einfach

Code: Alles auswählen

While WindowEvent() : Wend
nach der Aktualisierung des Balkens, also nach Änderung seines Werts, an.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

davon muss ich abraten, damit kann man auch events vernichten, die man haben will.
man muss einfach dafür sorgen, dass das aktualisierungs-event auch einen
eventschleifen-durchlauf bekommt, in dem es abgearbeitet werden kann.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten