Seite 1 von 1
brauche viele #HandleID (Array For-Schleife ?)
Verfasst: 20.02.2025 01:36
von z3alf
Hallo Forum,
bin mal wieder auf der Suche...
Jedes Gaget braucht eine eindeutige #Handlenummer, und ich will in einem Fenster 3 Spalten mit TextGadgets benutzen.
Die erste Spalte soll 15 TextGadget() erhalten, die zweite Spalte 28, die dritte 50 (evtl. auf Spalte 4 und 5 aufgeteilt).
Kann man die eindeutige Handlenummer wie eine Array definieren?
Variablen können mit
Code: Alles auswählen
Global Dim SensorF.s(15) ; definert werden und in einer Schleife kann ich den Inhalt vorbelegen
For i = 0 To 15
AenderungF(i) = 0
Next i
aber wie kann man die #HandleID entsprechend wie in einem Array bzw. in einer Schleife eindeutig definieren.
Ich muß ja später im Programm in den entsprechenden For-Schleifen auch die Handlenummer zu den Arrays zuordnen,
Ich finde dazu nichts in der Hilfe bzw. hier im Forum.
Code: Alles auswählen
For i 0 To 15
SetGadgetText(#TextAenderung(i), AenderungF(i) )
Next i
Danke schon mal im Voraus
Re: brauche viele #HandleID (Array For-Schleife ?)
Verfasst: 20.02.2025 07:48
von DarkDragon
Mit #PB_Any bekommt man eine dynamische Nummer als Resultat.
Aus
wird
Code: Alles auswählen
Gadget.i = TextGadget(#PB_Any, ...)
SetGadgetText(Gadget, "Whatever")
Re: brauche viele #HandleID (Array For-Schleife ?)
Verfasst: 20.02.2025 11:16
von H.Brill
Entweder du nimmst 2 korespondierende Arrays (eines mit der ID, das andere mit dem Text) oder eine Map zur automatischen Erzeugung.
Code: Alles auswählen
NewMap Textfeld.s()
x.i = 10
y.i = 10
If OpenWindow(0, 0, 0, 400, 600, "Map Beispiel", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
For i = 1 To 15 ; 15 Textfelder
Textfeld(Str(i)) = "Textfeld " + Str(i)
Next i
ResetMap(Textfeld())
ForEach Textfeld()
TextGadget(Val(MapKey(Textfeld())), x, y, 100, 25, Textfeld())
y = y + 30
Next
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Die Positionen steuerst du dann über x und y.
Den EventGadget kannst du dann mit FindMapElement() rausfischen und hast auch gleich den zugehörigen Text des Gadgets dazu.
Kommt jetzt darauf an, was du genau machen willst.
Re: brauche viele #HandleID (Array For-Schleife ?)
Verfasst: 20.02.2025 20:33
von jogo
hatte mal so ein ähnliches Projekt, wo ich viele Gadgets mit Hilfe eines Arrays erstellt habe und über den Array-Index auf die Gadgets zugreifen konnte und gleichzeitig das selbe Array für die Inhalte nutzen wollte. Hab mal das nötigste zusammenkopiert und mit paar Prozeduren zum Testen veranschaulicht. Hier komme ich mit einen einzigen Array aus. Du kannst die Gruppen natürlich auch splitten. Ist sofort lauffähig:
Code: Alles auswählen
;-deklarationen
Global Dim SensorF.s(92) ;15 + 28 + 50 = 93 Gadgets (0-92)
;-procs
Procedure test_neue_werte()
Protected.i l
;ich beleg das Array hier mit irgendwelchen werten, um die neubefüllung zu demonstrieren
For l = 0 To 14 ;erste gruppe // werte starten immer wieder bei 1
SensorF(l) = Str(l+1)
Next l
For l = 15 To 42 ;zweite gruppe
SensorF(l) = Str(l-14)
Next l
For l = 43 To 92 ;dritte gruppe
SensorF(l) = Str(l-42)
Next l
EndProcedure
Procedure akt_txt()
;ändert einen wert im zielgadget oder alle werte
Protected.i l
If GetGadgetText(100) = "#" ;wenn alle werte gemäß akt. inhalt von SensorF() neu gesetzt werden sollen
For l = 0 To 92 ;alle 93 texte neu belegen
SetGadgetText(l,SensorF(l))
Next l
Else ;wenn gezielt ein text geändert werden soll
SetGadgetText(Val(GetGadgetText(100)),GetGadgetText(101)) ;stringadgets auslesen und in textgadget eintragen
EndIf
EndProcedure
Procedure bau_textgadgets()
Protected.i x,y,l,f
For l = 0 To 92 ;der index des arrayelements entspricht der gadged-nr.
Select l ;gadget-nr. überprüfen, und die startpositionen festlegen
Case 0 ;spalte 1 //15 texte
x=5
y=5
f=$09D6DF ;gelb
Case 15 ;spalte 2 //28 texte
x=60
Y=5
f= $ffffff ;weiß
Case 43 ;spalte 3 //25 texte
x=115
y=5
f=$15DF09 ;grün
Case 68 ;spalte 4 //25 texte
x=170
y=5
f=$15DF09 ;grün
EndSelect
SensorF(l)="00" ;inhalt im array gleich mit belegen // l ist arrayindex und #gadgetnummer
TextGadget(l, x,y ,50,25, SensorF(l))
SetGadgetColor(l, #PB_Gadget_BackColor, $EC090C) ;hintergrund blau
SetGadgetColor(l, #PB_Gadget_FrontColor, f) ;schrift gemäß gruppe in selectauswahl
Y+30 ;startposition für nächste zeile
Next l
EndProcedure
Procedure bau_fensterlemente()
;menü-shurtcuts
AddKeyboardShortcut(0,#PB_Shortcut_Return,13) ;entertaste aktivieren und eventmenu 13 zuweisen
;nur zum testen und probieren:
;texteingaben #100, #101
StringGadget(100, 300,5, 40,25,"") ;eingabe für zielgadget-nr., die geändert werden soll
StringGadget(101, 345,5, 40,25,"") ;eingabe neuer Wert für zielgadget
GadgetToolTip(100,"Ziel-Textfeld, das geändert werden soll, mit '#' werden alle geändert")
GadgetToolTip(101,"Neuer Wert für das Zielgadget")
EndProcedure
;-hauptprog
OpenWindow(0, 0,0, 500, 850, "Gadget", #PB_Window_MinimizeGadget)
StickyWindow(0,#True) ;fenster fest im vordergrund
bau_textgadgets() ;gadgets #0 - #92 anlegen
bau_fensterlemente() ;zum testen
test_neue_werte() ;array zum testen neu belegen
;- ereignisschleife
Repeat
Select WaitWindowEvent() ;fensterereignis auswählen
Case #PB_Event_CloseWindow ;wenn x
Select EventWindow() ;im welchen fenster wurde x gedrückt?
Case 0 ;hauptfenster #0
Break ;aus schleife hüpfen und komplett beenden
Case 1 ;falls weiteres fenster
EndSelect ;welches fenster ge-ixt wurde
Case #PB_Event_Menu ;wenn menü
Select EventMenu() ;auswahl, welches item
Case 13 ;wenn ***ENTER*** gedrückt
akt_txt() ;textgadget aktualiseren
EndSelect
EndSelect ;welches ereignis
ForEver ;
End
Re: brauche viele #HandleID (Array For-Schleife ?)
Verfasst: 20.02.2025 20:42
von jogo
wäre das für dich nicht praktischer, wenn du für dein Projekt ein ListviewGadget oder ListIconGadget verwendest?
Re: brauche viele #HandleID (Array For-Schleife ?)
Verfasst: 21.02.2025 08:21
von H.Brill
ComboboxGadget oder ein TreeGadget, wenn du noch zusätzliche Unterkategorien brauchst.
Spart Platz und sieht evtl. noch schöner aus.
An Möglichkeiten bzw. Gadgets mangelt es bei PB ja nicht.