String mit SetGadgetData?

Anfängerfragen zum Programmieren mit PureBasic.
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

String mit SetGadgetData?

Beitrag von NeoChris »

Moin!

Ist es auch moeglich mit SetGadgetData auch String zu speichern oder kann nur eine Zahl uebergeben werden? Ich will gerne lieber ein Text in einen Gadget speichern aber ist nicht moeglich oder? Oder kennt ihr ein Trick? :D
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 »

Das braucht keinen Trick :wink:

Code: Alles auswählen

Global text.s = "Hallo"

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
ButtonGadget(0, 10, 10, 100, 25, "Click mich")
SetGadgetData(0, @text)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_LeftClick
              Debug PeekS(GetGadgetData(0))
          EndSelect
      EndSelect
  EndSelect
ForEver
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
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

Re: String mit SetGadgetData?

Beitrag von NicTheQuick »

Oder du nutzt da hier:

Code: Alles auswählen

Structure __GadgetData
	value.i
	s.s
EndStructure

Procedure __SetGadgetData(GadgetID.i, Value.i)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	*data\value = Value
	SetGadgetData(GadgetID, *data)
EndProcedure

Procedure.i __GetGadgetData(GadgetID.i)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	
	ProcedureReturn *data\value
EndProcedure

Procedure SetGadgetDataString(GadgetID.i, String.s)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	*data\s = String
	SetGadgetData(GadgetID, *data)
EndProcedure

Procedure.s GetGadgetDataString(GadgetID.i)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	
	ProcedureReturn *data\s
EndProcedure

Macro SetGadgetData(GadgetID, Value)
	__SetGadgetData(GadgetID, Value)
EndMacro

Macro GetGadgetData(GadgetID, Value)
	__GetGadgetData(GadgetID)
EndMacro
Damit funktioniert 'SetGadgetData()' und 'GetGadgetData()' wie gewohnt, aber man hat zusätzlich noch die Befehle 'SetGadgetDataString()' und 'GetGadgetDataString()'.

Hab es jetzt auf die schnelle aber nicht getestet.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: String mit SetGadgetData?

Beitrag von STARGÅTE »

:allright:
Gefällt mir, da wäre dann gleich noch SetGadgetDataFloat oder so nützlich.
Allerdings muss man deine __GadgetData Struktur dann immer per Hand freigeben, wenn man FreeGadget macht.
Da muss man halt aufpassen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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

Re: String mit SetGadgetData?

Beitrag von NicTheQuick »

Ja, stimmt. FreeGadget hätte ich auch noch als Macro dazu schreiben müssen. Das ist dann ja auch kein großer Aufwand mehr.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: String mit SetGadgetData?

Beitrag von STARGÅTE »

NicTheQuick hat geschrieben:Ja, stimmt. FreeGadget hätte ich auch noch als Macro dazu schreiben müssen. Das ist dann ja auch kein großer Aufwand mehr.
Wenn es keine Container-Gadgets gäbe ^^, ja ...
Ich will hier jetzt nicht Krümel kacken, aber wenn nun jemand Gadgets in einem Container, Panel oder ScollArea erstellt, und diese ContainerGadget oder gar das Window wieder freigibt/löscht, dann kannst du auch mit einem Macro nicht verhindern, dann "deine" Memory zurückbleiben.

Hier zeigt sich mal wieder, wie wichtig ein #PB_Event_GadgetRelease oder #PB_Event_Destroy wäre, um halt genau solche Vorgehen mit einem einfachen BindGadgetEvent zu 100% abzudecken, gerade auch für CustomGadgets
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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

Re: String mit SetGadgetData?

Beitrag von NicTheQuick »

Ohje, soweit hatte ich tatsächlich nicht gedacht. In dem Fall kann man das tatsächlich nicht sauber hinkriegen. Man könnte das höchstens aktuell unter Windows mittels eines Callbacks lösen. Unter Linux weiß ich nicht, wie man das machen könnte.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: String mit SetGadgetData?

Beitrag von edel »

Versuch doch mal folgenden Code unter Linux auszuführen.

Code: Alles auswählen

Prototype CallOldFreeProc(Gadget)

Structure GadgetVT
  GadgetType.l
  SizeOf.l       
  GadgetCallback.i
  
  FreeGadget.i
EndStructure

Structure Gadget
  Gadget.i
  *vt.GadgetVT
EndStructure  

Structure FreeProcInfo
  OldProc.CallOldFreeProc
  NewProc.CallOldFreeProc
  GadgedNR.i
EndStructure

Structure UserData
  UserData.i[10]
  size.i
EndStructure


Import ""
  PB_Object_GetObject(obj, id)
  PB_Gadget_Objects
EndImport


Global NewMap OldFreeProc.FreeProcInfo()

;-------------------------------------------
Procedure FreeProc(Gadget)
  Protected GadgedNR
  
  If Gadget
    
    GadgedNR = OldFreeProc(Str(gadget))\GadgedNR
    
    OldFreeProc(Str(gadget))\NewProc(GadgedNR)
    
    DeleteMapElement(OldFreeProc(), Str(gadget))
    
    If OldFreeProc(Str(gadget))\OldProc
      ProcedureReturn OldFreeProc(Str(gadget))\OldProc(GadgedNR)
    EndIf
    
  EndIf    
  
EndProcedure

;-------------------------------------------
Procedure SetFreeProc(Gadget, Proc)
  Protected *g.Gadget
  
  *g = PB_Object_GetObject(PB_Gadget_Objects, Gadget)
  
  If *g
    
    OldFreeProc(Str(*g))\GadgedNR = Gadget
    OldFreeProc(Str(*g))\OldProc  = *g\vt\FreeGadget
    OldFreeProc(Str(*g))\NewProc  = Proc      
    
    *g\vt\FreeGadget = @FreeProc()
  EndIf
  
EndProcedure


;-------------------------------------------
;-------------------------------------------
;-------------------------------------------
;-------------------------------------------

;-------------------------------------------
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(#PB_Any, 10, 10, 180, 25, "hm?")
    Gad2 = ListViewGadget(#PB_Any, 10, 35, 180, 150)
    
    SetFreeProc(Gad1, @MyFreeGadget())
    SetFreeProc(Gad2, @MyFreeGadget())
    
    FreeGadget(Gad1)
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf

EndProcedure:End Main()
Zuletzt geändert von edel am 10.01.2014 18:09, insgesamt 1-mal geändert.
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:Versuch doch mal folgenden Code unter Linux auszuführen.
Z: 58 OldFreeProc(Str(*g))\OldProc = *g\vt\FreeGadget
[ERROR] Zeiger ist Null.

Das funktioniert wohl noch nicht so richtig :wink:

Gruß
Thomas
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 »

IsGadget scheint wohl unter Linux etwas anderes zurückzugeben. Ich habe es oben angepasst.
Antworten