Seite 1 von 2
BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 01.01.2018 14:41
von Nordlicht05
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
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 01.01.2018 14:51
von Bisonte
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 :
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
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 01.01.2018 15:20
von Nordlicht05
Das hilft mir weiter! Danke und weiterhin gutes Rutschen

Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 14.01.2018 17:31
von ProgOldie
Super Idee mit der Anbindung eines Speicherbereiches über GadgetData usw.
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
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
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 14.01.2018 21:25
von Bisonte
Leichter Schreibfehler !
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)
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 15.01.2018 08:21
von ProgOldie
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?
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 15.01.2018 10:59
von ProgOldie
Ein weiterer Fehler liegt offensichtlich in den Textformaten. Folgende Lösung funktioniert z.B. mit Dateien *.TXT oder *.pb, obwohl ich nicht weis, warum.
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
Das ist mir soweit klar, nicht aber der folgende Aufruf mit
anderer Textcodierung, der aber - außer bei Umlauten (ä,ö..) -
korrekte Ergebnisse liefert:
Code: Alles auswählen
*mem=GetGadgetData(BtnGadNr)
OldText=PeekS(*mem,-1,#PB_UTF8)
MessageRequester("Inhalt der Textdatei",OldText)
Wie kann man sich das erklären? Was muss man ändern, damit auch die Umlaute korrekt dargestellt werden?
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 15.01.2018 11:02
von mk-soft
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)
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 15.01.2018 11:47
von ProgOldie
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)
Re: BindGadgetEvent. Zugriff auf Programmvariablen
Verfasst: 15.01.2018 13:19
von Andesdaf
ist die eingelesene Textdatei wirklich im UTF-8-Format?