BindGadgetEvent. Zugriff auf Programmvariablen
-
- Beiträge: 2
- Registriert: 01.01.2018 14:25
BindGadgetEvent. Zugriff auf Programmvariablen
Hallo.
Ich bin neu in PureBasic und dennoch schon ein großer Fan.
Es geht um den Befehl BindGadgetEvent. Wie kann ich aus der CallbackProzedur auf die Variablen und/oder Arrays aus dem Programm zugreifen? Parameterübergabe ans Callback geht ja offenbar nicht.
Ciao
Burkhart
Ich bin neu in PureBasic und dennoch schon ein großer Fan.
Es geht um den Befehl BindGadgetEvent. Wie kann ich aus der CallbackProzedur auf die Variablen und/oder Arrays aus dem Programm zugreifen? Parameterübergabe ans Callback geht ja offenbar nicht.
Ciao
Burkhart
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Das geschieht entweder über globale Variablen, oder ganz "individuell".
Bei einem Gadget, kann man z.B. einen Wert mit SetGadgetData() an das Gadget "hängen",
und in der Eventprozedur per GetGadgetData() wieder auslesen. Es ist zwar nur ein Wert möglich, aber
wenn man einen Speicherbereich reserviert und dessen *Pointer als Wert übergibt, sind auch komplexe
Datenmengen möglich.
Nachtrag eines Beispiels :
Bei einem Gadget, kann man z.B. einen Wert mit SetGadgetData() an das Gadget "hängen",
und in der Eventprozedur per GetGadgetData() wieder auslesen. Es ist zwar nur ein Wert möglich, aber
wenn man einen Speicherbereich reserviert und dessen *Pointer als Wert übergibt, sind auch komplexe
Datenmengen möglich.
Nachtrag eines Beispiels :
Code: Alles auswählen
Structure s_mauspos
x.i
y.i
EndStructure
Structure s_gadgetdaten
Gadget.i
Window.i
MausPosition.s_mauspos
List MeineListe.s()
EndStructure
; Bei der Gadgeterstellung
*pointer.s_gadgetdaten = AllocateStructure(s_gadgetdaten)
SetGadgetData(Gadget, *pointer)
BindGadgetEvent(Gadget, @EventProcedure())
; Innerhalb einer Eventprozedur z.B.
*pointer.s_gadgetdaten = GetGadgetData(Gadget)
If *pointer
Debug *pointer\Gadget
Debug *Pointer\MausPosition\x
Debug ListSize(*pointer\MeineListe())
EndIf
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
-
- Beiträge: 2
- Registriert: 01.01.2018 14:25
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Das hilft mir weiter! Danke und weiterhin gutes Rutschen
- ProgOldie
- Beiträge: 236
- Registriert: 19.05.2012 17:09
- Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Super Idee mit der Anbindung eines Speicherbereiches über GadgetData usw.
Ich habe das 'mal ausprobiert mit folgendem Codefragment für eine Textdatei:
Wie kann ich jetzt von anderer Stelle aus auf den Text, der an der Stelle *mem gespeichert ist, zugreifen, um ihn in einem Editorgadget anzuschauen?
Zumindest die erste Zeile müsste eigentlich in OldText sichtbar werden. Stattdessen nur Unsinn.
Wo liegt der Fehler?
Edit: Korrektur eingebaut
Ich habe das 'mal ausprobiert mit folgendem Codefragment für eine Textdatei:
Code: Alles auswählen
If FilePathName
If ReadFile(0, FilePathName)
While Eof(0) = 0
LineText=LineText+ReadString(0,#PB_Unicode)+Chr(10)
Wend
*mem=AllocateMemory(StringByteLength(LineText,#PB_Unicode))
CopyMemory(@LineText, *mem,StringByteLength(LineText,#PB_Unicode))
SetGadgetData(BtnGadNr,*mem)
CloseFile(0)
EndIf
EndIf
Code: Alles auswählen
OldText=PeekS(GetGadgetData(BtnGadNr),#PB_Unicode)
Wo liegt der Fehler?
Edit: Korrektur eingebaut
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Leichter Schreibfehler !
Bei PeekS sollte nach dem Speicherbereich, die Länge die gelesen werden soll, angegeben werden.
Also in deinem Fall
Bei PeekS sollte nach dem Speicherbereich, die Länge die gelesen werden soll, angegeben werden.
Also in deinem Fall
Code: Alles auswählen
OldText = PeekS(GetGadgetData(BtnGadNr), -1, #PB_Unicode)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom
- ProgOldie
- Beiträge: 236
- Registriert: 19.05.2012 17:09
- Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Danke erstmal. Der Fehler selbst ist mir nach Blick auf die Syntax klar. Leider erhalte ich nach wie vor kryptische Zeichen.
Ist denn die -1 richtig? Die kann durch nur eine Art 'Ignore' für die Länge sein, damit die darauf folgende Formatangabe richtig interpretiert wird.
Oder liegt in meinem vorherigen Programmsegment für das Einlesen in *mem ein Fehler vor?
Ist denn die -1 richtig? Die kann durch nur eine Art 'Ignore' für die Länge sein, damit die darauf folgende Formatangabe richtig interpretiert wird.
Oder liegt in meinem vorherigen Programmsegment für das Einlesen in *mem ein Fehler vor?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
- ProgOldie
- Beiträge: 236
- Registriert: 19.05.2012 17:09
- Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Ein weiterer Fehler liegt offensichtlich in den Textformaten. Folgende Lösung funktioniert z.B. mit Dateien *.TXT oder *.pb, obwohl ich nicht weis, warum.
Das ist mir soweit klar, nicht aber der folgende Aufruf mit anderer Textcodierung, der aber - außer bei Umlauten (ä,ö..) -
korrekte Ergebnisse liefert:
Wie kann man sich das erklären? Was muss man ändern, damit auch die Umlaute korrekt dargestellt werden?
Code: Alles auswählen
If FilePathName
TextFormat=#PB_Unicode
If ReadFile(0, FilePathName,TextFormat)
While Eof(0) = 0
LineText=LineText+ReadString(0,TextFormat)+Chr(10)
Wend
*mem=AllocateMemory(StringByteLength(LineText,TextFormat))
CopyMemory(@LineText, *mem,StringByteLength(LineText,TextFormat))
SetGadgetData(BtnGadNr,*mem)
CloseFile(0)
EndIf
EndIf
korrekte Ergebnisse liefert:
Code: Alles auswählen
*mem=GetGadgetData(BtnGadNr)
OldText=PeekS(*mem,-1,#PB_UTF8)
MessageRequester("Inhalt der Textdatei",OldText)
Zuletzt geändert von ProgOldie am 15.01.2018 11:14, insgesamt 3-mal geändert.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Einfacher ist es hier auch mit Strukturen zu arbeiten. Somit entfällt PokeS und PeekS
Code: Alles auswählen
Structure udtMyGadgetData
text.s
EndStructure
*mem.udtMyGadgetData = AllocateStructure(udtMyGadgetData)
*mem\text = "Hallo Welt"
Debug *mem\text
FreeStructure(*mem)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- ProgOldie
- Beiträge: 236
- Registriert: 19.05.2012 17:09
- Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Der Zugriff ist zugegeben einfacher, vor allem mit den problematischen PeekS(). Aber die Probleme mit den Umlauten bleiben bei folgender Lösung:
Code: Alles auswählen
Structure GadgetTextData
Inhalt.s
EndStructure
............................
If FilePathName
*mem.GadgetTextData=AllocateStructure(GadgetTextData)
TextFormat=#PB_UTF8
If ReadFile(0, FilePathName,TextFormat)
While Eof(0) = 0
LineText=LineText+ReadString(0,TextFormat)+Chr(10)
Wend
*mem\Inhalt=LineText
SetGadgetData(BtnGadNr,*mem)
CloseFile(0)
EndIf
EndIf
..............................
*mem=GetGadgetData(BtnGadNr)
OldText=*mem\Inhalt
MessageRequester("Inhalt der Textdatei",OldText)
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Re: BindGadgetEvent. Zugriff auf Programmvariablen
ist die eingelesene Textdatei wirklich im UTF-8-Format?
Win11 x64 | PB 6.00 (x64)