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
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
PB 4.0 Windows
Windows XP SP2