Seite 1 von 2

Bug in CountGadgetItems ??

Verfasst: 15.03.2007 22:24
von Blackskyliner
Ich habe ein ExplorerListGadget...
Mit den Werten: #PB_Explorer_MultiSelect |#PB_Explorer_NoDirectoryChange | #PB_Explorer_NoDriveRequester | #PB_Explorer_NoFolders | #PB_Explorer_NoParentFolder

So...
Wenn ich nun Mehrere Dateien Selektiere, dann werden die:
1. Nicht mehr mitgezählt
2. Der GadgetItemState ist Unknown...

Hier der Source, der das fabriziert:

Code: Alles auswählen

Procedure.s FileRequester(title.s)
	ReturnString.s = ""
	
	hwnd 	= OpenWindow(#PB_Any, 0, 0, 800, 420 , title, #PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
	
	CreateGadgetList(WindowID(hwnd))
	
	Dir		= ExplorerListGadget(#PB_Any,0,0,400,400,"",#PB_Explorer_NoFiles)
  	File		= ExplorerListGadget(#PB_Any,400,0,400,400,"",#PB_Explorer_MultiSelect |#PB_Explorer_NoDirectoryChange | #PB_Explorer_NoDriveRequester | #PB_Explorer_NoFolders | #PB_Explorer_NoParentFolder)
  	Button1	= ButtonGadget(#PB_Any,770,400,30,20,"Ok")
  	Button2	= ButtonGadget(#PB_Any,720,400,50,20,"Cancel")

	DirGadger	= Dir
	FileGadger	= File

	Repeat
		Event = WindowEvent()
		

	Select Event
		Case #PB_Event_CloseWindow
			CloseWindow(hwnd)
			
			ProcedureReturn ""
		Case #PB_Event_Gadget
			Select EventGadget() 
				Case Button1
					ReturnString = GetGadgetText(FileGadger)
					
					If GetGadgetState(FileGadger) > -1
					ReturnString + GetGadgetItemText(FileGadger,GetGadgetState(FileGadger), 0)
					EndIf
				Case Button2
					CloseWindow(hwnd)
					
					ProcedureReturn ""
				Case DirGadger
					SetGadgetText(FileGadger, GetGadgetText(DirGadger))
				Case FileGadger
					If EventType() = 2
						ReturnString = GetGadgetText(FileGadger)
						
						If GetGadgetState(FileGadger) > -1
							ReturnString + GetGadgetItemText(FileGadger,GetGadgetState(FileGadger), 0)
						EndIf
						
						
						For i=0 To CountGadgetItems(FileGadger)
							Debug i
							If GetGadgetItemState(FileGadger, i) = #PB_Explorer_File
								Debug "File: " + GetGadgetItemText(FileGadger, i,0)
							ElseIf GetGadgetItemState(FileGadger, i) = #PB_Explorer_Directory
								Debug "Dir: " + GetGadgetItemText(FileGadger, i,0)
							ElseIf GetGadgetItemState(FileGadger, i) = #PB_Explorer_Selected
								Debug "Selected: " + GetGadgetItemText(FileGadger, i,0)
							Else
								Debug "Unknown: " + GetGadgetItemText(FileGadger, i,0)
							EndIf
						Next
					EndIf
			EndSelect 
	EndSelect 
		
		Delay(1)
	Until ReturnString <> ""
	
	CloseWindow(hwnd)
	

	ProcedureReturn ReturnString

EndProcedure

Debug FileRequester("Test")
Jemand ne Idee, obs ein Bug ist oder ob ich zu dumm bin die Hilfe zu lesen oder gar die Funktion zu benutzen :lol:

Verfasst: 16.03.2007 07:24
von dysti
Also, ich kann kein Fehler entdecken. Bei mir zählt er richtig. Auch bei mehrfachen Selektieren.

Verfasst: 16.03.2007 07:55
von Blackskyliner
Argh... Bestimmt ein fehler in der 2.00, naja man kann ja auch mal die neue nehmen ^^ xD *login* ... *lad*

Verfasst: 16.03.2007 08:06
von edel
Blackskyliner hat geschrieben:Argh... Bestimmt ein fehler in der 2.00, naja man kann ja auch mal die neue nehmen ^^ xD *login* ... *lad*

Was ist 2.00 ?

Verfasst: 16.03.2007 08:49
von Blackskyliner
Naja, die anfängliche Retail Version... jaja ich weiß... ich lebe in der Vergangenheit ^^

Meinte 4.00 xD

Achja... jetzt gehts :D
MFG
Blackskyliner :allright:

Verfasst: 16.03.2007 15:04
von freak

Code: Alles auswählen

If GetGadgetItemState(FileGadger, i) = #PB_Explorer_File
Der Test mit dem Gleichheitszeichen ist falsch. Wenn es sich um eine Datei handelt
die selektiert ist dann sind nämlich beide Flags (#PB_Explorer_File und #PB_Explorer_Selected)
gesetzt und desshalb kommt "Unknown" raus.

Mit binary And testet man Flags:

Code: Alles auswählen

If GetGadgetItemState(FileGadger, i) & #PB_Explorer_File

Verfasst: 17.03.2007 23:14
von marco2007
...hat mich auch einmal extrem gefuchst...

PB-Hilfe:

- ExplorerListGadget(): gibt eine Kombination der folgenden Werte zurück.
#PB_Explorer_File : Der Eintrag ist eine Datei.
#PB_Explorer_Directory : Der Eintrag ist ein Verzeichnis (oder ein Laufwerk).
#PB_Explorer_Selected : Der Eintrag ist aktuell ausgewählt.

Code: Alles auswählen

If GetGadgetItemState(FileGadger, i) = #PB_Explorer_File + #PB_Explorer_Selected

oder wie freak schieb....

Verfasst: 17.03.2007 23:38
von ts-soft
Nur wie freak schrieb :mrgreen:

bitweise AND (&)

Tested ob das oder die Bits gesetzt sind, hier ein Beispiel, und zur Vertiefung
bitte in der Hilfe unter Variablen, Typen und Operatoren nachlesen
:wink:

Code: Alles auswählen

; #PB_Explorer_File       = 1 = %00000001 binär
; #PB_Explorer_Directory  = 2 = %00000010 binär
; #PB_Explorer_Selected   = 4 = %00000100 binär

a = #PB_Explorer_File | #PB_Explorer_Selected


If a & #PB_Explorer_File
  Debug "#PB_Explorer_File ist gesetzt"
Else
  Debug "#PB_Explorer_File ist nicht gesetzt"
EndIf

If a & #PB_Explorer_Directory
  Debug "#PB_Explorer_Directory ist gesetzt"
Else
  Debug "#PB_Explorer_Directory ist nicht gesetzt"
EndIf

If a & #PB_Explorer_Selected
  Debug "#PB_Explorer_Selected ist gesetzt"
Else
  Debug "#PB_Explorer_Selected ist nicht gesetzt"
EndIf

; Kombination prüfen:
If a & (#PB_Explorer_File | #PB_Explorer_Selected)
  Debug "#PB_Explorer_File, sowie #PB_Explorer_Selected ist gesetzt"
Else
  Debug "#PB_Explorer_File, sowie #PB_Explorer_Selected ist nicht gesetzt"
EndIf
Gruß
Thomas

Verfasst: 18.03.2007 09:56
von marco2007
...da werde ich wohl nichts dagegen sagen können. Für mich ist`s halt so leichter verständlich:

Code: Alles auswählen

Procedure Open_Window() 
  If OpenWindow(0, 216, 0, 200, 235, "Explorer",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
    If CreateGadgetList(WindowID(0)) 
      ExplorerListGadget(1, 20, 30, 165, 150, "",#PB_Explorer_MultiSelect ) 
     EndIf 
     If ButtonGadget(2,140,190,30,30,"ok") 
     EndIf 
  EndIf 
EndProcedure 

open_window() 
Repeat 
event=WaitWindowEvent() 
      Select Event 
      Case #PB_Event_Gadget 
        Select EventGadget() 
        Case 2 
            For i=0 To CountGadgetItems(1)-1 
              a=GetGadgetItemState(1, i) 
              If a=#PB_Explorer_File
                f$=GetGadgetItemText(1,i,0) 
                Debug "Dateiauflistung: " + f$
              EndIf 
              If a=#PB_Explorer_Directory
                O$=GetGadgetItemText(1,i,0) 
                Debug "Ordnerauflistung: " + O$
              EndIf 
              If a=#PB_Explorer_Selected + #PB_Explorer_File 
                file$=GetGadgetItemText(1,i,0) 
                Debug "********** Datei ausgewählt: " + file$ 
              EndIf
              If a=#PB_Explorer_Selected + #PB_Explorer_Directory
                dir$=GetGadgetItemText(1,i,0) 
                Debug "********** Ordner ausgewählt: " + dir$
              EndIf 
              Next i 
      EndSelect 
      EndSelect  
        
Until event=#PB_Event_CloseWindow

Verfasst: 18.03.2007 14:38
von Kaeru Gaman
VERGISS gleich und plus!

lerne bitweises AND, OR und NOT, oder lass es sein.

wenn du computer programmieren willst, gehört das zum elementaren handwerkszeug!

klar ist einfaches addieren leichter verständlich, wenn man grad einsteigt...

aber wenn du die bitweise logischen verknüpfungen erst einmal gelernt hast,
wird dich amüsieren, wenn andere mit additionen rumkrebsen....