Xojo Conferences
XDCMay2019MiamiUSA

Zeichnen im Canvas (Real Studio network user group Deutschland Mailinglist archive)

Back to the thread list
Previous thread: AW: Zeichnen im Canvas
Next thread: Stringshape rotation mit rb 5.5


Probleme mit String Bearbeitung   -   Markus Schnell
  Zeichnen im Canvas   -   Christian Hahn
   Re: Zeichnen im Canvas   -   Andy Fuchs
   Re: Zeichnen im Canvas   -   Stefan Mettenbrink
   Re: Zeichnen im Canvas   -   Michael Köhler <
    Re: Zeichnen im Canvas   -   J. Van Loon
     Re: Zeichnen im Canvas   -   Michael Köhler <
      Re: Zeichnen im Canvas   -   J. Van Loon
   Re: Zeichnen im Canvas   -   Stefan Mettenbrink
    Re: Zeichnen im Canvas   -   Andy Fuchs
     AW: Zeichnen im Canvas   -   Christian Hahn
   Re: Zeichnen im Canvas   -   Dietmar Plaßmann <

Zeichnen im Canvas
Date: 26.04.07 23:57 (Fri, 27 Apr 2007 00:57:23 +0200)
From: Christian Hahn
Hallo, sicherlich eine Anfängerfrage:

In einer separaten Routine lasse ich Linien und Text in einem Canvas
zeichnen

for i= 1 to n
Canvas1.Graphics.DrawLine ...
Canvas1.Graphics.DrawText ...
[msgbox "bla"]
next

Ist das nicht ein Grund, dass das Canvas neu gezeichnet wird, wie es der
User's Guide formuliert? Jedenfalls werden die Linien und der Text nur
gezeichnet, wenn ich in die Schleife z.B. einen msgbox-Befehl einbaue.
In die Canvas.Paint-Routine möchte ich den Vorgang nicht einbauen, weil beim
Programmstart die benötigten Koordinaten-Werte bzw. der Text noch gar nicht
zur Verfügung stehen und ich deshalb immer erst einen Fehler abfangen
müsste.

Wie geht das richtig?

besten Dank, Christian Hahn.

Re: Zeichnen im Canvas
Date: 27.04.07 02:53 (Fri, 27 Apr 2007 03:53:47 +0200)
From: Andy Fuchs
Ein Redraw-Event wird erst aufgerufen, NACHDEM deine Routine fertig ist.
Willst Du 'LiveRedraw', dann musst Du dem System INNERHALB der Schleife Zeit
geben alles neu zu malen,

andy

at 27.04.2007 0:57 Uhr, Christian Hahn wrote:

> Hallo, sicherlich eine Anfängerfrage:
>
> In einer separaten Routine lasse ich Linien und Text in einem Canvas
> zeichnen
>
> for i= 1 to n
> Canvas1.Graphics.DrawLine ...
> Canvas1.Graphics.DrawText ...
> [msgbox "bla"]
> next
>
> Ist das nicht ein Grund, dass das Canvas neu gezeichnet wird, wie es der
> User's Guide formuliert? Jedenfalls werden die Linien und der Text nur
> gezeichnet, wenn ich in die Schleife z.B. einen msgbox-Befehl einbaue.
> In die Canvas.Paint-Routine möchte ich den Vorgang nicht einbauen, weil beim
> Programmstart die benötigten Koordinaten-Werte bzw. der Text noch gar nicht
> zur Verfügung stehen und ich deshalb immer erst einen Fehler abfangen
> müsste.
>
> Wie geht das richtig?
>
> besten Dank, Christian Hahn.

Re: Zeichnen im Canvas
Date: 27.04.07 04:33 (Fri, 27 Apr 2007 05:33:30 +0200)
From: Stefan Mettenbrink
Christian Hahn wrote:

> Wie geht das richtig?

Häng mal ein
canvas.refresh
an oder in Deine Routine.

MfG, Metti.

Re: Zeichnen im Canvas
Date: 27.04.07 14:39 (Fri, 27 Apr 2007 15:39:56 +0200)
From: Michael Köhler <
Oder ein app.DoEvents vielleicht?

Am 27.04.2007 um 05:33 schrieb Stefan Mettenbrink:

> Christian Hahn wrote:
>
>> Wie geht das richtig?
>
> Häng mal ein
> canvas.refresh
> an oder in Deine Routine.
>
> MfG, Metti.

Re: Zeichnen im Canvas
Date: 27.04.07 23:48 (Fri, 27 Apr 2007 15:48:02 -0700 (PDT))
From: J. Van Loon
--- Michael Köhler <<email address removed>> wrote:

> Oder ein app.DoEvents vielleicht?

Gemäss Doku ist app.DoEvents gar nicht für
GUI-Applikationen gedacht und könnte unerwünschte
Nebeneffekte haben.

Genauer erläutert wird das auch unter
<http://ramblings.aaronballman.com/2005/03/Why_Is_AppDoEvents_Evil.html>

Grüsse
Jef

__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

Re: Zeichnen im Canvas
Date: 28.04.07 06:15 (Sat, 28 Apr 2007 07:15:44 +0200)
From: Michael Köhler <
Also in der Sprachreferenz steht folgendes dazu:

Gibt die Kontrolle an REALbasic zurück, damit es ausstehende Events
verarbeiten kann. Der
optionale Parameter gibt an, für wie lange Sie den aktuellen Thread
„schlafen“ legen möchten.
Wenn alle Threads „schlafen“, legt REALbasic sich selbst „schlafen“
und gibt die Kontrolle an das
System. Damit können Sie Applikationen schreiben, die nicht 100% CPU-
Auslastung erzeugen,
wenn sie eine Schleife abarbeiten. Wenn Sie Null Millisekunden
angeben, wird der nächste war-
tende Thread ausgeführt. Ein negativer Wert verhindert das
„Schlafen“. Voreingestellt sind 10 Mil-
lisekunden.

