GetGadgetStructure

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

GetGadgetStructure

Beitrag von Deeem2031 »

Hab mal wieder ein bischen in Purebasic rumgewühlt und dabei ist dieser (mehr oder weniger sinnvolle) Code bei rausgekommen:

Code: Alles auswählen

Structure GadgetFunctions
  FreeGadget.l
  GetGadgetState.l
  SetGadgetState.l
  GetGadgetText.l
  SetGadgetText.l
  AddGadgetItem.l
  AddGadgetItem2.l
  RemoveGadgetItem.l
  ClearGadgetItemList.l
  ResizeGadget.l
  CountGadgetItems.l
  GetGadgetItemState.l
  SetGadgetItemState.l
  GetGadgetItemText.l
  SetGadgetItemText.l
  OpenGadgetList2.l
  GadgetX.l
  GadgetY.l
  GadgetWidth.l
  GadgetHeight.l
  HideGadget.l
EndStructure

Structure PB_GadgetStructure
  Gadget.l    ; OS Gadget pointer (HWND)
  *VirtualTable.GadgetFunctions
  CustomData.l  ; Can be used to store extra infos on this gadget
  CustomData2.l ; Can be used to store extra infos on this gadget
EndStructure

Procedure.l GetGadgetStructure(GadgetID)
  GadgetID(GadgetID)
  !MOV Eax, Edx
  ProcedureReturn
EndProcedure

;{ MyTextSetGadgetText
Global *Gadget.PB_GadgetStructure, Text.s

Goto MyTextSetGadgetText_End
MyTextSetGadgetText:
!LEA Eax, dword[Esp+4]
!MOV dword[p_Gadget],Eax 
!MOV Eax, dword[Esp+8]
!MOV dword[v_Text],Eax 

SetWindowText_(*Gadget\Gadget,":P")

!RET 08
MyTextSetGadgetText_End:;}

CreateGadgetList(OpenWindow(0,0,0,200,200,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,""))
TextGadget(0,90,90,20,20,"~")

*Gadget.PB_GadgetStructure = GetGadgetStructure(0)
Debug *Gadget\Gadget
Debug GadgetID(0)
*Gadget\VirtualTable\SetGadgetText = ?MyTextSetGadgetText
SetGadgetText(0,":)")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
Until quit
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich kapiers noch nicht so ganz.

Kannst du ein paar mehr Beispiele machen?
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Er überschreibt sozusagen die PB-Funktionen mit eigenen (eigentlich nur
die Pointer).

Nette Idee :allright:
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Genau, ich hab die SetGadgetText() Proc von dem TextGadget überschrieben. Dadurch steht dann da als text ":P" und nicht ":)"
Nur die eigenen procs zu schreiben ist gewöhnungsbedürftig, schreibt man das nämlich ein eine "echte" Procedure, dann stürzt das Programm ab, da der interne Aufruf nicht zu dem Eax/Stack-Aufruf der PB-Procs passt.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten