Setparent und Subclasses

Anfängerfragen zum Programmieren mit PureBasic.
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Setparent und Subclasses

Beitrag von Häns »

Hallo,

ich stehe im Moment total auf dem Schlauch...

Ich möchte (nur als Beispiel) ein ButtonGadget inklusive OptionGadget einsetzen, was mit Setparent_ auch funktioniert:

Code: Alles auswählen

Enumeration
  #Window_Auswahl
EndEnumeration

Enumeration
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #Button_5
  #Button_6
  #Option_13
  #Option_14
  #Option_15
  #Option_16
  #Option_17
  #Option_18
  #Option_19
  #Option_20
  #Option_21
  #Option_22
EndEnumeration

Define.l Event, EventWindow, EventGadget, EventType, EventMenu

Procedure OpenWindow_Auswahl()
  If OpenWindow(#Window_Auswahl, 514, 171, 615, 500, "Auswahl", #PB_Window_SystemMenu)
    ButtonGadget(#Button_1, 5, 5, 300, 100, "krank", #PB_Button_Toggle)
    ButtonGadget(#Button_2, 310, 5, 300, 100, "frei", #PB_Button_Toggle)
    ButtonGadget(#Button_3, 5, 110, 300, 100, "Urlaub", #PB_Button_Toggle)
    ButtonGadget(#Button_4, 310, 110, 300, 100, "Diensttausch", #PB_Button_Toggle)
    ButtonGadget(#Button_5, 5, 215, 300, 240, "geänderte Dienstzeit:"+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$, #PB_Button_Toggle|#PB_Button_MultiLine)
    ButtonGadget(#Button_6, 310, 215, 300, 240, "geänderte Tätigkeit:"+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$, #PB_Button_Toggle|#PB_Button_MultiLine)
    
    OptionGadget(#Option_13, 100, 70, 100, 35, "SAW")
    OptionGadget(#Option_14, 100, 100, 100, 35, "SVP")
    OptionGadget(#Option_15, 100, 130, 100, 35, "HAP")
    OptionGadget(#Option_16, 100, 160, 100, 35, "SKP")
    OptionGadget(#Option_17, 100, 190, 100, 35, "HAV")
    
    OptionGadget(#Option_18, 100, 70, 220, 35, "08:00 - 16:30 Uhr")
    OptionGadget(#Option_19, 100, 100, 220, 35, "10:00 - 18:00 Uhr")
    OptionGadget(#Option_20, 100, 130, 220, 35, "13:00 - 21:12 Uhr")
    OptionGadget(#Option_21, 100, 160, 220, 35, "16:00 - 00:12 Uhr")
    OptionGadget(#Option_22, 100, 190, 220, 35, "n.n.b. oder sonst.")
    
;-Einsatz Setparent mit OptionGadget und den letzten ButtonGadget:

    SetParent_(GadgetID(#Option_18),GadgetID(#Button_5))
    SetParent_(GadgetID(#Option_19),GadgetID(#Button_5))
    SetParent_(GadgetID(#Option_20),GadgetID(#Button_5))
    SetParent_(GadgetID(#Option_21),GadgetID(#Button_5))
    SetParent_(GadgetID(#Option_22),GadgetID(#Button_5))

    SetParent_(GadgetID(#Option_13),GadgetID(#Button_6))
    SetParent_(GadgetID(#Option_14),GadgetID(#Button_6))
    SetParent_(GadgetID(#Option_15),GadgetID(#Button_6))
    SetParent_(GadgetID(#Option_16),GadgetID(#Button_6))
    SetParent_(GadgetID(#Option_17),GadgetID(#Button_6))

  EndIf
EndProcedure

OpenWindow_Auswahl()

Repeat
  Event = WaitWindowEvent()
  Select Event

    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Button_1
      ElseIf EventGadget = #Button_2
      ElseIf EventGadget = #Button_3
      ElseIf EventGadget = #Button_4
      ElseIf EventGadget = #Button_5
      ElseIf EventGadget = #Button_6

;-hier funktioniert die gewünschte Reaktion wegen fehlender Subclasses nicht:

      ElseIf EventGadget = #Option_13
        Debug "Klick!"
        
      ElseIf EventGadget = #Option_14
      ElseIf EventGadget = #Option_15
      ElseIf EventGadget = #Option_16
      ElseIf EventGadget = #Option_17
      ElseIf EventGadget = #Option_18
      ElseIf EventGadget = #Option_19
      ElseIf EventGadget = #Option_20
      ElseIf EventGadget = #Option_21
      ElseIf EventGadget = #Option_22
      EndIf

    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_Auswahl
        CloseWindow(#Window_Auswahl)
        Break
      EndIf
  EndSelect
ForEver
Ich weiss, die Buttongadget 5 und 6 sehen nicht sexy aus, aber der Hintergrund dieser Gadget ist das nötige Bedienen am Touchscreen (vielleicht weisst einer eine elegantere Lösung :) ).

Doch wenn ich eine EventGadget-Abfrage starte (hier EventGadget = #Option_13), werden die Abfragen bei OptionGadget ignoriert. Grund sind die Parent- und Childclasses, wobei das übergeordnete Fenster kein EventGadget durchlässt. Ich müsste quasi "subclassen", doch hier hört mein Verständnis zum Thema Classes auf. :(

Meine Idee war dann der Einsatz mit UseGadgetList(), aber nach Ausprobieren und Recherche funktioniert sie nur bei WindowsID, nicht bei GadgetID (siehe englisches Forum).

Also, wieder zurück zum Subclasses, doch wie funktioniert sie? Kann mir einer helfen?

Häns
PB 5.6
Windows 7 Professional
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Setparent und Subclasses

Beitrag von Bisonte »

Warum du OptionGadgets auf einen Button setzt ist mir eigentlich ein Rätsel.

Aber wenn es so sein soll... es geht auch ohne "subclass" und SetParent_().

Die momentan aktuelle PB 5.60 hat ein CanvasGadget im Angebot, das auch als Container fungieren kann.
Da muss man zwar den Hintergrund selbst zeichnen, aber daraus kann man extrem "schicke" Sachen basteln.

Und ist zu allem Überfluss auch noch auf jedem OS zu gebrauchen ;)
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​​
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: Setparent und Subclasses

Beitrag von Häns »

Ich weiß, OptionGadget im ButtonGadget ist merkwürdig bzw. ungewöhnlich, aber ich möchte das als Beispiel nehmen, denn es geht um den Einsatz von Subclasses. Fred schrieb, dass grundsätzlich der Einsatz von setparent seitens Purebasic nicht unterstützt wird. CanvasGadget als Alternative hatte ich auch auf dem Schirm, aber es würde sich grafisch von den anderen Buttons unterscheiden, zumal die OptionGadget zu zeichnen schwierig für mich wäre. Oder habe ich da falsch verstanden?
PB 5.6
Windows 7 Professional
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Setparent und Subclasses

Beitrag von Bisonte »

Etwas falsch verstanden. Seit 5.60 kann das CanvasGadget wie ein Container benutzt werden.
Soll heissen : Erstelle ein Canvas mit dem Flag #PB_Canvas_Container, platziere andere Gadgets darin,
und beende das ganze mit CloseGadgetList().

Die Gadgets sind ganz normal ansprechbar... das einzige was man selbst zeichnen müsste, wäre der Hintergrund
und vielleicht noch einen Rahmen. Also keine Gadgets selbst zeichnen oder sowas.

Und da das Canvas ja jede Menge EventTypes beherbergt, sind die Möglichkeiten enorm.
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​​
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: Setparent und Subclasses

Beitrag von Häns »

Okay, schau mir mal an! Danke für den Tipp :allright: , diese Feature in 5.60 ist mir wohl entgangen... :)

Häns
PB 5.6
Windows 7 Professional
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: Setparent und Subclasses

Beitrag von Häns »

Hallo,

nachdem ich die neue Version installiert habe und mich mit CanvasGadget ausgiebig beschäftigt habe, komme ich wieder dahin, wo ich angefangen habe... :(

Ich kann zwar Gadget wie im Container einsetzen, aber sobald ein Gadget zum Child eines anderen wird, bleibt kein Weg am SetParent_ vorbei, und dann scheitert meine gewünschte Abfrage des Kind-Gadgets.

So wie ich bis jetzt verstanden habe, kann ein CanvasGadget viele Eventstypen beherrschen, aber nur, solange kein Gadgets in ein anderes intergriert ist.

Häns
PB 5.6
Windows 7 Professional
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Setparent und Subclasses

Beitrag von Bisonte »

Dann hast du irgendetwas am Code falsch...
Gadgets werden genauso abgefragt wie sonst. Es wird keine API gebraucht.

Zeige doch einmal was du da versucht hast.
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​​
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: Setparent und Subclasses

Beitrag von Häns »

Hier mein Code, nochmal vereinfacht zur Veranschaulichung:

Code: Alles auswählen

Enumeration
  #Window_Auswahl
EndEnumeration

Enumeration
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #Button_5
  #Option_1
  #Option_2
  #Option_3
  #Option_4
  #Option_5
  #Canvas_1
EndEnumeration

Define.l Event, EventWindow, EventGadget, EventType, EventMenu

Procedure OpenWindow_Auswahl()
  If OpenWindow(#Window_Auswahl, 514, 171, 615, 500, "Auswahl", #PB_Window_SystemMenu)
    
    ButtonGadget(#Button_1, 5, 5, 300, 100, "krank", #PB_Button_Toggle)
    ButtonGadget(#Button_2, 310, 5, 300, 100, "frei", #PB_Button_Toggle)
    ButtonGadget(#Button_3, 5, 110, 300, 100, "Urlaub", #PB_Button_Toggle)
    ButtonGadget(#Button_4, 310, 110, 300, 100, "Diensttausch", #PB_Button_Toggle)
    
    ;-Einbau CanvasGadgetals Container als Ersatz für setparent?
    CanvasGadget(#Canvas_1, 5, 215, 610, 240, #PB_Canvas_Container)
    
    ButtonGadget(#Button_5, 5, 5, 600, 230, "geänderte Dienstzeit:"+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$+#CRLF$, #PB_Button_Toggle|#PB_Button_MultiLine)

    OptionGadget(#Option_1, 250, 70, 100, 35, "SAW")
    OptionGadget(#Option_2, 250, 100, 100, 35, "SVP")
    OptionGadget(#Option_3, 250, 130, 100, 35, "HAP")
    OptionGadget(#Option_4, 250, 160, 100, 35, "SKP")
    OptionGadget(#Option_5, 250, 190, 100, 35, "HAV")
   
    CloseGadgetList()
   
;-Einsatz Setparent mit OptionGadget und ButtonGadget wäre hier gewünscht:
; 
;     SetParent_(GadgetID(#Option_1),GadgetID(#Button_5))
;     SetParent_(GadgetID(#Option_2),GadgetID(#Button_5))
;     SetParent_(GadgetID(#Option_3),GadgetID(#Button_5))
;     SetParent_(GadgetID(#Option_4),GadgetID(#Button_5))
;     SetParent_(GadgetID(#Option_5),GadgetID(#Button_5))

  EndIf
EndProcedure

OpenWindow_Auswahl()

Repeat
  Event = WaitWindowEvent()
  Select Event

    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Button_1
      ElseIf EventGadget = #Button_2
      ElseIf EventGadget = #Button_3
      ElseIf EventGadget = #Button_4
      ElseIf EventGadget = #Button_5

;-hier funktioniert die gewünschte Reaktion wegen fehlender Subclasses nicht:
      ElseIf EventGadget = #Option_1
        Debug "Klick!"
       
      EndIf

    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_Auswahl
        CloseWindow(#Window_Auswahl)
        Break
      EndIf
  EndSelect
ForEver
Es werden die OptionGadget solange angezeigt, bis die Maus über den Button gefahren wird.
Wenn der Blockkommentar zwischen Zeile 44 bis 48 entfernt wird, sieht die Sache so aus, wie ich es haben wollte, nur ohne mögliche Abfrage der OptionGadget.

Dankesgruß,
Häns
PB 5.6
Windows 7 Professional
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Setparent und Subclasses

Beitrag von Bisonte »

Ok ich seh schon. Du hast den Button so gross gemacht, das er das gesamte Canvas ausfüllt und die Optionsgadgets überdeckt.
Das ist der Haken.
Das Canvas selbst ist schon dein "Button 5".
Also reicht es ein Text reinzumalen, oder dein Textgadget an die Stelle zu setzen wo jetzt "geänderte Dienstzeit:" steht.
Allerdings muss man sich jetzt selber um die Farben kümmern.
Soll heissen, die Hintergrundfarbe der OptionGadgets() und des Buttons(jetzt das Canvas) muss man selber setzen und Zeichnen)
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​​
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: Setparent und Subclasses

Beitrag von Häns »

Hallo Bisonte,

wie meine Signatur schon aussagt, war es gut, darüber zu schreiben, so dass ich mich damit abgefunden habe und mir eine andere Vorgangsweise ausgedacht habe. Manchmal beisst man sich an einer Sache so fest, dass es gut ist, wenn man das ganze über Bord wirft und einen anderen Weg nimmt.
Nochmals Danke für Deine Mühe!

Gruß, Häns
PB 5.6
Windows 7 Professional
Antworten