Panelgadget nach Button klick aufrufen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Ich hatte letzten Sommer schon einmal ein Code-Beispiel für ein ähnliches Problem meines Sohnes erstellt, das in einem Panel-Gadget die dynamische Generierung von neuen Karteireitern (Tabs) erlaubt, indem man auf eine entsprechende Schaltfläche klickt, um einen neuen Karteireiter mit identischen Eingabefeldern zu erstellen. Hintergrund war die Programmierung eines Werkzeugs für die Verwaltung von Charakterwerten für den Meister eines Rollenspiels wie z.B. Das Schwarze Auge (DSA).

Das Code-Beispiel zeigt ein Panel-Gadget, das auf jedem Karteireiter 3 Text-Gadgets, 3 String-Gadgets und 2 Button-Gadgets platziert. Die Gadgets werden durch Aufruf der Prozedur AddNewTab() dynamisch angelegt. Die IDs der String- und Button-Gadgets werden in einem Feld (Array) gespeichert, das dynamisch bei jedem Aufruf von AddNewTab() mit ReDim vergrößert wird.

Wenn man auf die unterhalb der Karteireiter gelegene Schaltfläche "Fertig" klickt, werden alle String-Felder ausgelesen und ihr Inhalt ausgegegeben.

Das Beispiel läßt sich relativ leicht erweitern, indem man weitere Eingabefelder in die 2.Enumeration und in die Prozedur AddGadgetTab() einfügt. Die Konstante #NumGadgetsPerTab wird automatisch auf die Anzahl der Einträge der 2.Enumeration gesetzt.

Code: Alles auswählen

;=============================================================================
;       Erstellung eines PanelGadget und dynamisches Anlegen von neuen
;    Karteireitern mit 3 TextGadgets, 3 StringGadgets und 2 ButtonGadgets
;=============================================================================

EnableExplicit

Enumeration
  #Panel
  #ButtonReady
EndEnumeration

Enumeration
  #OK
  #AddTab
  #Strength
  #Intelligence
  #Speed
EndEnumeration

#NumGadgetsPerTab = #PB_Compiler_EnumerationValue ; ACHTUNG! Diese Definition muß immer der obigen Enumeration folgen!

; ------ Benötigte Prozeduren deklarieren

Declare AddNewTab(NumEnemies.L)

; ------ Definition der Variablen

Define GadgetEvent.L
Define i.L
Define NumEnemies.L

; ----- Ein zweidimensionales Feld anlegen, in dem die Kennungen (IDs) der
;       später dynamisch angelegten Gadgets eingetragen werden können

Dim GadgetList(#NumGadgetsPerTab - 1, 0)

; ----- Fenster öffnen

OpenWindow(0, 0, 0, 370, 150, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

; ----- Statische Gadgets anlegen

ButtonGadget(#ButtonReady, WindowWidth(0) / 2 - 25, WindowHeight(0) - 30, 50, 20, "Fertig")
PanelGadget(#Panel, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 50)

NumEnemies = 1
AddNewTab(NumEnemies)

SetActiveGadget(GadgetList(#Strength, 0))

; ----- Ereignisschleife

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      GadgetEvent = EventGadget()

      Select GadgetEvent
        Case #ButtonReady
          ; ----- Die "Fertig"-Schaltfläche wurde angeklickt und die Ereignis-
          ;       schleife soll beendet werden
          Break
        Case #Panel
          ; ----- Das Panel wurde angeklickt: der Fokus muß auf das erste
          ;       Eingabefeld gesetzt werden
          SetActiveGadget(GadgetList(#Strength, GetGadgetState(#Panel)))
      EndSelect

      For i = 0 To NumEnemies - 1
        If GadgetEvent = GadgetList(#OK, i)
          ; ----- In einem Karteiblatt wurde auf eine OK-Schaltfläche
          ;       geklickt
          Debug "Linksklick auf 'OK' in Karteikarte " + Str(i + 1)
          Break
        ElseIf GadgetEvent = GadgetList(#AddTab, i)
          ; ----- In einem Karteiblatt wurde auf eine AddTab-Schaltfläche
          ;       geklickt
          NumEnemies + 1
          AddNewTab(NumEnemies)
          Break
        EndIf
      Next i
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

; ----- In dieser Schleife mit dem Index i wird für jedes Karteiblatt der
;       Inhalt der Eingabefelder "Stärke", "Intelligenz" und "Geschwindigkeit"
;       ausgegeben

For i = 0 To NumEnemies - 1
  Debug ""
  Debug "Gegner " + Str(i + 1) + ":"
  Debug "- Stärke: " + Trim(GetGadgetText(GadgetList(#Strength, i)))
  Debug "- Intelligenz: " + Trim(GetGadgetText(GadgetList(#Intelligence, i)))
  Debug "- Geschwindigkeit: " + Trim(GetGadgetText(GadgetList(#Speed, i)))
Next i

End


Procedure AddNewTab(NumEnemies.L)
  Shared GadgetList.L()

  ReDim GadgetList(#NumGadgetsPerTab - 1, NumEnemies - 1)

  AddGadgetItem (#Panel, -1, "Gegner " + Str(NumEnemies))
  OpenGadgetList(#Panel, NumEnemies - 1)
  TextGadget(#PB_Any, 10, 20, 40, 20, "Stärke:")
  GadgetList(#Strength, NumEnemies - 1) = StringGadget(#PB_Any, 48, 17, 30, 20, "")
  TextGadget(#PB_Any, 100, 20, 50, 20, "Intelligenz:")
  GadgetList(#Intelligence, NumEnemies - 1) = StringGadget(#PB_Any, 155, 17, 30, 20, "")
  TextGadget(#PB_Any, 210, 20, 90, 20, "Geschwindigkeit:")
  GadgetList(#Speed, NumEnemies - 1) = StringGadget(#PB_Any, 295, 17, 30, 20, "")
  GadgetList(#OK, NumEnemies - 1) = ButtonGadget(#PB_Any, 120, GadgetHeight(#Panel) - 50, 30, 20, "OK")
  GadgetList(#AddTab, NumEnemies - 1) = ButtonGadget(#PB_Any, 160, GadgetHeight(#Panel) - 50, 80, 20, "Neuer Gegner")
  CloseGadgetList()

  SetGadgetState(#Panel, NumEnemies - 1)
  SetActiveGadget(GadgetList(#Strength, NumEnemies - 1))
EndProcedure
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Shardik,

wow, vielen Dank für das Code-Beispiel.
Ich hätte nicht gewusst, wie ich das hätte
umsetzen können.
Werde das Beispiel durcharbeiten und anpassen.

Bin total begeistert und nochmals vielen Dank.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

TheSaint hat geschrieben:wow, vielen Dank für das Code-Beispiel.
Ich hätte nicht gewusst, wie ich das hätte
umsetzen können.
Werde das Beispiel durcharbeiten und anpassen.

Bin total begeistert und nochmals vielen Dank.
Es freut mich, daß Dir mein Beispiel so gut gefällt... 8)
Wenn Du noch weitere Fragen hast, helfe ich Dir gerne weiter.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

finde das Beispiel auch gut :allright:
Win11 x64 | PB 6.20
Antworten