Die eigentliche Frage ist ja schon beantwortet. Man kann auch in der Delphi-Hilfe nach pmNotXor suchen, 2. Eintrag "Bewegungen zwischenspeichern" beschreibt wie man so ein Gummiband programmiert.
Die Variablen ab xpos gehören im private-Abschnitt des Formulars/Klasse deklariert.
Hier wird DHandle zwei mal freigegeben:
Delphi-Quellcode:
ReleaseDC(0, DHandle);
DCanvas.Free;
Einmal direkt und einmal durch den Canvas, der sich als Eigentümer des Handles betrachted.
(Aktuelle Windowsversionen sind zum Glück so stabil, daß sie solche Programmierfehler nicht mit einem Totalabsturz beantworten.)
Deshalb sind auch die Exceptblöcke mit ReleaseDC falsch.
Ist das
Handle einmal dem TCanvas zugewiesen, ist die Variable DHandle überflüssig.
Überprüfen kann man Assigned(DCanvas), sollten diesen dann aber auch mit FreeAndNil(DCanvas) freigeben.