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?

Code: Alles auswählen

OldText=PeekS(GetGadgetData(BtnGadNr),#PB_Unicode)
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?