ComboBoxGadget verursacht SizeWindow-Event -> Warum?

Anfängerfragen zum Programmieren mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

ComboBoxGadget verursacht SizeWindow-Event -> Warum?

Beitrag 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 
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 »

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.
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
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Code: Alles auswählen

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

Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten