SetGadgetData() GetGadgetData() ... mehr als einen Wert?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

SetGadgetData() GetGadgetData() ... mehr als einen Wert?

Beitrag von Xaby »

Wie kann ich in einem Gadget mehr als nur einen Wert zuweisen?
Ich hab es mit einer LinkedList versucht und mit einer POINT-Struktur.
Zuweisung klappt, aber abholen kann ich es nicht.

Auch keine Strings.

Eine Möglichkeit wäre folgende:

Wenn ich Werte A:0-255, B:0-255 ... habe

Kann ich ja B*256+A = Wert
speichern. Das geht auch noch mit 4 byte. Aber mit 4 Quads geht's nicht mehr. Oder einem String ...

Ich möchte Daten in einem Gadget speichern, die der Nutzer nicht sehen soll, die ich aber brauche.

Wie funktioniert es mit CreateGadget()?

Gadgets sind doch Objekte, soweit ich das beurteilen kann.
Denn mit ButtonGadget ...
Erstellt man eigentlich ein Gadget-Objekt, welches die Eigenschaften eines Knopfes hat und zeichnet dieses automatisch.

Danach kann ich auf mein Objekt die Funktionen und Prozeduren bzw. Methoden anwenden.

Ich möchte gern mehrere Objekte machen, die nicht in einer globalen LinkedList definiert werden oder sich darin aufhalten.

Ich möchte eine Prozedur machen, die funktioniert, wenn man sie allein aufruft. Und sobald man diese aufgerufen hat, werden automatisch weitere Variablen für mich zurverfügung gestellt, die ich benötige.

Und das muss gehen, ohne dass ich vorher für alle möglichen Eventualitäten eine LinkedList erstelle.

Genau das ist ja der Vorteil von Objekten. Wenn ich die Gadgets dazu missbrauchen könnte, würde mir das schon reichen.

Jemand eine Idee? Oder die Lösung, wie ich ein echtes Objekt mache.

Code: Alles auswählen

Object ...

  Init ()
      Weitere Methoden ...
  Free()

EndObject
Interface ()
Pure Basic Hilfe hat geschrieben: Hinweis: Das Konzept und die Verwendung von Objekten sind hauptsächlich für erfahrene Programmierer gedacht und es ist nicht erforderlich, diese zu verstehen oder sogar zu benutzen, um professionelle Software oder Spiele zu erschaffen.

Code: Alles auswählen

Procedure Hallo\Schreibe(S.s) ;
  
EndProcedure

Interface Hallo
;  Static x.l
  Schreibe(S.s)
  
EndInterface

text.Hallo

text\Schreibe("Test")

So wie ich das jetzt verstanden habe in der Hilfe, kann ich gar keine eigenen Objekte erschaffen, sondern nur Verweise auf vorhandene Objekte, oder wie?

Aus der Hilfe geht nicht hervor wie man die selbst definierten Prozeduren deutlich machen soll. Und Variablen kann ich in meinem Objekt scheinbar auch nicht definieren.

Komisch komisch. Zu Objekten steht wohl was im Forum und zur Objekt-Orientierung in PB.
Wenn die Gadgets das können, muss man es doch auch können :? :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich weise dem Gadget als Data den Pointer zu der Variable oder dem Element einer Liste hinzu, zu der das Gadget gehört.
Und innerhalb einer strukturierten Vairable oder Liste kann ich so viele Informationen speichern, bis ich schwarz werde.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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

Beitrag von ts-soft »

Und hier der Code:

Code: Alles auswählen

Structure mydata
  bla.l
  blub.l
  blubber.s
EndStructure

Define.mydata myblubs
myblubs\bla = 100
myblubs\blub = 4711
myblubs\blubber = "hallo xbaby"

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "") And CreateGadgetList(WindowID(0))
  ButtonGadget(0, 10, 10, 60, 30, "Zeige Data")
  SetGadgetData(0, @myblubs)

  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Break
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            *value.mydata = GetGadgetData(0)
            Debug *value\bla
            Debug *value\blub
            Debug *value\blubber
        EndSelect
    EndSelect
  ForEver
EndIf
ohne viel blubbern :mrgreen:
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
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ja, ist eine Idee.
Aber damit muss man wieder eine globale Liste definieren.

Hier mal was:
http://www.purebasic.fr/german/viewtopi ... +erstellen

Ich suche noch die deutsche Hilfe, denn da war es schön einfach, Objekte zu erstellen.
http://www.webplain.de/turbopascal/downloads.php

