Autor Beitrag
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Di 23.04.13 01:56 
Delphi 2007, Win7 32bit

Guten Morgen,

ich zeichne in eine TPaintBox des Hauptformulars eine Grafik (TBitMap). Wenn das Programm läuft (oder auch im Run-Mode) und ein anderes Programm (egal welches, Explorer, Notpad ...) legt sich über mein Programm-Fenster, wird von meiner Grafik alles unter dem anderen Fenster gelöscht - mit Bewegen dieses anderen Fensters kann ich die gesamte Grafik "ausradieren".

Welche Einstellungen der TPaintBox oder des TBitMap oder der TForm sind da falsch oder nicht gesetzt?

Die TPaintBox ist in der TForm declariert,
die TBitMap in TForm public declariert und wird beim Erzeugen der Form created.

Dazu noch die Frage: Es gibt in der Tool-Palette zwar TImage, aber kein TBitMap. Oder finde ich dies nur nicht.

Danke :)


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 23.04.2013 um 09:34
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 23.04.13 07:15 
Dann zeichnest du fälschlicherweise nicht im OnPaint der PaintBox. ;-)
www.michael-puff.de/...ffScreenBitmap.shtml

Für diesen Beitrag haben gedankt: MeierZwoo
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 23.04.13 08:24 
Und TImage ist eine Komponente zur Darstellung verschiedener Grafikformate, TBitmap hingegen eine Klasse zur Verwaltung des Formats Bitmap.

Für diesen Beitrag haben gedankt: MeierZwoo
MeierZwoo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Di 23.04.13 10:10 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Dann zeichnest du fälschlicherweise nicht im OnPaint der PaintBox. ;-)

Paßt, danke, nun ist auch das (geringfügige) Flackern beim Verschieben weg :)

Warum das OnPaint Ereignis aufgerufen wird aber richtigerweise noch nichts "tut", ist mir allerdings noch ein Rätsel. Mit Repaint führt es alles aus, aber teils auch ohne Repaint.

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Und TImage ist eine Komponente zur Darstellung verschiedener Grafikformate, TBitmap hingegen eine Klasse zur Verwaltung des Formats Bitmap.

... ich lerne noch OOP, hab da einige Lücken :( 30 Jahre zwangsgesteuertes PASCAL (u.a.) hinterlassen Denkstrukturen, die nicht so leicht veränderbar sind.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 23.04.13 10:44 
user profile iconMeierZwoo hat folgendes geschrieben Zum zitierten Posting springen:
Warum das OnPaint Ereignis aufgerufen wird aber richtigerweise noch nichts "tut", ist mir allerdings noch ein Rätsel. Mit Repaint führt es alles aus, aber teils auch ohne Repaint.
OnPaint wird aufgerufen, wenn Windows dem Control Bescheid gibt (mit der Botschaft WM_PAINT), dass es neugezeichnet werden muss. Das passiert z.B. automatisch, wenn das Fenster neu erstellt wird.

Mit Repaint sagst du unabhängig davon Bescheid, dass der Inhalt neu gezeichnet werden muss und Windows löst dann auch brav das Neuzeichnen aus. ;-)
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 23.04.13 13:27 
ich denke du erstellst erst ein "Bild" und lässt dies dann zeichnen oder? (mit Canvas.Draw(0,0 gezeichnetesBild) )
zeichne nun einfach nicht in die paintbox sondern auf ein Bitmap (aktuelles bild), und schreibe ins onpaint der paintbox
PaintboxX.Canvas.Draw(0,0, aktuellesBild)

dadurch verhinderst du1. das Zeichnungen direkt gesehen werden (render Problem), ebenfalls flackert es dadruch nicht so...
2. ist kann man es dann einfach wieder übermalen...

stell dir vor:
du machst ein Foto (bild Zeichnung) und du willst was umstellen, was aber wenn der Fotoapparat noch ein Foto macht, während du umstellst? deshalb mache das so, dass du wenn du fertig umgestellt hast sozusagen ein Foto machst, und die ganze zeit dieses Foto anzeigst, bis du wieder fertig gezeichnet hast...

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
MeierZwoo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Di 23.04.13 13:31 
jaenicke, Mißverständnis:

Mit "nichts tut" meinte ich, OnPaint wird aufgerufen, aber es "passiert nichts" (die dort angegeben Grafiken werden nicht gezeichnet).

Ich lasse ein Protokoll mitschreiben, damit ich es etwas kontrollieren/verstehen kann: Dort sieht man den Einsprung in OnPaint (z.B. beim Programmstart, ...), aber der Bildschirm bleibt leer (soll er auch zu diesem Zeitpunkt).

Nun habe ich das Zuweisen der Handle (TBitMap.HandleAllocated) mit protokollieren lassen, und damit ist es klar: Wenn den in OnPaint zu zeichnenden BitMaps noch kein Handle zugewiesen wurde (z.B. bei CreateForm), kann und soll auch nichts "passieren". Mir war nur nicht klar, daß OnPaint das Handle abfragt - ich hatte mit einem Fehler gerechnet, wenn die BitMaps noch nicht initialisiert ist.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
(Protokoll)
FormCreate
--------> RsPaintBox.RsOnPaint Handles: TempBmp FALSE  Bmp2 FALSE [1]
...
User-Aktion -> procdure zeichnen
zeichnen
zeichnen: TempBmp geladen
zeichnen: TempBmp gesetzt
--------> RsPaintBox.RsOnPaint Handles: TempBmp TRUE   Bmp2 FALSE [2]
zeichnen: Bmp2 geladen
zeichnen: Bmp2 gesetzt  
zeichnen: RsPaintBox.RePaint
--------> RsPaintBox.RsOnPaint Handles: TempBmp TRUE   Bmp2 TRUE  [3]
...
FormDestroy

[1] und [2] sind vom System ausgelöste RsPaintBox.OnPaints,
[3] von "mir" per RePaint ausgelöst.

Ich muß mich auch erst an Handles u.s. gewöhnen. Mir war nur wichtig, zu gewährleisten, daß beim Programmstart noch nichts "passiert", erst nach einer User-Aktion - und das ist nun so OK
:)
MeierZwoo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Di 23.04.13 13:51 
IhopeonlyReader, ich zeichne nicht auf/in der/die PaintBox. Ich lasse eine/mehrere BitMaps ausgeben. Das Zauberwort war in der ersten Antwort ganz oben schon gegeben: "OnPaint". Damit war das Problem des Ausradierens gelöst (20 min Tippselei).

Die weitere Diskussion ging nur um mein Verständnis des OnPaint Ereignisses. Vorallem weil OnPaint ja statisch ist - über die gesamte Laufzeit (es sei denn, man ändert die BitMaps, die dort "gezeichnet" werden.

:)