Re: Variable GadgetList und variable Events ?
Verfasst: 19.11.2014 22:42
Habe mal ein anderen Weg mit Interface eingeschlagen. Es darf aber GadgetData für nichts anderes verwendet werden.
Es sei denn man verwendet BindGadgetEvent.

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