Wenn ich ein Objekt mache, was auf LinkedLists basiert, muss ich ja in einer InkludeDatei schon Worte benutzen, um meine LinkedList zu erstellen, die der Nutzer vielleicht für etwas anderes benutzen möchte.

:oops:
Kinder an die Macht http://scratch.mit.edu/
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

Beitrag von ts-soft »

>> Aber damit muss man wieder eine globale Liste definieren.
:freak: warum?

// Nachtrag:
OOP mit Gadgets bringt keine Vorteile

Damit Du siehst das nicht global genötigt wird:

Code: Alles auswählen

Structure mydata
  bla.l
  blub.l
  blubber.s
EndStructure

Procedure BtnClick(Gadget.l)
  Protected *value.mydata = GetGadgetData(Gadget)
  Debug *value\bla
  Debug *value\blub
  Debug *value\blubber  
EndProcedure

Define.mydata myblubs
myblubs\bla = 100
myblubs\blub = 4711
myblubs\blubber = "hallo xbaby"

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "") And CreateGadgetList(WindowID(0))
  ButtonGadget(0, 10, 10, 60, 30, "Zeige Data")
  SetGadgetData(0, @myblubs)

  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Break
      Case #PB_Event_Gadget
        BtnClick(EventGadget()) 
    EndSelect
  ForEver
EndIf
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
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ich hatte die Antwort an AND51 schon angefangen zu schreiben und habe noch versucht eine öffentliche Hilfe zu finden für Pascal in der die Deklaration von Objekten beschrieben ist.
Mein Pascal ist noch für DOS und irgendwie lässt sich der Text nicht rauskopieren.

mmm, werd es mal ausprobieren, ob es auch mit verschiedenen Gadgets und unterschiedlichen:
ts-soft hat geschrieben:Damit Du siehst das nicht global genötigt wird:
SetGadgetData(0, @myblubs)
Und wo definiert ts-soft myblubs?
Define.mydata myblubs

Kann ich innerhalb einer Prozedur eine Variable definieren?
Das wäre dann mein Init() vom Objekt.
Und wie müsste ich das dann machen?

Es soll nur Prozeduren geben. Und maximal eine GadgetVariable.

Dann ist es ja fast wie ObjektOrientierung :mrgreen:

Pascal-Hilfe ...
aber ohne Objekte
http://www.webplain.de/turbopascal/befe ... e+anzeigen
Pascal 7 Hilfe Auszug hat geschrieben:Ein Objekt ist eine Datenstruktur, die eine
bestimmte Anzahl von Komponenten enth„lt.

Syntax:
object
field;
field;
...
method;
method;
end;

Die Komponenten von Objekten sind entweder
Felder (die Daten eines bestimmten Datentyps
enthalten) oder Methoden, die bestimmte
Aktionen mit dem Objekt ausf
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Xaby hat geschrieben: Kann ich innerhalb einer Prozedur eine Variable definieren?
Das wäre dann mein Init() vom Objekt.
Und wie müsste ich das dann machen?

Code: Alles auswählen

Structure obj
  count.l 
EndStructure

Procedure NewObj() 
  *obj.obj = AllocateMemory(SizeOf(obj))
  ProcedureReturn *obj
EndProcedure

Procedure main()
  hWnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,200,100,"leer")
  
  CreateGadgetList(hWnd)
  ButtonGadget(0,0,0,100,100,"button 1")
  ButtonGadget(1,100,0,100,100,"button 2")
  
  *obj.obj = NewObj()
  SetGadgetData(0,*obj)
  *obj = NewObj()
  SetGadgetData(1,*obj)
  
  
  Repeat
    event = WaitWindowEvent()
    
    If event = #PB_Event_Gadget
      gadget = EventGadget()
      *obj = GetGadgetData(gadget)
      *obj\count + 1
      Debug "Der Button " + GetGadgetText(gadget) +  " wurde " + Str(*obj\count) + " mal gedrueckt"
    EndIf 
    
    
  Until event = #PB_Event_CloseWindow
  
EndProcedure:main()
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

Beitrag von ts-soft »

Xaby hat geschrieben: Und wo definiert ts-soft myblubs?
Define.mydata myblubs
Wie man sieht lokal im MainScope, define ist ja wohl niemals global :freak:
Grundregeln nicht kennen, aber OOP umsetzen wollen wo es keinen Sinn macht.
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
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

@edel
Scheint zu funktionieren.

Obwohl ich von deinen Codes immer mehr als begeistert bin.

Würdest du das ganze noch mit EnableExplizit machen
Statische und nicht statische Variablen nicht gleich bennen und den Objekttyp anders als den Objektnamen.

