Wenn die Prototype richtig angelegt sind, Anzahl der Parameter und Parameter Typen stimmen, wenn auch die Procedure Adresse richtig zuwiesen ist, funktioniert dieses sicher.
In irgendeiner Beta Version von Purebasic ging plötzlich der Aufruf über die virtuelle Tabelle nicht mehr. Wurde aber sofort nach Meldung des Bugs sofort repariert.
Zum Beispiel:
Bei OOP-BaseClass werden Arrays verwendet um die Methoden in der virtuellen Tabelle zu hinterlegen.
Im EventDesigner V3 werden die Event Proceduren in der DataSection als virtuelle Tabelle hinterlegt und über ein Index (EventMenu, EventGadget) aufgerufen.
Beispiel GuiEventMainFile
Code: Alles auswählen
;-TOP
; ***************************************************************************
;
; Comment : EventDesigner - Common Event Main File
; Create : 2020.12.03 14.22.42
;
; Info : Do not edit this file. This file always overwrite.
;
; ***************************************************************************
; - Include Event Files
IncludeFile "GuiEventcommon.pb"
; ----
Prototype _MyPrototypeInvoke()
Structure _MyEventInvoke
Invoke._MyPrototypeInvoke[0]
EndStructure
Global *vtMyEventSizeWindow._MyEventInvoke = ?vtMyEventSizeWindow
Global *vtMyEventCloseWindow._MyEventInvoke = ?vtMyEventCloseWindow
Global *vtMyEventMenu._MyEventInvoke = ?vtMyEventMenu
Global *vtMyEventGadget._MyEventInvoke = ?vtMyEventGadget
#MyEventCountWindow = 1
#MyEventCountMenu = 2
#MyEventCountGadget = 4
; ----
Procedure _MyEventSizeWindow()
Protected WindowID = EventWindow()
Select WindowID
Case 0 To #MyEventCountWindow - 1
*vtMyEventSizeWindow\Invoke[WindowID]()
EndSelect
EndProcedure
; ----
Procedure _MyEventCloseWindow()
Protected WindowID = EventWindow()
Select WindowID
Case 0 To #MyEventCountWindow - 1
*vtMyEventCloseWindow\Invoke[WindowID]()
EndSelect
EndProcedure
; ----
Procedure _MyEventMenu()
Protected MenuID = EventMenu()
Select MenuID
Case 0 To #MyEventCountMenu - 1
*vtMyEventMenu\Invoke[MenuID]()
EndSelect
EndProcedure
; ----
Procedure _MyEventGadget()
Protected GadgetID = EventGadget()
Select GadgetID
Case 0 To #MyEventCountGadget - 1
*vtMyEventGadget\Invoke[GadgetID]()
EndSelect
EndProcedure
; ----
Procedure _MyEventGadgetNothing()
; Do Nothing
EndProcedure
; ----
; - Bind Events
BindEvent(#PB_Event_Menu, @_MyEventMenu())
BindEvent(#PB_Event_Gadget, @_MyEventGadget())
BindEvent(#PB_Event_SizeWindow, @_MyEventSizeWindow())
BindEvent(#PB_Event_CloseWindow, @_MyEventCloseWindow())
; ----
DataSection
vtMyEventSizeWindow:
Data.i @MyEventSizeWindow_WinMain()
vtMyEventCloseWindow:
Data.i @MyEventCloseWindow_WinMain()
vtMyEventMenu:
Data.i @MyEventMenu_WinMain_MenuItem_Dialog()
Data.i @MyEventMenu_WinMain_MenuItem_Exit()
vtMyEventGadget:
Data.i @MyEventGadget_WinMain_Button_DoYes()
Data.i @MyEventGadget_WinMain_Button_DoCancel()
Data.i @_MyEventGadgetNothing()
Data.i @MyEventGadget_WinMain_Calendar()
EndDataSection
; ----