aufgezeichnete Daten nach windowwechsel weg?!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

aufgezeichnete Daten nach windowwechsel weg?!

Beitrag von steelbasic »

Hallo,

meine Zeichen sind nach Taskwechsel weg.
- Wie kann ich dieses verhindern?
- Wie kann ich genau diesen Effekt bewusst ausführen?

Es handelt sich hier um Aufzeichnungsdaten in Form einer Kurve. Diese sollten nicht bei Fensterwechsel verschwinden. Aber auch für eine erneute Aufzeichnung "löschbar sein"!

Code: Alles auswählen

 If StartDrawing(WindowOutput())
    
    
    Box(x,y,2,2,RGB(r, g, b))
    ;Line(30,50,100,100)
    ;Plot(x,y,farbe1$)             ;siehe Farbtabelle
    StopDrawing() 
  EndIf
Viele Grüße
Hein Blöd
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Zeichne auf ein Image, dass du vorher erstellt hast
und zeige das dann immer an, und wenn du aktualisieren
willst, dann überzeichne es einfach mit einer Box
und plotte deine aktuellen Daten.
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Beitrag von steelbasic »

Danke erstmal....

später will ich die Daten in eine Datenbank schreiben und dort auch -auf Befehl- wieder herausholen.

Nur geht es fürs erste nicht einfacher? Ich zeichne schon auf ein Image (Koordinatenkreuz). Die schon geplotteten Boxen sind nur nach Task oder Fensterwechsel weg.

Es gibt also keinen Befehl der diese Fensterdaten in einen Speicher schreibt? Wo also temporäre boxen bis Programmende erhalten bleiben?

:?:
Viele Grüße
Hein Blöd
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Guck dir mal die Memory-Befehle an (AllocateMemory()!
Und folgende Befehle: ReadData und WriteData
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Beitrag von steelbasic »

Hallo,

so richtig weiter gekommen bin ich mit meinem Problem nicht. In der Hilfe habe ich folgendes gefunden:

Code: Alles auswählen

Hinweis: Unter Windows ist es erforderlich, die mittels WindowOutput() direkt in ein Fenster gezeichneten Grafiken nach jedem Verdecken, Minimieren etc. des Fensters manuell neu zu zeichnen ("zu refreshen"). Es ist daher empfehlenswert, Grafiken über ImageOutput() in ein Bild zu zeichnen und dieses als ImageGadget() im Anwendungsfenster darzustellen sowie ggf. mittels SetGadgetState() upzudaten. Windows erledigt dann das Neuzeichnen der Grafiken automatisch. 
Das scheint die Lösung zu sein?! Trotzdem komme ich nicht weiter. Hat einer von Euch eine Idee wie das geht? Bisher zeichne ich Linien auf ein Bild, welches ich mit dem VisualDesinger hinterlegt habe (Koordinatenkreuz). diese Linien ergeben später eine Temperaturkurve. Nur sind diese nach jedem Task- Windowwechsel weg.
Viele Grüße
Hein Blöd
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Du musst halt die Events, die dein Window so von sich gibt, abfragen, und, im Falle eines #WM_REPAINT (oder wie das Teil hieß) deine Kurve nochmal zeichnen. Alternativ könntest du natürlich auch ein Ausgangsimage mit deinem "Kreuz" zeichnen, und jedes mal, wenn du eine neue Kurve zeichnen willst, auf eine Kopie dieses Images zeichnen und diese Kopie dann im Fenster anzeigen lassen.
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 »

Er braucht nur das machen, was er als Code zitiert hat. Zeichnen, einem
ImageGadget zu ordnen und schon kein Problem mehr. Wenn er was ändern
will, Neuzeichnen und wieder dem ImageGadget zuordnen.

Da er die Lösung selber gepostet hat, weiß ich nicht, wie man da noch helfen
soll. Besser erklären kann ich es auch nicht :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
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Beitrag von steelbasic »

Moin,

was TS-Soft geschrieben hat ist wohl richtig. Aber genau hier sehe ich den Wald vor lauter Bäumen nicht mehr.

Wo und wie muß ich diese Befehle einsetzen (siehe Codebeispiel ganz oben).

- ImageOutput() in ein Bild zeichnen (kann nich hier mein BMP-Image welches ich mit dem VD hinterlegt habe nehmen?)

- ImageGadget() im Anwendungsfenster

- SetGadgetState()

@ TS-Soft, wenn es nicht viele Zeilen sind, kann Du mir ein kleine Codebeispiel geben? Wäre nett! Ich stecke irgendwie fest oder habe irgendwo immernoch Verständnissprobleme
Viele Grüße
Hein Blöd
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 »

Procedure Drawing(Image.l)
UseImage (Image)
If StartDrawing ( ImageOutput ())
Box (0, 0, ImageWidth (), ImageHeight (), RGB (255, 255, 255))
Ellipse (100, 100, 100, 100, 0)
StopDrawing ()
EndIf
EndProcedure

Picture = CreateImage ( #PB_Any , 200, 200)

If OpenWindow (0, #CW_USEDEFAULT , #CW_USEDEFAULT , 200, 200, #PB_Window_SystemMenu , "Drawing" )
If CreateGadgetList ( WindowID (0))
ImageGadget (0, 0, 0, 200, 200, Picture)
EndIf
Drawing(Picture)
SetGadgetState (0, UseImage (Picture))
Repeat
Select WaitWindowEvent ()
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
EndIf
Oder mit Bild:

Code: Alles auswählen

Procedure Drawing(Image.l)
  UseImage(Image)
  If StartDrawing(ImageOutput())
    Box(0, 0, 100, 100, RGB(255, 255, 255)) 
    Ellipse(100, 100, 100, 100, 0) 
    StopDrawing() 
  EndIf
EndProcedure

;Picture = CreateImage(#PB_Any, 200, 200)
Picture = LoadImage(#PB_Any, "MeinBild.bmp")

If OpenWindow(0, #CW_USEDEFAULT, #CW_USEDEFAULT, 200, 200, #PB_Window_SystemMenu, "Drawing")
  If CreateGadgetList(WindowID(0))
    ImageGadget(0, 0, 0, 200, 200, Picture)
  EndIf
  Drawing(Picture)
  SetGadgetState(0, UseImage(Picture))
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
EndIf
Das Original kannste auch mit CopyImage sichern, um es vorm ändern der Zeichnung wieder zurückzukopieren.
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
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Beitrag von steelbasic »

@ ts-soft

Vielen Dank für das Beispiel, nun läuft's. Ich werde mich den nächsten Problemen widmen. :allright:

Sorry, dass ich mich erst jetzt bedanke, hatte bisher keine Zeit.
Viele Grüße
Hein Blöd
Antworten