ComboBoxGadget()

Für allgemeine Fragen zur Programmierung mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: ComboBoxGadget()

Beitrag von ccode_new »

Ok!
Passiert dieses Verhalten auch bei einem "normalen" Mauszeiger ohne spezielles Icon? (Standard-Mauszeiger)

Ich glaube Windows 11 hat z.Bsp. bestimmte Probleme (Bugs) bei Verwendung bestimmter Maus-Themen.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Re: ComboBoxGadget()

Beitrag von marco2007 »

Ich rate einfach mal.
Es dürfte sowas sein, oder?

Code: Alles auswählen

Procedure AlertThread(Parameter)

  Repeat
  If IsGadget(0)
    AddGadgetItem(0, -1, "Zeile "+Str(Date())) : 
    Delay(300)
  EndIf  
  ForEver

EndProcedure

If OpenWindow(0, 0, 0, 322, 250, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0, 8, 8, 306, 133)
  ComboBoxGadget(1, 20, 200, 100, 20)
  AddGadgetItem(1, -1, "add 1")
  AddGadgetItem(1, -1, "add 2")
  CreateThread(@AlertThread(), 0)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Mit 5.72 bleibt die Maus und ab 5.73 verschwindet sie (bei mir) ...
Windows 11 - PB 6.03 x64
_________________________________
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: ComboBoxGadget()

Beitrag von ccode_new »

Hi marco2007,

und jetzt kommt der "Standard-Mauszeiger" ins Spiel!

Code: Alles auswählen

