ich bin gerade dabei die ganzen PB libs "OOP-fähig" zu machen.
Nun komm ich an einer Stelle nicht weiter.
Erstmal der Code:
(Original von inc.. Ich habs verbessert und die Gadget|Button-Klasse eingebaut)
Code: Alles auswählen
;{
Class WINDOW
WINDOW(x.l = #PB_Ignore, y.l = #PB_Ignore, width.l = #PB_Ignore, height.l = #PB_Ignore, Titel.s = "", flags.l = #False, ParentWindowID.l = #False)
Release()
Flex Close()
Flex IsInitialized()
Flex GetID()
Flex SetActive()
Flex Disable(Status.l)
Flex Hide(Status.l)
Flex Show(Status.l)
Flex SmartRefresh(Status.l)
Flex Sticky(Status.l)
Flex Height(height.l)
Flex Width(width.l)
Flex MouseX()
Flex MouseY()
Flex OutputID()
Flex XPos(x.l)
Flex YPos(y.l)
Flex Move(x.l= #PB_Ignore, y.l = #PB_Ignore)
Flex NewSize(width.l= #PB_Ignore, height.l= #PB_Ignore)
Flex Resize(x.l = #PB_Ignore, y.l = #PB_Ignore, width.l= #PB_Ignore, height.l= #PB_Ignore)
Flex Color(Color.l = #False)
Flex State(Status.l = #False)
Flex Title.s(Title.s = "")
Flex WaitEvent(Timeout.l = 0)
Flex Event()
Flex EventGadget()
Flex EventMenu()
Flex EventType()
Flex EventWindow()
Flex AddKeyboardShortcut(Shortcut.l, Event.l)
Flex RemoveKeyboardShortcut(Shortcut.l)
Flex SetCallback(*CallbackProcedure)
hwnd.l
wndID.l
EndClass
Procedure WINDOW.Release()
If IsWindow(This->wndID)
CloseWindow(This->wndID)
EndIf
This->hwnd = 0
EndProcedure
Procedure WINDOW.WINDOW(x.l = #PB_Ignore, y.l = #PB_Ignore, width.l = #PB_Ignore, height.l = #PB_Ignore, Titel.s = "", flags.l = #False, ParentWindowID.l = #False)
This->wndID = OpenWindow(#PB_Any, x.l, y.l, width.l, height.l, Titel.s, flags.l, ParentWindowID.l)
This->hwnd = WindowID(This->wndID)
CreateGadgetList(This->hwnd)
ProcedureReturn This->hwnd
EndProcedure
Procedure WINDOW.AddKeyboardShortcut(Shortcut.l, Event.l)
ProcedureReturn AddKeyboardShortcut(This->wndID, Shortcut, Event)
EndProcedure
Procedure WINDOW.Close()
ProcedureReturn CloseWindow(This->wndID)
EndProcedure
Procedure WINDOW.Disable(Status.l)
ProcedureReturn DisableWindow(This->wndID, Status.l)
EndProcedure
Procedure WINDOW.EventGadget()
ProcedureReturn EventGadget()
EndProcedure
Procedure WINDOW.EventMenu()
ProcedureReturn EventMenu()
EndProcedure
Procedure WINDOW.EventType()
ProcedureReturn EventType()
EndProcedure
Procedure WINDOW.EventWindow()
ProcedureReturn EventWindow()
EndProcedure
Procedure WINDOW.Color(Color.l = #False)
If Color
ProcedureReturn SetWindowColor(This->wndID, Color)
Else
ProcedureReturn GetWindowColor(This->wndID)
EndIf
EndProcedure
Procedure WINDOW.State(Status.l = #False)
If Status
ProcedureReturn SetWindowState(This->wndID, Status)
Else
ProcedureReturn GetWindowState(This->wndID)
EndIf
EndProcedure
Procedure.s WINDOW.Title(Title.s = "")
If Title
SetWindowTitle(This->wndID, Title)
Else
ProcedureReturn GetWindowTitle(This->wndID)
EndIf
EndProcedure
Procedure WINDOW.Hide(Status.l)
ProcedureReturn HideWindow(This->wndID, 1)
EndProcedure
Procedure WINDOW.Show(Status.l)
ProcedureReturn HideWindow(This->wndID, 0)
EndProcedure
Procedure WINDOW.IsInitialized()
ProcedureReturn IsWindow(This->wndID)
EndProcedure
Procedure WINDOW.Move(x.l= #PB_Ignore, y.l = #PB_Ignore)
ProcedureReturn ResizeWindow(This->wndID, x.l, y.l, #PB_Ignore, #PB_Ignore)
EndProcedure
Procedure WINDOW.NewSize(width.l= #PB_Ignore, height.l= #PB_Ignore)
ProcedureReturn ResizeWindow(This->wndID, #PB_Ignore, #PB_Ignore, width.l, height.l)
EndProcedure
Procedure WINDOW.Resize(x.l = #PB_Ignore, y.l = #PB_Ignore, width.l= #PB_Ignore, height.l= #PB_Ignore)
ProcedureReturn ResizeWindow(This->wndID, x.l, y.l, width.l, height.l)
EndProcedure
Procedure WINDOW.RemoveKeyboardShortcut(Shortcut.l)
ProcedureReturn RemoveKeyboardShortcut(This->wndID, Shortcut.l)
EndProcedure
Procedure WINDOW.SetActive()
ProcedureReturn SetActiveWindow(This->wndID)
EndProcedure
Procedure WINDOW.SetCallback(*CallbackProcedure)
ProcedureReturn SetWindowCallback(*CallbackProcedure, This->wndID)
EndProcedure
Procedure WINDOW.SmartRefresh(Status.l)
ProcedureReturn SmartWindowRefresh(This->wndID, Status)
EndProcedure
Procedure WINDOW.Sticky(Status.l)
ProcedureReturn StickyWindow(This->wndID, Status)
EndProcedure
Procedure WINDOW.WaitEvent(Timeout.l=0)
If EventWindow()=this->wndID
ProcedureReturn WaitWindowEvent()
EndIf
EndProcedure
Procedure WINDOW.Event()
ProcedureReturn WindowEvent()
EndProcedure
Procedure WINDOW.GetID()
ProcedureReturn WindowID(This->wndID)
EndProcedure
Procedure WINDOW.Height(height.l)
ProcedureReturn WindowHeight(This->wndID)
EndProcedure
Procedure WINDOW.Width(width.l)
ProcedureReturn WindowWidth(This->wndID)
EndProcedure
Procedure WINDOW.MouseX()
ProcedureReturn WindowMouseX(This->wndID)
EndProcedure
Procedure WINDOW.MouseY()
ProcedureReturn WindowMouseY(This->wndID)
EndProcedure
Procedure WINDOW.OutputID()
ProcedureReturn WindowOutput(This->wndID)
EndProcedure
Procedure WINDOW.XPos(x.l)
ProcedureReturn ResizeWindow(This->wndID, x, #PB_Ignore, #PB_Ignore, #PB_Ignore)
EndProcedure
Procedure WINDOW.YPos(y.l)
ProcedureReturn WindowY(This->wndID)
EndProcedure
;}
Class Abstract GADGET
GADGET()
CountItems()
Disable(Status.l)
Free()
GetHeight()
GetHandle()
ToolTip(Text.s)
GetType()
GetWidth()
GetX()
GetY()
GetAttribute(Type.l)
GetColor(Type.l)
GetData()
GetFont()
GetState()
GetText.s()
Hide()
Show()
Is()
Resize(x.l=#PB_Ignore,y.l=#PB_Ignore,width.l=#PB_Ignore,height.l=#PB_Ignore)
SetColor(Type.l,Color.l)
SetText(Text.s)
AddEvent(*Proc)
GetID()
GetProcA()
gad.l
Handle.l
*ProcA.l
EndClass
Global NewList gadgets.GADGET()
;{
Procedure GADGET.GADGET()
EndProcedure
Procedure GADGET.CountItems()
ProcedureReturn CountGadgetItems(This->gad)
EndProcedure
Procedure GADGET.Disable(Status.l)
DisableGadget(This->gad,Status)
EndProcedure
Procedure GADGET.Free()
FreeGadget(This->gad)
EndProcedure
Procedure GADGET.GetHeight()
FreeGadget(This->gad)
EndProcedure
Procedure GADGET.GetHandle()
ProcedureReturn Handle
EndProcedure
Procedure GADGET.Tooltip(Text.s)
GadgetToolTip(This->gad,Text)
EndProcedure
Procedure GADGET.GetType()
ProcedureReturn GadgetType(This->gad)
EndProcedure
Procedure GADGET.GetWidth()
ProcedureReturn GadgetWidth(This->gad)
EndProcedure
Procedure GADGET.GetX()
ProcedureReturn GadgetX(This->gad)
EndProcedure
Procedure GADGET.GetY()
ProcedureReturn GadgetX(This->gad)
EndProcedure
Procedure GADGET.GetAttribute(Type.l)
ProcedureReturn GetGadgetAttribute(This->gad,Type)
EndProcedure
Procedure GADGET.GetColor(Type.l)
ProcedureReturn GetGadgetColor(This->gad,Type)
EndProcedure
Procedure GADGET.GetData()
ProcedureReturn GetGadgetData(This->gad)
EndProcedure
Procedure GADGET.GetFont()
ProcedureReturn GetGadgetFont(This->gad)
EndProcedure
Procedure GADGET.GetState()
ProcedureReturn GetGadgetState(This->gad)
EndProcedure
Procedure.s GADGET.GetText()
ProcedureReturn GetGadgetText(This->gad)
EndProcedure
Procedure GADGET.Show()
HideGadget(This->gad,0)
EndProcedure
Procedure GADGET.Hide()
HideGadget(This->gad,1)
EndProcedure
Procedure GADGET.Is()
ProcedureReturn IsGadget(This->gad)
EndProcedure
Procedure GADGET.Resize(x.l=#PB_Ignore,y.l=#PB_Ignore,width.l=#PB_Ignore,height.l=#PB_Ignore)
ResizeGadget(This->gad,x.l,y.l,width.l,height.l)
EndProcedure
Procedure GADGET.SetColor(Type.l,Color.l)
SetGadgetColor(This->gad,Type,Color)
EndProcedure
Procedure GADGET.SetText(Text.s)
SetGadgetText(This->gad,Text)
EndProcedure
Procedure GADGET.AddEvent(*Proc)
AddElement(gadgets())
gadgets() = This
This->ProcA=*Proc
EndProcedure
Procedure GADGET.GetID()
ProcedureReturn This->gad
EndProcedure
Procedure GADGET.GetProcA()
ProcedureReturn This->ProcA
EndProcedure
;}
Class BUTTON Extends GADGET
BUTTON(x.l,y.l,w.l,h.l,Text.s)
EndClass
Procedure BUTTON.BUTTON(x.l,y.l,w.l,h.l,Text.s)
This->gad=ButtonGadget(#PB_Any,x,y,w,h,Text)
This->Handle=GadgetID(This->gad)
EndProcedure
Global Event
Procedure UpdateGadgets()
If Event=#PB_Event_Gadget
gev=EventGadget()
ForEach gadgets()
*obj.GADGET=gadgets()
id=*obj->GetID()
If gev=id
proc=*obj->GetProcA()
CallFunctionFast(proc,*obj)
EndIf
Next
EndIf
EndProcedure
Declare Click(*obj.GADGET)
*Window.WINDOW = NewObject WINDOW(#PB_Ignore, #PB_Ignore, 400, 200 , "Here is the title", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
*Btn.BUTTON= NewObject BUTTON(10,10,100,20,"Button")
*Btn->AddEvent(@Click())
Repeat
Event=WaitWindowEvent()
UpdateGadgets()
Until Event = #PB_Event_CloseWindow
*Window->Release()
DeleteObject *Window
Procedure Click(*obj.GADGET)
MessageRequester("1","2")
*obj->SetText("Text")
EndProcedure
Ich dachte mir, den Gadgets könnte man ja einfach Prozeduren zuweisen.
Aber wie sieht das nun mit WaitwindowEvent und den Windows aus?
WaitwindowEvent benutze ich schon in der UpdateGadgets-Funktion.
inc. z.B hatte einfach ne WaitwindowEvent Methode eingebaut. Bringt ja aber nix, da das für alle Events gilt, und nicht für die Events von einem bestimmten Fenster.
Hätte jemand ne Idee?
Verbesserungsvorschläge zum obigen Code sind natürlich auch wilkommen(Und das Global Event bitte erstmal ignorieren..
