<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Canvas-Problem]]></title><description><![CDATA[<p>Guten Tag!</p>
<p>Ich programmiere nun seit einigen Jahren C++ beruflich, hatte jedoch bislang noch nicht mit graphischer Ausgabe zu schaffen. Da eine graphische Ausgabe beim aktuellen Projekt unentbehrlich ist musste ich mein Wissen in diesem Gebiet erweitern.<br />
Ich programmiere in der Borland Developer Studio Umgebung (C++ Builder).</p>
<p>Derzeit Zeichne ich auf einer dynamischen unsichtbaren TImage-Componente [Puffer] (direkt auf den Canvas) Striche und Punkte einer komplexen Berechnung.<br />
Bei einem Mouseover-Event einer sichtbaren TImage-Componente, welche für die reale Graphische Ausgabe zuständig ist, wird zuerst mit CopyRect der Inhalt der oben genannten dynamischen Componente in eine neue Dynamische Componente kopiert, die jeweilie Berechnung an der Stelle ausgeführt und darauf gezeichnet und das ganze Ergebnis dann per CopyRect auf die sichtbare TImage-Componente übertragen.</p>
<p>Mein Problem ist folgendes:<br />
Nach einiger Zeit, in der dieses Prinzip wunderbar funktioniert hat, gleich ob man über das Bild gefahren ist oder nicht, aber nicht in festem Zeitabschnitt, passiert folgendes: Es werden keinerlei aktualisierungen mehr automatisch auf die sichtbare TImage-Componente übertragen, jedoch die Berechneten Werte ausgegeben, wenn ich darüber fahre, aber sie vermischen sich mit den vorigen, sodass nur noch ein gemisch aus den, seit dem der Fehler aufgetreten ist, gezeichneten Canvas zu sehen ist, so als würde er sie nicht löschen.</p>
<p>Ich bitte Sie mir zu sagen, wo eventuell das Problem liegt, mache ich einen generellen Fehler?<br />
Vielen Dank schon einmal im voraus für die Hilfe. Ich bitte Sie jedoch um Gnade, da mein Wissen im Bereich der graphischen Ausgabe noch sehr beschränkt ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Mit freundlichen Grüßen<br />
Michael C.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172567/canvas-problem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 11:30:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172567.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Feb 2007 11:55:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 11:55:21 GMT]]></title><description><![CDATA[<p>Guten Tag!</p>
<p>Ich programmiere nun seit einigen Jahren C++ beruflich, hatte jedoch bislang noch nicht mit graphischer Ausgabe zu schaffen. Da eine graphische Ausgabe beim aktuellen Projekt unentbehrlich ist musste ich mein Wissen in diesem Gebiet erweitern.<br />
Ich programmiere in der Borland Developer Studio Umgebung (C++ Builder).</p>
<p>Derzeit Zeichne ich auf einer dynamischen unsichtbaren TImage-Componente [Puffer] (direkt auf den Canvas) Striche und Punkte einer komplexen Berechnung.<br />
Bei einem Mouseover-Event einer sichtbaren TImage-Componente, welche für die reale Graphische Ausgabe zuständig ist, wird zuerst mit CopyRect der Inhalt der oben genannten dynamischen Componente in eine neue Dynamische Componente kopiert, die jeweilie Berechnung an der Stelle ausgeführt und darauf gezeichnet und das ganze Ergebnis dann per CopyRect auf die sichtbare TImage-Componente übertragen.</p>
<p>Mein Problem ist folgendes:<br />
Nach einiger Zeit, in der dieses Prinzip wunderbar funktioniert hat, gleich ob man über das Bild gefahren ist oder nicht, aber nicht in festem Zeitabschnitt, passiert folgendes: Es werden keinerlei aktualisierungen mehr automatisch auf die sichtbare TImage-Componente übertragen, jedoch die Berechneten Werte ausgegeben, wenn ich darüber fahre, aber sie vermischen sich mit den vorigen, sodass nur noch ein gemisch aus den, seit dem der Fehler aufgetreten ist, gezeichneten Canvas zu sehen ist, so als würde er sie nicht löschen.</p>
<p>Ich bitte Sie mir zu sagen, wo eventuell das Problem liegt, mache ich einen generellen Fehler?<br />
Vielen Dank schon einmal im voraus für die Hilfe. Ich bitte Sie jedoch um Gnade, da mein Wissen im Bereich der graphischen Ausgabe noch sehr beschränkt ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Mit freundlichen Grüßen<br />
Michael C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223758</guid><dc:creator><![CDATA[Michael C.]]></dc:creator><pubDate>Tue, 06 Feb 2007 11:55:21 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 11:57:13 GMT]]></title><description><![CDATA[<p>Das ist eher was für &quot; VCL/CLX (Borland C++ Builder)&quot;. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223761</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 06 Feb 2007 11:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 12:17:23 GMT]]></title><description><![CDATA[<p>Da haben Sie wohl recht. Eventuell ist ein Administrator zugegen, der den Beitrag verschieben könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223776</guid><dc:creator><![CDATA[Michael C.]]></dc:creator><pubDate>Tue, 06 Feb 2007 12:17:23 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 12:28:40 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>Derzeit Zeichne ich auf einer dynamischen unsichtbaren TImage-Componente [Puffer]</p>
</blockquote>
<p>Dazu benutzt man aber TBitmap, nicht TImage.</p>
<blockquote>
<p>Es werden keinerlei aktualisierungen mehr automatisch auf die sichtbare TImage-Componente übertragen, jedoch die Berechneten Werte ausgegeben, wenn ich darüber fahre, aber sie vermischen sich mit den vorigen, sodass nur noch ein gemisch aus den, seit dem der Fehler aufgetreten ist, gezeichneten Canvas zu sehen ist, so als würde er sie nicht löschen.</p>
</blockquote>
<p>Entweder wird der Puffer selber nicht richtig gelöscht/überzeichnet, oder bei CopyRect wird ein Modus verwendet, der statt einen kompletten Übertragen eine Addition von Quelle und Ziel macht (TCanvas::CopyMode)<br />
Auch bei der Verwendung von Threads kann es bei schlechter Synchronisation zu solchen Fehlern kommen.<br />
Aber ohne genauen und relevanten Code können wir da kaum weiterhelfen.</p>
<p>Und der Thread gehört wirklich ins BCB-Forum.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223784</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 06 Feb 2007 12:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 12:41:53 GMT]]></title><description><![CDATA[<p>Ich bezweifle, dass es am CopyMode liegt, da es ja immer anfangs funktioniert! Erst nach einigen Minuten (öfters gar Stunden) beginnt das Problem uns lässt sich nicht mehr rückgängig machen, außer durch eben einen unbefriedigenden Neustart des Programmes.</p>
<p>Ich werde hier ausschnitte des relevanten Codes präsentieren:<br />
Vielleicht ist es auch noch hilfreich zu erwähnen, dass DrawLastResults durch einen Thread aufgerufen wird!</p>
<p>Header der MainGUI:</p>
<pre><code class="language-cpp">...
private:	
TImage* outputBuffer;
TImage* resultsBuffer;
...
</code></pre>
<p>FormCreate von MainGUI:</p>
<pre><code class="language-cpp">...
	outputBuffer = new TImage(this);
	outputBuffer-&gt;Width = outputGraphic-&gt;Width;
	outputBuffer-&gt;Height = outputGraphic-&gt;Height;

	resultsBuffer = new TImage(this);
	resultsBuffer-&gt;Width = outputGraphic-&gt;Width;
	resultsBuffer-&gt;Height = outputGraphic-&gt;Height;
...
</code></pre>
<p>Die Routine DrawLastResults:</p>
<pre><code class="language-cpp">...
	resultsBuffer-&gt;Canvas-&gt;Brush-&gt;Color = clWhite;
	resultsBuffer-&gt;Canvas-&gt;Pen-&gt;Color = clBlack;
	resultsBuffer-&gt;Canvas-&gt;Rectangle(0, 0, resultsBuffer-&gt;Width, resultsBuffer-&gt;Height);

...
	(Viele tausende aufrufe von MoveTo, LineTo, Pixels[x][y], TextOutA, Pen-&gt;Color, Brush-&gt;Color, Rectangle, Circle... auf dem Canvas von resultsBuffer)
...

	outputGraphic-&gt;Canvas-&gt;CopyRect(gRect, resultsBuffer-&gt;Canvas, gRect);
...
</code></pre>
<p>Die Routine OnMouseMove für das Ausgabe&quot;Image&quot;:</p>
<pre><code class="language-cpp">...
	outputBuffer-&gt;Canvas-&gt;CopyRect(gRect, resultsBuffer-&gt;Canvas, gRect);

	outputBuffer-&gt;Canvas-&gt;Pen-&gt;Color = clLtGray;
	outputBuffer-&gt;Canvas-&gt;Font-&gt;Color = clGray;
	outputBuffer-&gt;Canvas-&gt;MoveTo(irgendeinXwert, irgendeinYwert);
	outputBuffer-&gt;Canvas-&gt;LineTo(irgendeinXwert, irgendeinYwert2);
	outputBuffer-&gt;Canvas-&gt;TextOut(einandererXwert, nocheinYwert, &quot;istJaAuchEgal&quot;);
	outputBuffer-&gt;Canvas-&gt;TextOut(einandererXwert2, nocheinYwert2, &quot;istJaAuchEgal2&quot;);

	outputGraphic-&gt;Canvas-&gt;CopyRect(gRect, outputBuffer-&gt;Canvas, gRect);
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1223789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223789</guid><dc:creator><![CDATA[Michael C.]]></dc:creator><pubDate>Tue, 06 Feb 2007 12:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 13:49:30 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=403" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=2" rel="nofollow">VCL/CLX (Borland C++ Builder)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223848</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Tue, 06 Feb 2007 13:49:30 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 14:26:04 GMT]]></title><description><![CDATA[<p>Wenn du mit Threads arbeitest, so mußt du natürlich sicherstellen, daß sich die beiden Routinen DrawLastResults und OnMouseMove nicht gegenseitig beinflussen.</p>
<p>Wenn CopyRect aufgerufen wird, während der andere Thread sich noch in DrawLastResults befindet, so kriegst du natürlich nur unvollkommene Images.</p>
<p>Am besten, du lockst die Threads (evtl. reicht auch eine einfache boolsche Variable).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223876</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 06 Feb 2007 14:26:04 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 14:39:09 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Die Konfliktvermeidung gerade ebi Ausgabeoperationen wird dabei von bei korrekter Verwendung von <a href="http://bcb-tutorial.c-plusplus.net/Thread/artikel5.html" rel="nofollow">TThread::Synchronize</a> übernommen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223890</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 06 Feb 2007 14:39:09 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 19:18:06 GMT]]></title><description><![CDATA[<p>DIe Überschneidung beider Routinen habe ich schon auf mehrere Arten und Weisen unmöglich gemacht, was aber zu keinerlei Veränderung geführt hat, was das &quot;abtürzen&quot; der Grafik betrifft.</p>
<p>Das mit Synchronize ist ein guter Denkanstoß, den ich vorerst mal weiter verfolgen werde.<br />
Leider ist das Problem zwar reproduzierbar, jedoch nicht mit geringem Zeitaufwand.</p>
<p>Vielen Dank bis hierhin!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224049</guid><dc:creator><![CDATA[Michael C.]]></dc:creator><pubDate>Tue, 06 Feb 2007 19:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 20:17:46 GMT]]></title><description><![CDATA[<p>Fehlanzeige.</p>
<p>Synchronize bringt zwar in vielen Fällen die gwünschte Wirkung, jedoch steht auch hierzu in der BCB Hilfe, dass graphische Objekte ThreadSicher sind und auch außerhalb der Synchronize Methode angesprochenwerden können, sofern Lock und Unlock richtig angewandt wurden (habe ich nachgetragen, hat nichts geholfen).<br />
Weitere Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224081</guid><dc:creator><![CDATA[Michael C.]]></dc:creator><pubDate>Tue, 06 Feb 2007 20:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 21:24:22 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich weiß nicht genau, aber ich würde mir mal TCanvas::CopyMode ansehen.?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224108</guid><dc:creator><![CDATA[daniel23]]></dc:creator><pubDate>Tue, 06 Feb 2007 21:24:22 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Tue, 06 Feb 2007 21:58:02 GMT]]></title><description><![CDATA[<p>Hallo Michael,</p>
<p>DrawLastResult zeichnet alles in resultBuffer. Anschließend wird das alles noch in outputGraphic (ist wohl das real im Formular vorhandene TImage Objekt ?) kopiert. Dies ist mir allerdings nicht ganz klar.<br />
Schließlich wird in OnMouseMove dieser Kopiervorgang in outputGraphic ebenfalls durchgeführt, nur mit ein paar zusätzlichen Zeichenvorgängen vorher und den Umweg über outputBuffer.<br />
Ist somit nicht die Anweisung</p>
<pre><code class="language-cpp">outputGraphic-&gt;Canvas-&gt;CopyRect(gRect, resultsBuffer-&gt;Canvas, gRect);
</code></pre>
<p>in DrawLastResult überfällig?</p>
<p>Denn falls outputGraphics das reale TImage Objekt ist, dann würden ja sowohl DrawLastResult als auch OnMouseMove eine Darstellung durchführen. Generell sollte aber in einer Anwendung die finale Präsentation der Grafik nur in einer Funktion statt finden und meist ist das in OnPaint() von der übergeordneten Komponente (meist das Formular) der Fall.</p>
<p>Gruß<br />
Markus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224137</guid><dc:creator><![CDATA[HMarkus]]></dc:creator><pubDate>Tue, 06 Feb 2007 21:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to Canvas-Problem on Thu, 08 Feb 2007 15:03:53 GMT]]></title><description><![CDATA[<p>Nunja.<br />
Es wird innhalb von DrawLastResults eine sehr große und auch ein bis zwei sekunden dauernde Berechnung durchgeführt, welche das visuelle Ergebnis dann in resultsBuffer speichert, sodass die Berechnung nicht bei jedem OnMouseMove neu ausgeführt werden muss.<br />
Am Ende der Berechnung möchte ich das Ergebnis aber auch anzeigen lassen. Beim OnMouseMove werden zusätzlich zu der aktuellen Mausposition zusätzliche Informationen zu dem Diagramm angezeigt. Deswegen müssen beide Funktionen eine Ausgabe auf die Hauptoberfläche tätigen.<br />
Ich habe das ganze jetzt mit Lock() und Unlock() synchronisiert, dadurch sollten keine Überschneidungen mehr stattfinden.</p>
<p>Vielen Dank für Ihre Hilfe. Ich werde mich jetzt anderen im Programm befindlichen Problemen widmen. Auftraggeber hat die graphische Ausgabe erst einmal in den Hintergrund geschoben. Ich melde mich, falls das Problem weiterhin auftauchen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225107</guid><dc:creator><![CDATA[Michael C.]]></dc:creator><pubDate>Thu, 08 Feb 2007 15:03:53 GMT</pubDate></item></channel></rss>