Seite 1 von 2

ComboBoxGadget verursacht SizeWindow-Event -> Warum?

Verfasst: 24.06.2009 16:55
von CNESM
Hallo,

da ich in meinen Programm das Event "#PB_Event_SizeWindow" abfrage, ist mir aufgefallen, das beim Erzeugen eines ComboboxGadget das Event"#PB_Event_SizeWindow" nach dem Start des Programms erzeugt wird. Warum ist das so?

Da ich zu Beginn alle notwendigen Objekt erstelle und dort einige Comboboxgadgets erstelle, flackert es ganz schön ...

Hier ein Beispielcode. Für jeden erstelles ComboboxGagdet wird einmal das Event "#PB_Event_SizeWindow" zusätzlich ausgeführt:

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window",#PB_Window_Invisible|#PB_Window_SystemMenu)

  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(1,50,10,70,21)
  ;;Erzeugt ein "SizeWindow" event
  ;ComboBoxGadget(7,50,10,70,21)
  ;;Erzeugt ein "SizeWindow" event
  ;ComboBoxGadget(8,50,10,70,21)
  ;;Erzeugt ein "SizeWindow" event
  ;ComboBoxGadget(9,50,10,70,21)

  ;Erzeugt KEIN "SizeWindow" event
  TextGadget(2,50,40,70,21,"...")
  
  ;Erzeugt KEIN "SizeWindow" event
  OptionGadget(3,50,70,70,21,"...")
  
  ;Erzeugt KEIN "SizeWindow" event
  ButtonGadget(4,50,130,70,21,"...")
  
  ;Erzeugt KEIN "SizeWindow" event
  HyperLinkGadget(5,50,160,70,21,"...",RGB(0,0,0))
  
  ;Erzeugt KEIN "SizeWindow" event
  StringGadget(6,50,190,70,21, "..")


  HideWindow(0, 0) 
  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow
      Quit = 1
      ElseIf Event=#PB_Event_SizeWindow
        Debug "Ausgeführt"
    EndIf

  Until Quit = 1
  
EndIf

End 

Verfasst: 24.06.2009 17:06
von ts-soft
Alle Controls erzeugen ein Size Event, ComboBox aber 2, weils aus
mehreren Elementen besteht. Flackern kann ich hier nicht festellen, aber ein
einfaches While WindowEvent() : Wend vorm anzeigen des Fensters sollte
genügen.

Verfasst: 24.06.2009 19:33
von CNESM
Hallo Thomas,
Alle Controls erzeugen ein Size Event, ComboBox aber 2, weils aus
mehreren Elementen besteht
So wie ich das sehe erzeugen folgende Controls nur zusammen ein Size Event,egal wie viele ich davon erstelle:

Code: Alles auswählen

TextGadget(2,50,40,70,21,"...")
OptionGadget(3,50,70,70,21,"...")
ButtonGadget(4,50,130,70,21,"...")
HyperLinkGadget(5,50,160,70,21,"...",RGB(0,0,0))
StringGadget(6,50,190,70,21, "..") 
Wobei hingegen jedes ComboBoxGadget jeweils ein Size Event auslöst. Somit lösen zwei ComboBoxGadget zwei Size Events aus, drei comboboxgadgets drei Size Events etc.

