String mit SetGadgetData?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: String mit SetGadgetData?

Beitrag von ts-soft »

edel hat geschrieben:IsGadget scheint wohl unter Linux etwas anderes zurückzugeben. Ich habe es oben angepasst.
Es hat sich was geändert :mrgreen: , der IMA kommt jetzt in Zeile 65

Hab nur 64-Bit getested, vielleicht liegt es daran?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: String mit SetGadgetData?

Beitrag von edel »

Hm, keine Ahnung. Unter Windows laeuft es unter beiden Modi. Was aber nicht heisst, das es kein Fehler ist.

Edit:
Das ganze mal ohne internen PB Kram.

Code: Alles auswählen

Prototype CallFreeProc(Gadget)

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  
  Structure FreeProcInfo
    oldProc.i
    newProc.i  
  EndStructure
  
  Global NewMap OldFreeProc.FreeProcInfo()  
  
  Procedure FreeGadgetCallback(hWnd, Msg, wParam, lParam)
    Protected oldProc.i 
    Protected newProc.CallFreeProc
    
    oldProc = OldFreeProc(Str(hWnd))\oldProc
    newProc = OldFreeProc(Str(hWnd))\newProc
    
    If Msg = #WM_DESTROY    
      newProc(GetWindowLongPtr_(hWnd, #GWL_ID))
      DeleteMapElement(OldFreeProc(), Str(hWnd))
    EndIf
    
    ProcedureReturn CallWindowProc_(oldProc, hWnd, Msg, wParam, lParam)
  EndProcedure
  
  Procedure SetFreeProc(Gadget, Proc)
    
    OldFreeProc(Str(GadgetID(Gadget)))\oldProc = SetWindowLongPtr_(GadgetID(Gadget), #GWLP_WNDPROC, @FreeGadgetCallback())
    OldFreeProc(Str(GadgetID(Gadget)))\newProc = proc
    
  EndProcedure
  
CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
  
  Global NewMap OldFreeProc.i()
  
  PrototypeC g_signal_connect(instance.i, signal.p-utf8, handler.i, _data.i)
  
  Procedure _g_signal_connect_(instance.i, signal.i, handler.i, _data.i)
    ProcedureReturn g_signal_connect_(instance, signal, handler, _data)
  EndProcedure
  
  Global g_signal_connect.g_signal_connect = @_g_signal_connect_()
  
  ProcedureC FreeProc(Gadget, FProc.CallFreeProc)
    FProc(OldFreeProc(Str(Gadget)))
    DeleteMapElement(OldFreeProc(), Str(Gadget))
  EndProcedure  
  
  Procedure SetFreeProc(Gadget, Proc)
    OldFreeProc(Str(GadgetID(Gadget))) = Gadget
    g_signal_connect(GadgetID(Gadget), "destroy", @FreeProc(), Proc)
  EndProcedure    
CompilerElse
  
CompilerEndIf



;-----------------------------------------------------------
;-----------------------------------------------------------
;-----------------------------------------------------------
Procedure MyFreeGadget(Gadget)
  Debug "FreeGadget : " + Gadget
EndProcedure

Procedure Main()
  
  Protected Window 
  Protected Gad1 
  Protected Gad2 
  
  Window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 200, 200, "")
  
  If Window
    
    Gad1 = ButtonGadget(2, 10, 10, 180, 25, "hm?")
    Gad2 = ListViewGadget(#PB_Any, 10, 35, 180, 150)
    
    SetFreeProc(2, @MyFreeGadget())
    SetFreeProc(Gad2, @MyFreeGadget())
    
    FreeGadget(2)
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf
  
EndProcedure:End Main()
Antworten