Procedure AlertThread(Parameter)
 
  Repeat
    If IsGadget(0)
     
    AddGadgetItem(0, -1, "Zeile "+Str(Date()))
    
    SendMessage_(GadgetID(1), #WM_SETCURSOR, 0, 0)
    
    Delay(300)
  EndIf  
  ForEver

EndProcedure

If OpenWindow(0, 0, 0, 322, 250, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0, 8, 8, 306, 133)
  ComboBoxGadget(1, 20, 200, 100, 20)
  AddGadgetItem(1, -1, "add 1")
  AddGadgetItem(1, -1, "add 2")
  CreateThread(@AlertThread(), 0)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Komisch oder?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Re: ComboBoxGadget()

Beitrag von marco2007 »

Top, ccode_new! 🙌
Windows 11 - PB 6.03 x64
_________________________________
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: ComboBoxGadget()

Beitrag von ccode_new »

Danke!

Das Problem liegt auch nicht an der ComboBox, sondern an der Eventabarbeitung (simulative/automatische Texteingabe - Key_Down/UP-Event) des Edit-Controls (EditorGadget).

Das hier geht ja auch:

Code: Alles auswählen

Procedure AlertThread(Parameter)
 
  Repeat
    If IsGadget(0)
     
    AddGadgetItem(0, -1, "Zeile "+Str(Date()))
    
    Delay(300)
  EndIf  
  ForEver

EndProcedure

If OpenWindow(0, 0, 0, 322, 250, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ListViewGadget(0, 8, 8, 306, 133)
  
  ComboBoxGadget(1, 20, 200, 100, 20)
  
  AddGadgetItem(1, -1, "add 1")
  AddGadgetItem(1, -1, "add 2")
  CreateThread(@AlertThread(), 0)
  Repeat 
    
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
RAaBe
Beiträge: 80
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Re: ComboBoxGadget()

Beitrag von RAaBe »

Hallo,

am Mauszeiger liegt es nicht (getestet mit normalem Mauszeiger).

In diesem Abschnitt kommt das 'ADDGADGETITEM' vor:

Code: Alles auswählen

       If ConnectionID
          SEvent = NetworkClientEvent(ConnectionID)
          If SEvent
            Select SEvent
              Case #PB_NetworkEvent_Data
                ReceiveNetworkData(ConnectionID, *puffer, 1)
                byte = PeekB(*puffer)
                If byte = #CR
                  
                  If GetGadgetState(#button_ausgabe_autospeichern) = 1 And  einlesemodus.b = 1
                    If autospeichern_komplett = 1
                      ds.c      = ds.c + 1
                      ds$(ds.c) = FormatDate("%yyyy-%mm-%dd", Date()) + " " + FormatDate("%hh:%ii:%ss", Date()) + " " + text.s
                    Else
                      If FindString(text.s, "[!") Or (Right(text.s, 2) <> "|0" And Right(text_alt.s, 3) <> "INF") And (Right(text.s, 3) <> "INF" And Right(text_alt.s, 2) <> "|0") And (Right(text.s, 3) <> "INF" And Right(text_alt.s, 3) <> "INF")
                    ;Debug text.s  +" / " +text_alt.s
                        ds.c       = ds.c + 1
                        ds$(ds.c)  = FormatDate("%yyyy-%mm-%dd", Date()) + " " + FormatDate("%hh:%ii:%ss", Date()) + " " + text.s
                        text_alt.s = text.s
                      EndIf
                    EndIf
                  EndIf
                  
                  If GetMenuItemState(#MainMenu, #menu_datum) = 1 And GetMenuItemState(#MainMenu, #menu_uhrzeit) = 0
                    text2.s = FormatDate("%dd.%mm.%yyyy", Date()) + " " + text.s
                    
                  ElseIf GetMenuItemState(#MainMenu, #menu_datum) = 0 And GetMenuItemState(#MainMenu, #menu_uhrzeit) = 1
                    text2.s = FormatDate("%hh:%ii:%ss", Date()) + " " + text.s
                    
                  ElseIf GetMenuItemState(#MainMenu, #menu_datum) = 1 And GetMenuItemState(#MainMenu, #menu_uhrzeit) = 1
                    text2.s = FormatDate("%dd.%mm.%yyyy", Date()) + " " + FormatDate("%hh:%ii:%ss", Date()) + " " + text.s
                  Else
                    text2.s = text.s
                  EndIf
                  
                  If Len (text2.s) > 62
                    AddGadgetItem(#ausgabe, -1, Left(text2.s, 60) + "...")
                  Else
                    AddGadgetItem(#ausgabe, -1, text2.s)
                  EndIf
                  SendMessage_(GadgetID(#ausgabe), #EM_SCROLL, #SB_LINEDOWN, 0)
                  progressbar_ausgabe()
                  
                  If FindString(text.s, "[!")
                    anzahl_uz = anzahl_uz + CountString(text.s, "[!")
                    While FindString(text.s, "[!")
                      anfang_uz = FindString(text.s, "[!")
                      text_uz$  = Mid(text.s, anfang_uz, 6)
                      text.s    = ReplaceString(text.s, text_uz$, "")
                    Wend
                    StatusBarText(0, 1, "UZ: " + Str(anzahl_uz), #PB_StatusBar_Center)
                  EndIf
                  
                  If Mid(text.s, 3, 1) = "|" And Mid(text.s, 6, 1) = "|"
                    id$   = Left(text.s, 2)
                    id2$  = Mid(text.s, 4, 2)
                    If id2$ <> "99"
                      quit  = 1
                    Else
                      text.s = ""
                    EndIf
                  Else
                    text.s = ""
                    anzahl_uz + 1
                    StatusBarText(0, 1, "UZ: " + Str(anzahl_uz), #PB_StatusBar_Center)
                  EndIf
                  
                Else
                  If einlesemodus.b = 1
                    If byte <> #LF
                      If byte = 1
                        text.s = text.s + "[!SOH]"
                      ElseIf byte = 4
                        text.s = text.s + "[!EOT]"
                      ElseIf byte = 6
                        text.s = text.s + "[!ACK]"
                      ElseIf byte = 21
                        text.s = text.s + "[!NAK]"
                      ElseIf byte = 24
                        text.s = text.s + "[!CAN]"
                      ElseIf byte = 123
                        text.s = text.s + "[!FWU]"
                      ElseIf byte >= 32 And byte <= 126
                        text.s = text.s + Chr(Byte)
                      Else
                        text.s = text.s + "[!" + RSet(Str(Byte), 3, "0") + "]"
                      EndIf
                    EndIf
                  ElseIf einlesemodus.b = 4
                    If byte <> #LF
                      text.s = text.s + Chr(Byte)
                    EndIf
                  EndIf
                EndIf
            EndSelect
          EndIf
        EndIf
      EndIf
Selbst wenn ich die einzige API-Zeile auskommentiere, ändert sich nichts!

Reinhard
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: ComboBoxGadget()

Beitrag von ccode_new »

Es wurden anscheinend irgendwelche Dinge in Verbindung mit dem EditorGadget verändert.
In den Change-Auflistungen stehen auch ab Version 5.73 Änderungen im Zusammenhang mit den EditorGadget.

Da waren bestimmt die jetzt ersichtlichen negativen Seiteneffekte nicht bekannt.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: ComboBoxGadget()

Beitrag von HeX0R »

Du solltest das COM Handling in einen Thread auslagern!
Da Du immer nur EIN Byte aus der Queue zupfst (wieso machst Du das überhaupt so?), und ausserdem jede Menge neuer Events in dieser Prozedur verursachst, kommt WindowEvent() vermutlich gar nicht mehr schnell genug hinterher, um alle Events abzuarbeiten.
Dann kommt es zum Stau und merkwürdigen Effekten.
Setze doch mal zum Test ein

Code: Alles auswählen

While WindowEvent() : Wend
ans Ende Deines Codeauszugs, und Du wirst sehen, dass der Mauszeiger wieder angezeigt wird (zumindest gehe ich davon aus, ich kenne ja nur einen Bruchteil Deines Codes).
Aber selbst wenn nicht, ein Auslagern in einen Thread hilft garantiert!
Benutzeravatar
RAaBe
Beiträge: 80
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Re: ComboBoxGadget()

Beitrag von RAaBe »

Hallo,
das Einfügen von 'While WindowEvent() : Wend' hat leider nicht gebracht.

Das Einlesen von einzelnen Byte's rüht daher, da ich auch das #CR auswerten wollte.

Die Beispiele oben werde ich mal testen...

Reinhard
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: ComboBoxGadget()

Beitrag von HeX0R »

RAaBe hat geschrieben: 24.02.2023 14:25 Das Einlesen von einzelnen Byte's rüht daher, da ich auch das #CR auswerten wollte.
Ähm... der Zusammenhang erschliesst sich mir jetzt nicht wirklich.
Aber egal, wie gesagt, das ganze COM Zeug bremst das Windowhandling nur aus, ich habe noch nie(!) sowas ohne Threads umgesetzt.
Gleiches gilt für Netzwerkgeschichten.
Antworten