Event und/oder EventType Unterdrücken ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Event und/oder EventType Unterdrücken ?

Beitrag von Bisonte »

Guter Einwand Code Commander :mrgreen:

Allerdings plane ich das ganze auch zu veröffentlichen, und du weisst auch,
dass man sowas dann beinahe absolut narrensicher machen muss... :?

Da ich alles bisher schön mit den nativen PB Funktionen steuern kann, wie SetGadgetColor usw.
wäre das natürlich umso besser, wenn man das ganze auch noch mit der eigenen Nummerierung
oder per #PB_Any hinhauen würde.

@Sicro : Es ist eigentlich nicht das Problem eine Zahl zu finden. Es ist das Problem eine Zahl zu finden,
die NICHT von PB für die GadgetNummerierung genutzt wird. Man stelle sich vor, eine umfangreiche Maske
mit mehr als 100 Gadgets und dann knallt es mit merkwürdigen Fehlern, weil PB die gleichen Nummern erwischt hat
wie die Zahlenspielerei.... Darum gehts.

Deswegen wäre das unterdrücken der restlichen EventTypes für ein Canvasgadget die bessere Wahl, dachte ich mir.
Eventuell über den Callback, wobei danach bestimmt noch ein weiterer Callback kommt... oder ist der GadgetCallback
in der VT vom PB SDK der letzte oder gar der einzige, den das Gadget hat.... bzw. werden dann komplett alle Funktionen
des Gadgets ausgehebelt... wenn ich den ersetze ?
An den hab ich mich noch nicht rangewagt....
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Event und/oder EventType Unterdrücken ?

Beitrag von Sicro »

Bisonte hat geschrieben:@Sicro : Es ist eigentlich nicht das Problem eine Zahl zu finden. Es ist das Problem eine Zahl zu finden,
die NICHT von PB für die GadgetNummerierung genutzt wird.
Ja, stimmt. :coderselixir:
Im folgenden Code wird die Problematik nun gelöst, indem echte Gadgets anstatt virtuelle Gadgets erstellt und diese unsichtbar geschaltet werden. Der aktuelle Status kann jetzt per GetGadgetState() ermittelt werden.

Code: Alles auswählen

Enumeration Gadget
  #MyOwnCheckbox_1
  #MyOwnCheckbox_2
  #MyOwnCheckbox_5
EndEnumeration

Structure CanvasGadgetStruc
  Checkbox.i
EndStructure

Global.CanvasGadgetStruc NewMap CanvasGadgets()

