brauche viele #HandleID (Array For-Schleife ?)

Anfängerfragen zum Programmieren mit PureBasic.
z3alf
Beiträge: 5
Registriert: 01.05.2022 14:39

brauche viele #HandleID (Array For-Schleife ?)

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: brauche viele #HandleID (Array For-Schleife ?)

Beitrag von DarkDragon »

Mit #PB_Any bekommt man eine dynamische Nummer als Resultat.

Aus

Code: Alles auswählen

TextGadget(1, ...)
SetGadgetText(1, "Whatever")
wird

Code: Alles auswählen

Gadget.i = TextGadget(#PB_Any, ...)
SetGadgetText(Gadget, "Whatever")
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: brauche viele #HandleID (Array For-Schleife ?)

Beitrag 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.
PB 6.10
jogo
Beiträge: 118
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: brauche viele #HandleID (Array For-Schleife ?)

Beitrag 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
--
Ideen gibt es viele - man muss sie nur haben...
Mint LMDE5+6 // PureBasic 6.12
jogo
Beiträge: 118
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

Re: brauche viele #HandleID (Array For-Schleife ?)

Beitrag von jogo »

wäre das für dich nicht praktischer, wenn du für dein Projekt ein ListviewGadget oder ListIconGadget verwendest?
--
Ideen gibt es viele - man muss sie nur haben...
Mint LMDE5+6 // PureBasic 6.12
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: brauche viele #HandleID (Array For-Schleife ?)

Beitrag 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.
PB 6.10
Antworten