Dann würde ich vielleicht auch genau verstehen, was du gemacht hast.

Du reservierst Speicher, wenn man NewObj() aufruft.
Der Rückgabewert steht dann in *obj drin.
Die Stelle des Pointers legst du im Gadget ab und der Speichert unseren eigentlichen ObjektNamen dadurch.

Später lässt du dir die Stelle wiedergeben, welches Objekt auch benutzt wurde. Und greifst dann auf die Struktur im Speicher zu.

Du hast aber noch kein Beispiel für eine Methode geliefert, du machst die Sache im Rahmen der Main() Prozedur.

Du gehst sehr sparsam mit dem Speicher um :?
Dadurch muss man erstmal genauer hinschauen, wie die Sache funktioniert.

Bei JAVA, Pascal und C++ ... hat man ja gleich eine normale Variable, zu mindest sieht es für den Benutzer so aus.

Die Speicheradresse steht in unserem Gadget als Data.
Und die Methode ist count+1
Und du wendest sie nur auf das eine Objekt an, weil du von der Speicheradresse soweit weggehst, bis count ausgeführt werden kann.

Deine Methode muss sehr schnell sein, oder?

Das heißt, es gibt keine Methoden, die speziell zum Objekt definiert sind.
Ich kann und muss ganz normale Prozeduren machen, die auf die Variablen im Speicher dann zugreifen.
Und den Pointer übergebe ich, wie ich sonst meine Methode anwende.
New a.obj
entspricht:

Code: Alles auswählen

a.l
*obj.obj = NewObj()
 a.l=*obj

a.count+1
ist es bei dir:

Code: Alles auswählen

*obj = a
      *obj \count + 1 
:allright:

@ts-soft
ist wohl schon etwas früh und du bist nicht ganz ausgeruht.
Sinn kann etwas nur haben oder es hat keinen.
Es macht keinen Sinn würde bedeuten, dass es später welchen machen kann. Und das glaubst du ja wohl auch nicht :D
>> Wieso legst du eigentlich fest, wie ich programmieren muss?
>> weißt doch gar nicht, was ich mit meinem Programm machen möchte
>> Objekte haben schon ihren Vorteil. Sicherlich geht es auch ohne, aber es ist ja kein Wettstreit: Wer hält länger aus, ohne ein Objekt zu benutzen!

In PB ist die HauptProzedur schwammig.
Man kann kreuz und quer Variablen definieren oder auch nicht.
Ich hab auch nicht gesagt, dass sie global ist, ich meinte nur, dass sie sich nicht durch einen Aufruf einer Prozedur erstellt, sondern irgendwo im Urwald erstmal vom Nutzer erstellt werden muss.

Ich glaube, man wird nicht drumherum kommen, eine Prüfprozedur zu schreiben. Um in Erfahrung zu bringen, ob das vermeidlich initialisierte Objekt dem Typ entspricht, welchen man benötigt, um eine Methode darauf anwenden zu können.

Ich kenne mich mit Pascal aus, auch dort, wie man Objekte definiert.
Sehr sauber für mein Verständnis.
Ich weiß, worauf es in C ankommt und auch in Java gibt es eine Hauptschleife.
Aber in keiner der Sprachen außer in PB kann man in der Hauptschleife selbst Prozeduren definieren, wenn ich mich da jetzt nicht irre.

In Pascal kann man in Prozeduren Prozeduren definieren, aber immer nur im Deklarationsteil.

Sowas gibt es aber bei Java und C auch nicht.

Am Ende ist wohl der Programmierer für verantwortlich, dass der Code ordentlich und übersichtlich bleibt. :roll:
Kinder an die Macht http://scratch.mit.edu/
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

Beitrag von ts-soft »

Pack den Main in eine Procedure und definiere die strukturierte Variable in
eine Procedure dann haste dasselbe erreicht, mit weniger Aufwand.
Bei Gadgets, die schon als Objekte intern von PB verwaltet werden macht es
keinen Sinn. Für Dinge die nicht autom. von PB verwaltet werden schon
eher.

OOP nur um etwas zu verkomplizieren, den Source unnötig aufzubauschen
macht nunmal keinen Sinn. Ansonsten nutze ich ja auch OOP. Siehe z.B.
die RFile lib in PBOSL, komplett Interface basiert, weil es Sinn macht. Es
macht aber nicht für alles Sinn. Aber Dein Programmierstil kannste halten
wie Du möchtest, der ist wohl genauso blumig wie Du immer schreibst.

Für mich kommt an erster Stelle das Ziel, nicht der Weg, der wird vom Ziel
bestimmt.
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
Antworten