Dieser Code erzeugt bei mir genau ein Size Event, egal wieviele TextGadgets, StringGadgets usw. ich erstelle:

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window",#PB_Window_Invisible|#PB_Window_SystemMenu)

  ;;Erzeugt ein "SizeWindow" event
  ;ComboBoxGadget(1,50,10,70,21)
  ;;Erzeugt ein "SizeWindow" event
  ;ComboBoxGadget(7,50,10,70,21)
  ;;Erzeugt ein "SizeWindow" event
  ;ComboBoxGadget(8,50,10,70,21)
  ;;Erzeugt ein "SizeWindow" event
  ;ComboBoxGadget(9,50,10,70,21)

  ;Erzeugt KEIN "SizeWindow" event
  TextGadget(2,50,40,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  OptionGadget(3,50,70,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  ButtonGadget(4,50,130,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  HyperLinkGadget(5,50,160,70,21,"...",RGB(0,0,0))
 
  ;Erzeugt KEIN "SizeWindow" event
  StringGadget(6,50,190,70,21, "..")


  HideWindow(0, 0)
  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow
      Quit = 1
      ElseIf Event=#PB_Event_SizeWindow
        Debug "Ausgeführt"
    EndIf

  Until Quit = 1
 
EndIf

End 
Wobei hingegen folgender Code

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window",#PB_Window_Invisible|#PB_Window_SystemMenu)

  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(1,50,10,70,21)
  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(7,50,10,70,21)
  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(8,50,10,70,21)
  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(9,50,10,70,21)

  ;Erzeugt KEIN "SizeWindow" event
  TextGadget(2,50,40,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  OptionGadget(3,50,70,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  ButtonGadget(4,50,130,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  HyperLinkGadget(5,50,160,70,21,"...",RGB(0,0,0))
 
  ;Erzeugt KEIN "SizeWindow" event
  StringGadget(6,50,190,70,21, "..")


  HideWindow(0, 0)
  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow
      Quit = 1
      ElseIf Event=#PB_Event_SizeWindow
        Debug "Ausgeführt"
    EndIf

  Until Quit = 1
 
EndIf

End 
bei mir fünfmal das Size Event direkt hintereinander ausgeführt wird (1 normaler + 4 für jedes Comboboxgadget. Dies geschieht jedoch nur beim Programmstart, wo ich die Gadgets erstelle. Da ich aber circa 150 Comboboxgadgets erstelle wird Sizegadget zu beginn auch 151 mal ausgeführt. Das Flckern entsteht bei mir, weil ich mit dem Size Event sämtliche Controls resize.

Das profane Einfügen von While WindowEvent() : Wend hilft da aber auch nicht.

Gruß Florian

Verfasst: 24.06.2009 19:49
von Kaeru Gaman
>> Das profane Einfügen von While WindowEvent() : Wend hilft da aber auch nicht.

sollte es aber.

am besten:
- direkt nach dem erstellen das Fenster verstecken
- alle Gadgets erzeugen
- die Eventqueue spülen mit While WindowEvent() : Wend
- das Fenster sichtbar machen

und dann erst in die Hauptschleife.

Verfasst: 24.06.2009 21:19
von CNESM
Da ich vorhin nur kurz über VPN getestet hat, kann es auch an der misserablen Verbindung gelegen haben (Da kommt es öfters zu solchen Effekten). Ich werd das morgen nochmal live in der Firma testen.

Was bewirkt denn die Zeile While WindowEvent() : Wend ? bei mir kommen weiterhin alle Size events wie normal an, also gespült wird da nix :-D

Verfasst: 24.06.2009 21:21
von jojo1541
CNESM hat geschrieben:
Was bewirkt denn die Zeile While WindowEvent() : Wend ?
Das ist eine Schleife, die Events für dieses Fenster, also deine störenden Events, abarbeitet, solange Events für das Fenster ind der Warteschlange sind.

Verfasst: 24.06.2009 21:51
von Kaeru Gaman
... und weil es vor der eigentlichen Hauptschleife steht, werden nur die Events verarbeitet,
die beim Öffnen des Fensters und Erstellen der Gadgets erzeugt werden.

(Wait)WindowEvent() liefert dir nicht nur die Ereignisse, die du verarbeiten kannst,
sondern reicht auch die ans OS weiter, die dort gebraucht werden, wie z.B. Repaint.

sobald man das Fenster sieht, greift die normale Hauptschleife, und die Events können von deinem Programm gecheckt werden.

Verfasst: 24.06.2009 21:58
von CNESM
Verstanden, aber nach der Logik sollten somit ja einige der erzeugten Events ganricht in der Hauptschleife verarbeitet werden. Trotz geschieht dies weiterhin (Es wird 5 mal "Ausgeführt" debuggt)

Code: Alles auswählen


If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window",#PB_Window_Invisible|#PB_Window_SystemMenu)

  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(1,50,10,70,21)
  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(7,50,10,70,21)
  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(8,50,10,70,21)
  ;Erzeugt ein "SizeWindow" event
  ComboBoxGadget(9,50,10,70,21)

  ;Erzeugt KEIN "SizeWindow" event
  TextGadget(2,50,40,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  OptionGadget(3,50,70,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  ButtonGadget(4,50,130,70,21,"...")
 
  ;Erzeugt KEIN "SizeWindow" event
  HyperLinkGadget(5,50,160,70,21,"...",RGB(0,0,0))
 
  ;Erzeugt KEIN "SizeWindow" event
  StringGadget(6,50,190,70,21, "..")
  
  While WindowEvent() : Wend

  HideWindow(0, 0)
  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow
      Quit = 1
      ElseIf Event=#PB_Event_SizeWindow
        Debug "Ausgeführt"
    EndIf

  Until Quit = 1
 
EndIf

End

Verfasst: 24.06.2009 22:10
von Kaeru Gaman
ja, das ist allerdings werkwürdig.

wenn ich hinter das Hide noch mal ein EventFlush einsetze, bleiben immer noch vier übrig....

keine Ahnung, hab ich noch nie gesehen sowas.
hab aber auch noch keine ComboBoxen benutzt.

Verfasst: 24.06.2009 23:25
von hjbremer

Code: Alles auswählen

ElseIf Event=#PB_Event_SizeWindow 
        
         If windowflag = 0
            windowflag = 1
            Debug "Ausgeführt" 
            ;machirgendwas()
         EndIf