Das steht zwar bei den Consolenanwendungen aber es steht da nicht,
dass es nicht auch für Desktop-Anwendungen benutzt werden kann. Ganz
im Gegenteil, an andere Stelle (App Klasse) steht nämlich folgendes
Beispiel:

Das folgende Beispiel benutzt die DoEvents-Methode. Wenn Sie
PushButtons einmal mit, einmal ohne DoEvents-Methoden, erzeu-
gen, sehen Sie, wie REALbasic mit anderen Aufgaben umgeht, während
die Hauptschleife läuft.
Dim t as Integer
t=Ticks
While t+600>Ticks
App.DoEvents
Wend

In dem Link hätte ich mir mal ein Beispiel gewünscht bei dem DoEvents
Probleme macht. Ich hatte damit noch nie Probleme gehabt was nicht
heißen soll, dass es damit keine Probleme gibt. Das angedeutete
Beispiel mit Window.Resized konnte ich (leider) nicht wirklich
nachvollziehen.

Am 28.04.2007 um 00:48 schrieb J. Van Loon:

> --- Michael Köhler <<email address removed>> wrote:
>
>> Oder ein app.DoEvents vielleicht?
>
> Gemäss Doku ist app.DoEvents gar nicht für
> GUI-Applikationen gedacht und könnte unerwünschte
> Nebeneffekte haben.
>
> Genauer erläutert wird das auch unter
> <http://ramblings.aaronballman.com/2005/03/
> Why_Is_AppDoEvents_Evil.html>
> Grüsse
> Jef
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com

Re: Zeichnen im Canvas
Date: 28.04.07 11:20 (Sat, 28 Apr 2007 03:20:40 -0700 (PDT))
From: J. Van Loon

--- Michael Köhler <<email address removed>> wrote:

> Also in der Sprachreferenz steht folgendes dazu:
>
> Gibt die Kontrolle an REALbasic zurück, damit es
> ausstehende Events verarbeiten kann. [...]
>
> Das steht zwar bei den Consolenanwendungen aber es
> steht da nicht,
> dass es nicht auch für Desktop-Anwendungen benutzt
> werden kann. Ganz
> im Gegenteil, an andere Stelle (App Klasse) steht
> nämlich folgendes Beispiel:

Ich beziehe mich hier auf die Online-Hilfe von Rb
2007r2, wo das genannte Beispiel nicht mehr drin ist
und auch explizit steht:

"However, using DoEvents in a GUI application will
likely cause instability. In effect, you would be
placing a main event loop inside the 'real' main event
loop. You should consider using threads to handle
lengthy operations rather than placing them in the
main thread and calling DoEvents to maintain the
interface."

Ich hab mich ehrlich gesagt nie näher damit
auseinandergesetzt, da ich noch nie eine Situation
hatte, in der das nötig geworden wäre.

Wie Aaron Ballman unter dem bereits erwähnten Link
erläutert, _kann_ App.DoEvents in den allermeisten
Fällen funktionieren und dann aus irgendeinem Grund,
den du eventuell nicht beeinflussen kannst, eben
nicht.

Sich also darauf zu verlassen, dass es funktioniert
würde ich als Programmieren mit Nebeneffekten
bezeichnen, womit du eine potentielle Fehlerquelle in
dein Programm einfügst, die du genausogut hättest
vermeiden können. Ob du den Punkt berücksichtigen
willst, hängt auch davon ab, ob es sich um eine
Anwendung für den persönlichen Gebrauch handelt, oder
ob du das Programm veröffentlichen möchtest.

Was heisst das nun für die ursprüngliche
Fragestellung?
Ich persönlich würde die Grafik in ein Picture der
richtigen Grösse zeichnen und dann im Paint Event
schliesslich das Picture im Canvas anzeigen. Damit
überlässt du effektiv RB die Kontrolle, wann das Bild
gezeichnet wird, kannst aber deine Methode jeweils
dann aufrufen, wenn das Bild neu gezeichnet werden
muss.

Sub Paint(g As Graphics)
if myPicture <> nil then
g.drawPicture myPicture, 0, 0
end if
End Sub

Grüsse,
Jef

__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

Re: Zeichnen im Canvas
Date: 27.04.07 19:07 (Fri, 27 Apr 2007 20:07:02 +0200)
From: Stefan Mettenbrink
Michael Köhler wrote:

> Oder ein app.DoEvents vielleicht?

Was geht schneller?

MfG, Metti.

Re: Zeichnen im Canvas
Date: 28.04.07 09:12 (Sat, 28 Apr 2007 10:12:27 +0200)
From: Andy Fuchs
refresh ist schneller zu tippen, weil's weniger Buchstaben sind. :-)

Ansonsten sind das Äpfel und Birnen, wie Du dem Handbuch entnehmen kannst.

andy

at 27.04.2007 20:07 Uhr, Stefan Mettenbrink wrote:

> Was geht schneller?
>
> MfG, Metti.

Re: Zeichnen im Canvas
Date: 28.04.07 07:16 (Sat, 28 Apr 2007 08:16:15 +0200)
From: Dietmar Plaßmann <
Stefan Mettenbrink wrote:

> Was geht schneller?

Ein refresh oder ein update ist nur ein Kommando an die Eventloop und
wird erst ausgeführt, wenn die Events mal wieder dran sind. Ein
repaint würde sofort ausgeführt, aber das sind jetzt meine
Erfahrungen mit Qt :-) Ob es mit RB genauso ist, weiß ich nicht,
liegt aber nahe.

Dietmar