Bug in CountGadgetItems ??

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Bug in CountGadgetItems ??

Beitrag 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:
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Also, ich kann kein Fehler entdecken. Bei mir zählt er richtig. Auch bei mehrfachen Selektieren.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Argh... Bestimmt ein fehler in der 2.00, naja man kann ja auch mal die neue nehmen ^^ xD *login* ... *lad*
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 ?
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag 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:
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag 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
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag 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....
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag 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
Windows 11 - PB 6.03 x64
_________________________________
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten