[PB 4.5] Fehler bei Indexierung / Aufzählung

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Renovatio

[PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von Renovatio »

Ich meine einen Fehler gefunden zu haben, sich bin ich mir nicht!
Ihr erhaltet ein Archiv, darin ist eine exe und einige PNG Dateien sowie die Bispiel-.pb Datei.

Kommentar ist ebenfalls in der Quellcode-Datei -> .pb

Fehler:
Bei der Debugausgabe nachdem man auf eines der Navigationspunkte klickt, oberhalb des Fensters, gibt der Debugger sowohl bei der Methode "Indexierung" (Gadgets mit Zahlen) als auch bei der Methode "Aufzählung" (Gadgets mit Konstanten) immer die gleiche EventGadget() ID.

Lösung:
Noch keine gefunden

Erste Ansätze:
Konstanten welche zuvor so hießen "#GadgetStart", "#GadgetVideos", ... wurden in "1", "2", ... umbenannt, jedoch ohne Erfolg!

Archiv:
PB 4.5 Fehler


Gruß
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von NicTheQuick »

Wieso steht

Code: Alles auswählen

If Event = #PB_Event_Gadget

			If EventGadget()

				Debug EventGadget()

			EndIf  

		EndIf

vor

Code: Alles auswählen

		Event = WaitWindowEvent()
? Das macht keinen Sinn. Außerdem brauchst du das 'If EventGadget()' nicht. Wenn die Gadget-ID nämlich 0 ist, dann gibt das 'Debug' nichts aus.

Wieso lagerst du die Initialisierung von globalen Variablen, von Enums und DataSections in einzelnen Procedures aus? Das macht vor allem bei Enum und DataSection keinen Sinn, weil diese schon initialisiert werden, ohne dass du die Procedure aufrufst.

Du hast einen merkwürdigen Stil deinen Code zu strukturieren.
Renovatio

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von Renovatio »

Weil ich irgendwann mal so angefangen bin mir alles schön zu unterteilen.
Um meine Technik mal zu optimieren, müsste ich was tun, die Enumeration zusammen mit DataSection in eine Proc?
Also erst Enumeration und dann DataSection in eine Procedure schreiben?

Du meinst ich kann statt eine globals() -procedure einfach sobald ich ein Wort Global haben möchte, gleich Global schreiben ohne diese vorher in eine seperate Proc zu schreiben?


Zurück zum Fehler, ist das jemanden aufgefallen oder liegt das wirklich an meine Art wie ich den Code aufbaue?
Denn in PB 4.3 hat das so alles wunderbar geklappt mit den Enumerations.


Gruß
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von c4s »

@Code-Strukturierung
Du kannst bzw. solltest auch die Faltungen (Einleiten mit ";{" am Anfang der Zeile, Beenden mit ";}") und Includes verwenden. Macros würden sich z.T. auch als Ersatz für Prozeduren anbieten.
Weil ich irgendwann mal so angefangen bin mir alles schön zu unterteilen.
Um meine Technik mal zu optimieren, müsste ich was tun, die Enumeration zusammen mit DataSection in eine Proc?
An deinem Satzbau solltest du auch nochmal feilen. <)
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Renovatio

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von Renovatio »

c4s hat geschrieben:@Code-Strukturierung
Du kannst bzw. solltest auch die Faltungen (Einleiten mit ";{" am Anfang der Zeile, Beenden mit ";}") und Includes verwenden. Macros würden sich z.T. auch als Ersatz für Prozeduren anbieten.
Weil ich irgendwann mal so angefangen bin mir alles schön zu unterteilen.
Um meine Technik mal zu optimieren, müsste ich was tun, die Enumeration zusammen mit DataSection in eine Proc?
An deinem Satzbau solltest du auch nochmal feilen. <)
Akzeptieren Du solltest die Bildung von Satz deiner Mitmenschen! :D

So, nun habe ich das mal selbst KOMPLETT OHNE Prozeduren getestet.
Funktioniert!

Wird irgendwie an meinen vielen Prozeduren liegen, wodran genau weiß ich allerdings nicht!
Merkwürdig ist auch das wenn ich mir mit "Debug #Constant" alle Konstanten anzeigen lasse, das die Enumeration richtig funktioniert.
Nur eben nicht wenn ich dann auf ein ImageGadget klicke, dann erhalte ich jedes verdammte mal diese völlig unterpriviligierte 21. xD


Gruß

//EDIT:

Ich habe so das Gefühl das PB 4.5 wirklich mehr Fehler hat als sein Vorgänger!

Funktionsfähiges Beispiel:

Code: Alles auswählen

;- Aufzählung der Konstanten
Enumeration
	#Window
	#Gadget1
	#Gadget2
EndEnumeration

;- Globale Variablen setzen
Global Event
Global Quit

