BindGadgetEvent. Zugriff auf Programmvariablen

Anfängerfragen zum Programmieren mit PureBasic.
Nordlicht05
Beiträge: 2
Registriert: 01.01.2018 14:25

BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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
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​​
Nordlicht05
Beiträge: 2
Registriert: 01.01.2018 14:25

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag von Nordlicht05 »

Das hilft mir weiter! Danke und weiterhin gutes Rutschen ;-)
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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)
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​​
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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?
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
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag 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)

Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: BindGadgetEvent. Zugriff auf Programmvariablen

Beitrag von Andesdaf »

ist die eingelesene Textdatei wirklich im UTF-8-Format?
Win11 x64 | PB 6.00 (x64)
Antworten