Gadgets in Schleifen

Für allgemeine Fragen zur Programmierung mit PureBasic.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Gadgets in Schleifen

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Gadgets in Schleifen

Beitrag 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.

Code: Alles auswählen

For x = #button_0 To #button_63
  ;TODO
Next
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Gadgets in Schleifen

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Gadgets in Schleifen

Beitrag 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.

Code: Alles auswählen

For x = #button_0 To #button_63
  ;TODO
Next
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
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Gadgets in Schleifen

Beitrag 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 ;)
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​​
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Gadgets in Schleifen

Beitrag 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.
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Gadgets in Schleifen

Beitrag 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 ;)
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​​
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Gadgets in Schleifen

Beitrag 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 ?
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Gadgets in Schleifen

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Axolotl
Beiträge: 154
Registriert: 31.12.2008 16:34

Re: Gadgets in Schleifen

Beitrag 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     
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Antworten