Seite 1 von 2
aufgezeichnete Daten nach windowwechsel weg?!
Verfasst: 28.12.2005 22:00
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
Verfasst: 28.12.2005 23:12
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.
Verfasst: 29.12.2005 10:10
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?

Verfasst: 29.12.2005 10:26
von roherter
Guck dir mal die Memory-Befehle an (AllocateMemory()!
Und folgende Befehle: ReadData und WriteData
Verfasst: 09.01.2006 22:18
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.
Verfasst: 10.01.2006 07:58
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.
Verfasst: 10.01.2006 08:32
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

Verfasst: 10.01.2006 10:15
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
Verfasst: 10.01.2006 11:23
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.
Verfasst: 22.01.2006 11:49
von steelbasic
@ ts-soft
Vielen Dank für das Beispiel, nun läuft's. Ich werde mich den nächsten Problemen widmen.
Sorry, dass ich mich erst jetzt bedanke, hatte bisher keine Zeit.