Seite 1 von 2
Gadgets in Schleifen
Verfasst: 18.12.2020 00:35
von TWELVE
Hallo zusammen,
ich habe bei einem aktuellen Projekt leider eine große Anzahl an Button Gadgets ( 64) und suche die Verarbeitung dieser zu vereinfachen.
Die Buttons sind eine Matrix 8x8, das kann man gut mit einer Tastatur vergleichen.
Meine Frage ist, wie ich die Gadgets ( Buttons) in z.B. Loops effizient adressieren kann.
Beispiel:
64 Toogle Buttons sollen in einem Loop auf nicht gedrückt zurückgesetzt werden.
Die Buttons sind im Formdesigner mit Variablennamen Button_0 bis Button_63 definiert.
x steht für Button_x.
Code: Alles auswählen
Procedure ResetButtons()
x=63
For x = 0 To 63
SetGadgetState(x,0)
Next
EndProcedure
Natürlich könnte ich 64 mal den gleichen Code kopieren, aber das ist nicht das, was ich möchte. Ich möchte das in einer kurzen Loop erledigen.
Grüße,
TWELVE
Re: Gadgets in Schleifen
Verfasst: 18.12.2020 01:17
von mk-soft
Wenn du Konstanten beim FormDesigner verwendest (also nicht variablen) und die Buttons hintereinander liegen,
Kannst du auch eine For Next schleife nehmen.
Re: Gadgets in Schleifen
Verfasst: 18.12.2020 01:39
von ccode_new
Hallo TWELVE,
halte dich an mk-soft, oder erstelle doch einfach ein Array und lösche die 64 erstellten Konstanten.
Code: Alles auswählen
#MAX_BUTTON_COUNT = (8*8)-1
#BUTTON_OFFSET = 5
Global Dim Button.i(#MAX_BUTTON_COUNT) ;Button_Array
Procedure Fenstergroesse_anpassen()
Protected.i x=0, y=0, i=0
For i=0 To #MAX_BUTTON_COUNT
ResizeGadget(Button(i), x, y, (WindowWidth(0)/8)-#BUTTON_OFFSET, (WindowHeight(0)/8)-#BUTTON_OFFSET)
x + GadgetWidth(Button(i)) + #BUTTON_OFFSET
If i%8 = 7
x = 0
y + GadgetHeight(Button(i)) + #BUTTON_OFFSET
EndIf
Next
EndProcedure
If OpenWindow(0, 0, 0, 640, 480, "Button Matrix", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
For i=0 To #MAX_BUTTON_COUNT
Button(i) = ButtonGadget(#PB_Any, x, y, (WindowWidth(0)/8)-#BUTTON_OFFSET, (WindowHeight(0)/8)-#BUTTON_OFFSET, "?")
x + GadgetWidth(Button(i)) + #BUTTON_OFFSET
If i%8 = 7
x = 0
y + GadgetHeight(Button(i)) + #BUTTON_OFFSET
EndIf
Next
BindEvent(#PB_Event_Repaint, @Fenstergroesse_anpassen())
Repeat:Until WindowEvent()=#PB_Event_CloseWindow
EndIf
Re: Gadgets in Schleifen
Verfasst: 18.12.2020 11:22
von TWELVE
mk-soft hat geschrieben:Wenn du Konstanten beim FormDesigner verwendest (also nicht variablen) und die Buttons hintereinander liegen,
Kannst du auch eine For Next schleife nehmen.
Danke.Ich stehe aber auf dem Schlauch.
Meinst Du so ?
Code: Alles auswählen
For x = #button_0 To #button_63
SetGadgetState(x,0)
Next
Re: Gadgets in Schleifen
Verfasst: 18.12.2020 11:37
von Bisonte
TWELVE hat geschrieben:
Meinst Du so ?
Code: Alles auswählen
For x = #button_0 To #button_63
SetGadgetState(x,0)
Next
Wenn du deine Buttons so
Code: Alles auswählen
Enumeration
#TotalAnderes_Gadget
; Buttons für Matrix
#button_0
#button_1
#button_2
....
#button_61
#button_62
#button_63
; Ende Button für Matrix
#anderes_Gadget
EndEnumeration
durch "enumeriert" hast, dann meint er es so

Re: Gadgets in Schleifen
Verfasst: 18.12.2020 12:34
von TWELVE
Formdesigner legt die Enumeration selber an, wenn man #PB_Any abwählt.
Nur leider ist die Liste vom höchsten Button zum niedrigsten, also verkehrt herum sortiert.
Es spielt auch keine Rolle, in welche Reihenfolge ich die Buttons editiere.
Enumeration FormGadget
#Button_2
#Button_1
#Button_0
EndEnumeration
Button_0 müßte Null haben.Deswegen hat meine Logik nicht funktioniert.
Wie kann man das korrigieren ?
Da der Formdesigner die Enumeration schon anlegt, kann ich das im Code dann nicht mehr ändern.
Und eigentlich möchte ich ja, dass es aus dem Formdesigner heraus funktioniert.
Mit Step -1 in dem Loop geht es zwar auch, aber ich verstehe nicht, warum die Reihenfolge in der Enumeration so ist.
Re: Gadgets in Schleifen
Verfasst: 18.12.2020 13:31
von Bisonte
wenn du allen Buttons den State 0 verpassen möchtest ist die Reihenfolge egal, sie müssen nur von nummer 0-63 nummeriert sein.
in dem Enumeration Block also hintereinander ! Kein anderes Gadget dazwischen !
Aber nun erkennst Du, wie eingeschränkt man mit diesem Werkzeug ist...
Wenn ich den FormDesigner nutze, erstelle ich damit einmal! das Gerüst sozusagen, was ich dann nachträglich von Hand ändere.... sozusagen wird diese Datei nie wieder vom Designer geladen

Re: Gadgets in Schleifen
Verfasst: 18.12.2020 14:11
von TWELVE
Ich habe früher andere Designer verwendet, aber letzlich habe ich das nie so hinbekommen, nicht bei jeder GUI Änderung
noch zusätzlich wieder am Form Code rumfummeln zu müssen.Ich wollte nur den Code vom Designer per Xinclude einbinden
und Formdesigner war dann irgendwie das Werkzeug, wo das für mich gut funktionierte.Mir ist klar, dass der ziemlich eingeschränkt
ist, aber für meine Zwecke ist das ok.
Welchen Designer nimmst Du denn ?
Ich habe nur diesen einen Enumeration Block für die Buttons.Gibts da ne Erklärung, warum der Buttion mit der höchsten Nummer
immer oben steht ?
Re: Gadgets in Schleifen
Verfasst: 18.12.2020 14:49
von ccode_new
Die Reihenfolge ist doch völlig egal.
Und wenn nicht schreibst du einfach x=#button_63 to #button_0, oder lässt es so und schreibst einfach Step -1 dazu.
Re: Gadgets in Schleifen
Verfasst: 18.12.2020 16:46
von Axolotl
Genau.
Letztlich benötigt man eine eindeutige Kennung des Gadgets. Das geht sowohl über vom System vergebene Nummer bei Aufruf mit #PB_ANY, mit Konstanten oder Enumeration.
Häufiger Fehler: Gleiche Nummer verwendet und nur das letzte angelegte Gadget ist zu sehen.
Wenn man nicht alle Konstanten über Namen ansprechen muss, kann man bei Enumerations auch noch (wie unten) arbeiten.
Hier mal so wie ich es meistens mache....
Code: Alles auswählen
Enumeration EGadget ; enum Gadgets
#GADGET_JobList
#GADGET_Status
;
#GADGET_Button0 ;' Button Gruppe
#GADGET_Button64 = #GADGET_Button0+64
;
#GADGET_CloseButton
EndEnumeration
Debug #PB_Compiler_EnumerationValue ; == 68
Debug #GADGET_Button0 ; == 2
; ...
Debug #GADGET_Button64 ; == 66