Variable GadgetList und variable Events ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Variable GadgetList und variable Events ?

Beitrag von mk-soft »

Habe mal ein anderen Weg mit Interface eingeschlagen. Es darf aber GadgetData für nichts anderes verwendet werden.
Es sei denn man verwendet BindGadgetEvent.

Code: Alles auswählen

EnableExplicit

Structure udtMyButton
  ; Zeiger auf Funtionstabelle. Muss immer an erster Stelle sein
  *vtable
  ; Eigene ID
  id.i
  ; Daten
  folder.s
  file.s
  size.i
EndStructure

Interface iMyButton
  DoEvents()
  GetID()
  GetFolder.s()
  PutFolder(folder.s)
  GetFile.s()
  PutFile(file.s)
  GetSize()
  PutSize(size.i)
EndInterface

Global NewList MyButtonObject.udtMyButton()

Declare EventButtonObject()
; -----------------------------------------------------------------------------

Procedure CreateButtonObject(id, x, y, dx, dy, text.s, flags = 0)
  Protected *object.udtMyButton
  Protected button.i
  *object = AddElement(MyButtonObject())
  If *object
    button = ButtonGadget(id, x, y, dx, dy, text, flags)
    If button
      If id = #PB_Any
        *object\id = button
      Else
        *object\id = id
      EndIf
      *object\vtable = ?vtMyButton
      SetGadgetData(Button, *Object)
      ;BindGadgetEvent(*object\id, @EventButtonObject(), #PB_All)
    Else
      DeleteElement(MyButtonObject())
      *object = 0
    EndIf
  EndIf
  ProcedureReturn *object
EndProcedure

; -----------------------------------------------------------------------------
Procedure DestroyButtonObject(*this.udtMyButton)
  ;UnbindGadgetEvent(*this\id, @EventButtonObject())
  FreeGadget(*this\id)
  ChangeCurrentElement(MyButtonObject(), *this)
  DeleteElement(MyButtonObject())
  LastElement(MyButtonObject())
EndProcedure

; -----------------------------------------------------------------------------
Procedure EventButtonObject()
  Protected *object.iMyButton = GetGadgetData(EventGadget())
  If *object
    *object\DoEvents()
  EndIf
EndProcedure

; -----------------------------------------------------------------------------
Procedure DoEvents(*this.udtMyButton)
  Protected *my.iMyButton = *this
  Protected event = EventType()
  Select event
    Case #PB_EventType_LeftClick
      Debug *this\folder
      Debug *this\file
      Debug *this\size
  EndSelect
  
EndProcedure

; -----------------------------------------------------------------------------
Procedure GetID(*this.udtMyButton)
  ProcedureReturn *this\id
EndProcedure

; -----------------------------------------------------------------------------
Procedure.s GetFolder(*this.udtMyButton)
  ProcedureReturn *this\folder
EndProcedure

Procedure PutFolder(*this.udtMyButton, folder.s)
  *this\folder = folder
EndProcedure

; -----------------------------------------------------------------------------
Procedure.s GetFile(*this.udtMyButton)
  ProcedureReturn *this\file
EndProcedure

; -----------------------------------------------------------------------------
Procedure PutFile(*this.udtMyButton, file.s)
  *this\file = file
EndProcedure

; -----------------------------------------------------------------------------
Procedure GetSize(*this.udtMyButton)
  ProcedureReturn *this\size
EndProcedure

; -----------------------------------------------------------------------------
Procedure PutSize(*this.udtMyButton, size)
  *this\size = size
EndProcedure

; -----------------------------------------------------------------------------
DataSection
  ; Virtuelle Funktionstabelle. Gleiche reihenfolge wie im Interface
  vtMyButton:
  Data.i @DoEvents(), @GetID(), @GetFolder(), @PutFolder(), @GetFile(), @PutFile(), @GetSize(), @PutSize()
EndDataSection

; -----------------------------------------------------------------------------

;- Test
#Window           = 0
#ScrollAreaGadget = 0   ; 0 bzw. 88    ; für Beispiel C bitte auf 88 stellen


OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 160, 280, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ScrollAreaGadget(#ScrollAreaGadget, 10, 10, 140, 260, 110, 410)

Define Counter
Define *MyButton.iMyButton
Define newY = 10

Global NewList ListButtons.iMyButton()

ButtonGadget(1, 10, newY, 100, 30, "Button X")
newY + 40
For Counter = 1 To 9
  AddElement(ListButtons())
  ListButtons() = CreateButtonObject(#PB_Any, 10, newY, 100, 30, "Button " + Str(Counter))
  ListButtons()\PutFolder("Verzeichnis " + Str(Counter))
  ListButtons()\PutFile("Datei " + Str(counter))
  ListButtons()\PutSize(Random(100))
  newY + 40
Next
CloseGadgetList()

Repeat
  Select WaitWindowEvent()
    Case  #PB_Event_CloseWindow
      End

    Case  #PB_Event_Gadget
      
      Select EventGadget()
        Case 0 : Debug "Kontroll-Case 0"    ; wird eindeutig erkannt - das ist NICHT das Problem
                                            ; sondern ein Kontroll-Debug, ob und wann sich Gadget 0 ereignet


        Case 1 
          ForEach ListButtons()
            Debug ListButtons()\GetFolder()
          Next
          
        Default
          *MyButton = GetGadgetData(EventGadget())
          If *MyButton <> 0
            *MyButton\DoEvents()
          EndIf
      EndSelect
  EndSelect

ForEver
:wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Variable GadgetList und variable Events ?

Beitrag von Vera »

Bild ~ dank Dir Michael ~ Bild

Interfaces ist mir völlig unbekannt [... und war etwas erleichter, dass Die Hilfe schreibt, das sei nur was für Profis] ... auch strukturierte Listen mit Pointern überfodern mich dezent ... doch Dein Beispiel ist toll und die ButtonVerwaltung echt smart, und ich bin schon dabei mich nach und nach da durch zu arbeiten.

Prima ist auch, dass BindEvent für später schon vorgelegt ist.

LG ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Antworten