Procedure CanvasGadgetEventHandler()
  Protected MouseX = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseX)
  Protected MouseY = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseY)
  
  ; Ist der Mauszeiger innerhalb der Checkbox?
  If MouseX > 4 And MouseX < 26 And MouseY > 4 And MouseY < 26
    ;SetGadgetData(EventGadget(), Bool(Not GetGadgetData(EventGadget())))
    SetGadgetState(CanvasGadgets(Str(EventGadget()))\Checkbox, Bool(Not GetGadgetState(CanvasGadgets(Str(EventGadget()))\Checkbox)))
    If StartDrawing(CanvasOutput(EventGadget()))
      Box(5, 5, 20, 20)
      FrontColor(#Black)
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(5, 5, 20, 20)
      If GetGadgetData(EventGadget())
        ; Zeichne ein Kreuz in die Checkbox
        LineXY(5, 5, 25, 25)
        LineXY(25, 5, 5, 25)
      EndIf
      StopDrawing()
    EndIf
    
    ; Sende Klick-Event der virtuellen Checkbox
    ;PostEvent(#PB_Event_Gadget, EventWindow(), CanvasGadgets(Str(EventGadget()))\Checkbox, 0, GetGadgetData(EventGadget()))
    PostEvent(#PB_Event_Gadget, EventWindow(), CanvasGadgets(Str(EventGadget()))\Checkbox)
  EndIf
EndProcedure

Procedure.i CreateMyOwnCheckbox(Gadget, x, y, Text$)
  Protected Result
  
  If AddMapElement(CanvasGadgets(), Str(CanvasGadget(#PB_Any, x, y, 200, 30)))
    BindGadgetEvent(Val(MapKey(CanvasGadgets())), @CanvasGadgetEventHandler(), #PB_EventType_LeftClick)
    
    ; Zeichne Checkbox
    If StartDrawing(CanvasOutput(Val(MapKey(CanvasGadgets()))))
      FrontColor(#Black)
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(5, 5, 20, 20)
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(30, 5, Text$)
      StopDrawing()
    EndIf
    
    Result = CheckBoxGadget(Gadget, 0, 0, 10, 10, "")
    If Gadget = #PB_Any : Gadget = Result : EndIf
    HideGadget(Gadget, #True)
    CanvasGadgets()\Checkbox = Gadget
  EndIf
  
  ProcedureReturn Gadget
EndProcedure

If OpenWindow(0, 0, 0, 220, 220, "Canvas example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateMyOwnCheckbox(#MyOwnCheckbox_1, 10, 10, "Checkbox 1")
  CreateMyOwnCheckbox(#MyOwnCheckbox_2, 10, 50, "Checkbox 2")
  Define MyOwnCheckbox_3 = CreateMyOwnCheckbox(#PB_Any, 10, 90, "Checkbox 3")
  Define MyOwnCheckbox_4 = CreateMyOwnCheckbox(#PB_Any, 10, 130, "Checkbox 4")
  CreateMyOwnCheckbox(#MyOwnCheckbox_5, 10, 170, "Checkbox 5")
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case #MyOwnCheckbox_1 : Debug "Checkbox 1 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case #MyOwnCheckbox_2 : Debug "Checkbox 2 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case MyOwnCheckbox_3  : Debug "Checkbox 3 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case MyOwnCheckbox_4  : Debug "Checkbox 4 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
        Case #MyOwnCheckbox_5 : Debug "Checkbox 5 ("+ Str(EventGadget()) +") wurde angeklickt -- Wert: " + GetGadgetState(EventGadget()) ;EventData()
      EndSelect
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
Mit den PB-internen Funktionen habe ich mich noch nicht beschäftigt.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Event und/oder EventType Unterdrücken ?

Beitrag von mk-soft »

Mit PB-Internen funktionen habe ich es für Windows und Linux am laufen.
Nur MacOS bekomme ich es nicht hin. Die SDK für Mac gibt es jetzt auch. Steige da aber nicht hinter wie es geht...

http://www.purebasic.fr/german/viewtopi ... =8&t=27851
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Event und/oder EventType Unterdrücken ?

Beitrag von Bisonte »

@Sicro: Das ist eine Idee. Es wird zwar alles doppelt, aber das bisschen Speicherverlust kann man verschmerzen. :allright:

@mk-soft:
Genauso hab ich das ganze aufgebaut und erweitert. Bei Mac hab ich auch nix hinbekommen. Aber wenn ich
mir das SDK vom Mac so anschaue, sieht das aus wie OOP... das ist eh nicht meine Welt ;)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Event und/oder EventType Unterdrücken ?

Beitrag von mk-soft »

Bin auch kein fan mehr davon intern die VT zu verbiegen. Sollte sich mal intern etwas ändern funktioniert alles nicht mehr.

OOP finde ich manchmal aber sinnvoll da die Daten immer an den Objekt gebunden sind.
Siehe Beispiel ButtonColorGadget. Link http://www.purebasic.fr/german/viewtopi ... =8&t=28903

Ich selber arbeite auch gerne mit Maps um die zurückgegebene ID zu verwalten. Muss aber jedesmal erst in eine String gewandelt werden.
Dazu hatte ich heute Morgen eine Idee. Der Integer ist bei x86 immer vier byte lang und bei x64 immer acht Byte lang.
Diesen kann man auch direkt als String betrachten und als MapKey übergeben. Muss ja nicht als Mensch leserlich sein.

Mache dafür mal einen neuen Thread auf...

Link http://www.purebasic.fr/german/viewtopi ... =8&t=30065
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten