Mehrere '#Gadget' Parameter in Schleife änderbar?

Anfängerfragen zum Programmieren mit PureBasic.
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Mehrere '#Gadget' Parameter in Schleife änderbar?

Beitrag von AddMe »

Hallo Zusammen,

leider kann ich nichts in der Hilfe oder hier im Board zu folgender Frage finden:

Wie kann ich, für mehrere TextGadgets bzw. StringGadgets, die Hintergrundfarbe ändern?

Folgenden Code benutze ich für das Ändern:

Code: Alles auswählen

SetGadgetColor(#TxtGad07, #PB_Gadget_BackColor, RGB($99,$33,$33))
Nun habe ich mehrere TextGadgets.
Wie kann ich die in einer Schleife hintereinander ändern, ohne, dass
ich den Befehl x- mal schreiben muss.

Ich weis nicht wie ich den '#Gadget' Parameter in einer Schleife ersetzen kann für das nächste Gadget.

Kann man auch herausbekommen, welche TextGadgets man in einem Fenster hat, wenn man mehrere Fenster benutzt?

Ich hoffe ich konnte es verständlich erklären, was ich meine.

Wäre toll, wenn mir jemand helfen könnte.

Vielen Dank.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Mit konstanten dürfte es eher schwer gehen.
Ein vorschlag wäre, die Textgadgets in der Enumeration alle hintereinander zu setzen und dann via

Code: Alles auswählen

For x = (Dein erstes Textgadget) to (dein letztes Textgadget)
  SetGadgetColor(x, #PB_Gadget_BackColor, RGB($99,$33,$33))
Next
zu ändern. (Eine Enumeration ist eine Aufzählung der Konstanten, die bei Null beginnt.)

Code: Alles auswählen

Enumeration
  #tach   ; ist 0
  #hallo  ; ist 1
  #hi     ; ist 2
  #servus ; ist 3
EndEnumeration
Ich hoffe ich konnte dir helfen. :wink:

Edit: Achso zu deiner zweite Frage: Nativ gibt es in PB keinen Befehl dafür, aber eventuell einen API-Befehl.(Da musst du aber leider jemand anders fragen, damit kenn ich mich nich so aus.) Aber durch den Quellcode weißt du doch eigentlich sowieso, wie viele Textgadgets du auf ein Window pflanzt.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Beitrag von AddMe »

Hallo volti,
volti hat geschrieben:Ich hoffe ich konnte dir helfen. :wink:
vielen Dank für Deine Antwort.

Hat auf Anhieb geklappt. :allright:

Echt klasse. Danke Dir.

Gruß
Michael
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Eine ähnliche Möglichkeit, die ich gerne Verwende ist folgende:

Code: Alles auswählen

Enumeration
  #GadMin
  
  #Gad1
  #Gad2
  #Gad3
  
  #GadMax
EndEnumeration

For x = #GadMin+1 to #GadMax-1
  ;kot
Next
Der Vorteil is das man noch Gadgets logisch geordnet hinzufügen kann ohne an den Schleifen rumzuschrauben, der kleine Nachteil is das man je zwei "GadgetSlots" verschwendet (was wohl nich so ins Gewicht fallen dürfte)
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

noch eine möglichkeit wäre, die Gadgets Dynamisch zu erzeugen...

Code: Alles auswählen

Dim ButtonRow.i(Anz)
For n=0 to Anz
  ButtonRow(n) = ButtonGadget( #PB_Any, 16, 16 + 32 * n, 120, 24, "Button Nr. " + Str(n) )
Next
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
AddMe
Beiträge: 46
Registriert: 04.05.2009 23:24

Beitrag von AddMe »

Hallo KeyKon,
hallo Kaeru Gaman,

vielen Dank für Eure Antworten. :allright:

Werde auch eure Möglichkeiten ausprobieren.

Gruß
Michael
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

KeyKon hat geschrieben:Enumeration
#GadMin

#Gad1
#Gad2
#Gad3

#GadMax
EndEnumeration

For x = #GadMin+1 to #GadMax-1
;kot
Next
KeyKon hat geschrieben:..., der kleine Nachteil is das man je zwei "GadgetSlots" verschwendet...
#GadMin und #GadMax lassen sich auch ganz einsparen, wenn man hinter EndNumeration die Anzahl Einträge über die PB-Konstante #PB_Compiler_EnumerationValue ermittelt: :wink:

Code: Alles auswählen

Enumeration
  #Gad1
  #Gad2
  #Gad3
EndEnumeration

#NumTextGadgets = #PB_Compiler_EnumerationValue

For x = 0 to #NumTextGadgets - 1
  ; Code
Next x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ist das dann nicht das selbe wie das folgende?

Code: Alles auswählen

Enumeration
  #Gad1
  #Gad2
  #Gad3
  #NumTextGadgets
EndEnumeration

For x = 0 to #NumTextGadgets - 1
  ; Code
Next x 
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

NicTheQuick hat geschrieben:Ist das dann nicht das selbe wie das folgende?
So könnte man es natürlich auch machen. Ich finde meine Methode allerdings insofern besser, daß man später nachträglich Elemente der Enumeration hinzufügen kann, ohne daran zu denken, daß #NumTextGadgets am Ende stehen muß. Außerdem ist #NumTextGadgets entweder keine ID für ein reales TextGadget innerhalb der Enumeration oder ein unlogischer Name für ein vorhandenes TextGadget...
Bei meiner Methode muß man allerdings beachten, daß die Zuweisung für #NumTextGadgets immer hinter EndEnumeration stehen bleibt und nicht noch zusätzliche Enumerationen dazwischen eingefügt werden dürfen.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Vielleicht hilft dir das ! Diese Version setzt voraus das alle Windows und Gadgets eine Nummer via Enumeration erhalten haben.

GetParent ermittelt die WindowID, zu dem ein Gadget gehört. Der Rest steht in der PB Hilfe.

Code: Alles auswählen

Enumeration
 #win1: #win2
 #but1: #but2: #but3: #but4
 #txt1: #txt2: #txt3: #txt4
 #txt5: #txt6: #txt7: #txt8
EndEnumeration

Procedure SetGadgetBackColor(window, gadgettyp, backcolor)
hwnd = WindowID(window)

For j = 0 To #PB_Compiler_EnumerationValue 
    If IsGadget(j)
       If GetParent_(GadgetID(j)) = hwnd  ;GetParent ermittelt Fenster
          If GadgetType(j) = gadgettyp
             SetGadgetColor(j, #PB_Gadget_BackColor, backcolor)
          EndIf
       EndIf
    EndIf
Next

EndProcedure

flag = #PB_Window_SystemMenu
OpenWindow(#win1,10,200,400,200,"Fenster 1",flag) 
       
       ButtonGadget(#but1,5, 5,199,24,"Fenster 1 auf rot")
       ButtonGadget(#but2,5,35,199,24,"Fenster 1 auf blau")
       ButtonGadget(#but3,5,65,199,24,"Fenster 2 auf grau")
       ButtonGadget(#but4,5,95,199,24,"Fenster 2 auf grün")

       TextGadget(#txt1,  5,165,44,24,"Text")
       TextGadget(#txt4, 55,165,44,24,"Murks")
       TextGadget(#txt6,105,165,44,24,"Murks")
       TextGadget(#txt7,155,165,44,24,"Murks")

flag = #PB_Window_SystemMenu
OpenWindow(#win2,450,200,400,200,"Fenster 2",flag) 
       
       TextGadget(#txt2,5,165,44,24,"Text")
       TextGadget(#txt3,55,165,44,24,"Murks")
       TextGadget(#txt5,105,165,44,24,"Murks")
       TextGadget(#txt8,155,165,44,24,"Murks")
       
Repeat: event = WaitWindowEvent() : ;Debug event
                
     If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu 
              
        welcherButton = EventGadget()  
                      
        Select welcherButton
          Case #but1: SetGadgetBackColor(#win1,#PB_GadgetType_Text,#Red)
          Case #but2: SetGadgetBackColor(#win1,#PB_GadgetType_Text,#Blue)
          Case #but3: SetGadgetBackColor(#win2,#PB_GadgetType_Text,#Gray)
          Case #but4: SetGadgetBackColor(#win2,#PB_GadgetType_Text,#Green)
        EndSelect
                
     EndIf

Until event = #PB_Event_CloseWindow 
End       
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