;- Öffnen des Hauptfensters
OpenWindow(#Window, 25, 25, 800, 600, "Konstanten Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

ButtonGadget(#Gadget1, 5, 5, 100, 20, "Gadget 1")
StringGadget(#Gadget2, 5, 35, 100, 20, "Gadget 2")

Repeat
	
	Event = WaitWindowEvent()
	
	If Event = #PB_Event_Gadget
		Debug EventGadget()
	EndIf
	
Until Event = #PB_Event_CloseWindow
Wieso zeigt er beim anklicken von String Gadget zweimal den Wert der Konstante "'Gadget2" im Debugger an? Oo
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von Rings »

4.5.x hat einfach nur mehr Informationen:
Füge das mal ein

Code: Alles auswählen

Repeat
   
   Event = WaitWindowEvent()
   
   If Event = #PB_Event_Gadget
          NR=EventGadget()  
          Select EventType()
                 Case #PB_EventType_LeftClick        : Debug Str(NR) + ":Klick mit der linken Maustaste"
                 Case #PB_EventType_RightClick       : Debug Str(NR) + ":Klick mit der rechten Maustaste"
                 Case #PB_EventType_LeftDoubleClick  : Debug Str(NR) + ":Doppelklick mit der linken Maustaste"
                 Case #PB_EventType_RightDoubleClick : Debug Str(NR) + ":Doppelklick mit der rechten Maustaste"
                 Case  #PB_EventType_Focus           : Debug Str(NR) + ":Fokus erhalten"
                 Case #PB_EventType_LostFocus        : Debug Str(NR) + ":Fokus verloren"
                 Case #PB_EventType_Change           : Debug Str(NR) + ":Inhalt hat sich geändert"
                 Case #PB_EventType_DragStart        : Debug Str(NR) + ":Der Anwender versucht, eine Drag & Drop Operation zu starten"
  
                   
                 Default
                   Debug Str(NR) + ":unknown event"
               EndSelect


   EndIf
   
Until Event = #PB_Event_CloseWindow
Rings hat geschrieben:ziert sich nich beim zitieren
Renovatio

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von Renovatio »

Sry da muss ich widersprechen!
PB 4.5 hat zu deinem Beispiel nicht mehr Informationen, denn EventType war schon in der PB 4.3 vorhanden. ;)

Davon abgesehen habe ich immernoch für jedes Gadget eine Debug-Ausgabe von 21.
Renovatio

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von Renovatio »

Erstmal sorry für den DP, nur war mir zu blöd jedesmal mein Post zu editieren.

Fehler könnt ihr nun selbst testen mit einem Funktionsfähigen Beispiel:

Code: Alles auswählen

;{- Initiieren von Umgebungen und Plugins
InitSprite()
;}

;{- Aufzählung der Konstanten
Enumeration
	#Window
	#GadgetHead
	#GadgetNaviStart
	#GFXHead
	#GFXNavi
EndEnumeration
;}

;{- Bilder vorbereiten
CreateImage(#GFXHead,800,50)
StartDrawing(ImageOutput(#GFXHead))
	DrawingMode(#PB_2DDrawing_Default)
	Box(0,0,800,600,RGB(200,200,200))
StopDrawing()

CreateImage(#GFXNavi,50,50)
StartDrawing(ImageOutput(#GFXNavi))
	DrawingMode(#PB_2DDrawing_Default)
	Box(0,0,50,50,RGB(200,200,150))
StopDrawing()
;}

;{- Öffnen und Ausführen des Hauptfensters
OpenWindow(#Window, 25, 25, 800, 600, "Konstanten Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

ImageGadget(#GadgetHead, 0, 0, 800, 600, ImageID(#GFXHead))
ImageGadget(#GadgetNaviStart, 0, 50, 50, 50, ImageID(#GFXNavi))

Repeat
	
	Event = WaitWindowEvent()
	
	If Event = #PB_Event_Gadget
		Debug EventGadget()
	EndIf
	
Until Event = #PB_Event_CloseWindow
;}
Analyse:
Wenn ihr nun das zweite ImageGadget auf die Y Koordinate 0 setzt, was ich ja in meiner Anwendung vorhabe, dann bekomme ich jedesmal die gleiche EventGadget()-ID.

Begründung:
PureBasic ist es nicht möglich, soweit ich das sehe, mit ImageGadgets die übereinander positioniert sind, umzugehen!
In CascadingStyleSheets (Zum Beispiel bei einem Einsatz für Homepage-Navigationen) ist es möglich durch Index die Grafiken unabhängig reagieren zu lassen da diese sich "nicht wirklich" den selben Platz teilen durch die Index(-Trennung).

Lösung:
Mehrere ImageGadgets nicht an der selben Position erstellen.

Ist das eine Lösung?:
Nein!
Denn dann müsste ich für jeden Navigations-Punkt (jedes Icon) einen Schnitt in den Hintergrund machen und so tun als ob es ein Hintergrundbild gibt, welches in wirklichkeit mit in dem Navi-Icon gemalt ist.


Ist das nun ein Fehler in PureBasic 4.5?:
Das würde ich gern von EUCH wissen? :)


Gruß

Renovatio
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von NicTheQuick »

Das liegt nicht an PureBasic. Das liegt am Betriebssystem. Unter Ubuntu läuft das zum Beispiel alles genau so wie du es gerne hättest.

Fakt ist jedenfalls, dass das Übereinander-lagern von ImageGadgets noch nie eine gute Idee war und viele damit ihre Probleme hatten. Wieso nutzt du nicht ein großes 'ImageGadget', 'DrawImage' und eine einfach Funktion, die dir sagt, in welchen Bereich geklickt wurde?

Mittlerweile müsste man auch bestimmt das neue CanvasGadget dafür verwenden können. Ist aber nur eine Vermutung, weil ich damit noch nichts gemacht habe.
Renovatio

Re: [PB 4.5] Fehler bei Indexierung / Aufzählung

Beitrag von Renovatio »

NicTheQuick hat geschrieben:Wieso nutzt du nicht ein großes 'ImageGadget', 'DrawImage' und eine einfach Funktion, die dir sagt, in welchen Bereich geklickt wurde?
Würde für den Anfang teilweise funktionieren, so wüsste ich in welchen Bereich geklickt wurde, jedoch nicht welche GadgetID ausgelöst wurde.
NicTheQuick hat geschrieben:Mittlerweile müsste man auch bestimmt das neue CanvasGadget dafür verwenden können. Ist aber nur eine Vermutung, weil ich damit noch nichts gemacht habe.
Kenn ich nicht, dass CanvasGadget.
Antworten