Seite 1 von 2

BUG: Gadget Reihenfolge

Verfasst: 19.03.2005 01:46
von HCB
Hallo,

ich musste feststellen das, nachdem ich ein Programm von mir mit der aktuellen Version (win3.93) neu Kompiliert habe, die Gadget nicht mehr anklicken konnte, nach längeren probieren hab ich herausgefunden das es an dem ImageGadget im Hintergrund lag ...

Nehmen wir das Beispiel aus der PureArea:

Code: Alles auswählen

; www.purearea.net (Sourcecode collection by cnesm)
; Author:
; Date: 22. November 2003


;- Window Constants 
; 
#Window_0 = 0 

;- Gadget Constants 
; 
#Gadget_0 = 0 
#Gadget_1 = 1 

CreateImage(0 ,600,300) 
StartDrawing(ImageOutput()) 
  Box(0,0,600,300) 
  Circle(300,150,50,RGB(255,255,255)) 
StopDrawing() 
Procedure Open_Window_0() 
  If OpenWindow(#Window_0, 221, 0, 600, 300,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )") 
    If CreateGadgetList(WindowID()) 
      ImageGadget(#Gadget_0, 0, 0, 600, 300, UseImage(0)) 
      ButtonGadget(#Gadget_1, 200, 80, 200, 40, "Hintergrundbild abschalten") 
          
    EndIf 
  EndIf 
EndProcedure 


Open_Window_0() 

Repeat 
  Event = WaitWindowEvent() 
    If event=#PB_event_gadget 
      Select EventGadgetID() 
        Case #Gadget_1 
          If Hide=0 
            HideGadget(#Gadget_0,1) 
            SetGadgetText(#Gadget_1, "Hintergrundbild anschalten") 
            Hide=1 
          Else 
            HideGadget(#Gadget_0,0) 
            SetGadgetText(#Gadget_1, "Hintergrundbild abschalten") 
            Hide=0 
          EndIf 
      EndSelect 
    EndIf 
Until Event = #PB_EventCloseWindow 
End
; ExecutableFormat=Windows
; EnableXP
; EOF
Ich kann den "Hintergrundbild abschalten"-Knopf nicht mit der Maus anklicken!
Wenn ich aber die Reihenfolge von

Code: Alles auswählen

      ImageGadget(#Gadget_0, 0, 0, 600, 300, UseImage(0)) 
      ButtonGadget(#Gadget_1, 200, 80, 200, 40, "Hintergrundbild 
in

Code: Alles auswählen

      ButtonGadget(#Gadget_1, 200, 80, 200, 40, "Hintergrundbild 
      ImageGadget(#Gadget_0, 0, 0, 600, 300, UseImage(0)) 
abändere kann ich den Knopf drücken ... aber nicht unbedingt sehen, da er ja jetzt unter dem ImageGadget ist ...

Habt ihr das selbe Problem?

Ich benutze Win2000 mit PB v 3.93

Ciao,
HCB

PS: Was ist eigentlich mit der Mittleren Maustaste?!?! Die Sache hat doch langsam 'nen Bart ... wenn man die Mittlere Maustaste in einem Scrollbereich gedrückt hält kann man mit dem Mauszeiger frei Scrollen ... ist Standart unter Windows ... trotzdem werden PB Programme immernoch Beendet wenn man die Taste loslässt ... das nervt ... vorallem da man manchmal versehentlich drauf kommt ...

Verfasst: 19.03.2005 03:03
von THEEX
Das Verhalten des Buttons ist bei mir mit XP auch.

Verfasst: 19.03.2005 03:50
von ts-soft
Als dieser Beispiel-Code erstellt wurde, hatte das ImageGadget noch keine Ereignisse erzeugt, was sich inzwischen aber geändert hat. Hintergrundbild dem Window zuordnen, dann funktioniert der Button auch wie gewünscht. Beispiel-Code: http://forums.purebasic.com/german/viewtopic.php?t=2454

Verfasst: 20.03.2005 00:24
von HCB
Danke für den Tip :-) ... ändert aber leider nichts an der Tatsache das es ein Bug ist. Denn wenn der Button hinter den ImageGadget ist funktioniert er ja, wird dafür aber nicht unbedingt korreckt/immer angezeigt. Ist er jedoch vor dem ImageGadget wird er korreckt angezeigt, funktioniert aber nicht. :freak:
Ich schätze da stimmt was mit der internen Gadget-Reihenfolge überhaupt nicht ... ich hab erlich gesagt keine Lust auf ein Workaround ... es müsste ja funktionieren ... ;-)

Ciao,
HCB

Verfasst: 20.03.2005 00:31
von ts-soft
Ein ImageGadget ist als Container für andere Gadgets seit Version 3.93 nicht mehr geeignet. Das ist kein Bug
Gruß
Thomas

Verfasst: 20.03.2005 05:22
von HCB
Jetzt hab ich's kapiert ... nicht das ImageGadget ist das Problem sondern der Bug liegt in den Gadgets allgemein ... naja ... Bug ist Bug ... ;-)

Also zur Erläuterung:
Man hat zum Beispiel 3 überlappende Buttons, die werden dann in der richtigen Reihenfolge angezeigt, also der letzte als Oberster ... diese reagieren aber Falsch auf die Maus ... sprich in der selben Reihenfolge wie sie angezeigt werden, also reagiert der unterste Button zuerst ... das ist der Bug!

Damit's anschaulicher wird ein PB-Programm mit drei überlappenden Buttons:

Code: Alles auswählen

  If OpenWindow(0,0,0,222,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ButtonGadgets") And CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 100, 100, "Button 1")
    ButtonGadget(1, 50, 50, 100, 100, "Button 2")
    ButtonGadget(2, 90, 90, 100, 100, "Button 3")
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
Und zum Vergleich ein VB5-Programm mit drei überlappenden Buttons: http://www.hcb-server.de/privat/gadgetvb0.exe (Virengeprüft und auf DE-Domain ... also keine Sorge ... ;-) ... Falls VB-Runtime nötig: http://www.hallihallo.de/download.php?id=10 )

Der Unterschied ist offensichtlich ... also doch ein Bug ... :cry:

N8,
HCB

Verfasst: 20.03.2005 05:41
von ts-soft
>> 3 überlappende Buttons
Diese Aufgabenstellung ist mir noch nicht vorgekommen. Bei diesem Problem werde ich dir wohl nicht helfen können. :D

Verfasst: 20.03.2005 11:09
von bluejoke
Poste doch einen vollständigen, auf diesen Bug begränzten Code im englischen Bug-Forum.
Da wird darauf am schnellsten reagiert.

Verfasst: 20.03.2005 12:34
von Danilo
HCB hat geschrieben:Damit's anschaulicher wird ein PB-Programm mit drei überlappenden Buttons:

Code: Alles auswählen

  If OpenWindow(0,0,0,222,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ButtonGadgets") And CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 100, 100, "Button 1")
    ButtonGadget(1, 50, 50, 100, 100, "Button 2")
    ButtonGadget(2, 90, 90, 100, 100, "Button 3")
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
Hier mal ein Workaround für Buttons.

Löst natürlich nicht das eigentliche Problem in PB, aber man kann
zumindest sehen worum es geht.

Der zuletzt erstellte Button wird an vorderste Stelle gesetzt,
und dazu noch die 2 Flags #WS_CLIPSIBLINGS und #WS_CLIPCHILDREN
für das korrekte zeichnen.
Wobei in diesem Beispiel nur #WS_CLIPSIBLINGS relevant ist -
dadurch werden sich überlappende Ausschnitte beim zeichnen
des Controls ausgeblendet, wodurch die Darstellung danach
wieder korrekt ist.

Code: Alles auswählen

;
; Gadget order bug test for buttons, PB3.93
;
; by Danilo, 20th March 2005
;
Procedure ButtonGadget2_(ID,X,Y,W,H,TEXT$,FLAGS)

  CompilerIf #PB_Compiler_OS = #PB_OS_Windows

    ;
    ; Workaround for PB/Windows v3.93
    ;
    Gadget=ButtonGadget(ID,X,Y,W,H,TEXT$,#WS_CLIPSIBLINGS|#WS_CLIPCHILDREN|FLAGS)
    If Gadget
      If ID=#PB_ANY
        handle=GadgetID(Gadget)
      Else
        handle=Gadget
      EndIf
      SetWindowPos_(handle,#HWND_TOP,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
      ProcedureReturn Gadget
    EndIf

  CompilerElse

    ;
    ; other operating systems: no workaround needed
    ; (tested on linux, PB/Linux v3.92)
    ;
    ProcedureReturn ButtonGadget(ID,X,Y,W,H,TEXT$,FLAGS)

  CompilerEndIf
    
EndProcedure


Procedure ButtonGadget_(ID,X,Y,W,H,TEXT$)
  ProcedureReturn ButtonGadget2_(ID,X,Y,W,H,TEXT$,0)
EndProcedure



If OpenWindow(0,0,0,222,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ButtonGadgets")
  CreateGadgetList(WindowID())

  ButtonGadget_ (0,10, 10,100,100,"Button 1")
  ButtonGadget_ (1,50, 50,100,100,"Button 2")
  ButtonGadget_ (2,90, 90,100,100,"Button 3")

  ButtonGadget2_(3,10,210,100,100,"Button 4",#PB_Button_Toggle)
  ButtonGadget2_(4,50,250,100,100,"Button 5",#PB_Button_Toggle)
  ButtonGadget2_(5,90,290,100,100,"Button 6",#PB_Button_Toggle)

  Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Getestet auf Windows und Linux.

Auf Linux funktioniert es von Haus aus schon korrekt, so daß
ein Workaround nur auf Windows nötig ist.

Verfasst: 22.03.2005 23:59
von HCB
@bluejoke: Leider ist mein Englisch mehr als mieserabel ... :-(

@Danilo: Herzlichen Dank ... das Funktioniert super! Aber ein Problem habe ich noch ... ich würde das gern auf ein "PanelGadget" über einem "ImageGadget" anwenden ... und habe leider keine Ahnung wie ... beim "PanelGadget" kann man keine Flags angeben und wenn man's beim "ImageGadget" angibt ist es nicht vorhanden ... ich weis wirklich nicht mehr weiter ... bitte helft mir ... :roll:

Danke,
HCB