Moin!
1. Der Code ist schwer durchschaubar.
2. Du hast haufenweise Resourcen-Lecks (neues Bitmap in der Grösse 1280x1024 in 24 Bit anlegen, einmal faden und beim nächsten mal mit einem neuen Bild überschreiben)
3. Du hast nix mal probeweise auf 32 Bit umgestellt
4. die Routinen sind z.T. wirklich langsam geschrieben
5. Ein wenig Assembler würde da nochmehr tun
6. Du hast haufenweise Bitmaps die immer wieder neu zugewiesen werden oder überschrieben werden
7. Du malst nicht im OnPaint der Form, auf der du direkt malst
8. Von den Klassen ist das ja alles eine gute Idee, aber nicht weit genug gedacht. Warum nicht einfach der Draw Klasse das Canvas direkt beim Create geben und gut? Dann muss man doch nur noch beim Paint einmal die Draw Klasse anschupsen
9. Spare dir Malereien und nutze Invalidate/InvalidateRect und das ClipRect vom Canvas im Zusammenhang mit IntersectRect()
10. Versuche auch mal mehr die
WinAPI zu nutzen - zumindest an den wichtigen Stellen - BitBlt() ist schneller als das Draw() und es kümmert sich sogar darum, das die Farben stimmen im Ziel HDC...
11. Bei einem Click wird das Draw 2x aufgerufen (noch nicht behoben) - woher der andere Aufruf auch immer kommen mag.
12.
Unit IdXXX und Types war nicht mit dabei und anscheinend nicht benötigt - habe ich auskommentiert. Ich benutze Delphi 5 Prof.
13. Du hast dir extra Types für den Scanline Zugriff geschrieben - aber Windows.pas definiert sowas schon
14. Deine alten Proceduren haben öfters Grün und Blau vertauscht. Benutze den in Windows.pas definierten Type und es ist eindeutiger.
15. Wenn er mal wieder meckert, das TBitmap Variablen keine Klassen sind: Abhilfe schafft das einbinden der Graphics nach der Windows
Unit in der Uses Liste, dann wird der TBitmap Record Typ nach hinten gestellt.
Ich habe hier mal ein wenig an manchen Stellen ein bischen was gedreht und das Programm Faded zumindest und die Routinen brauchen nicht mehr soo lange - und sind zumindest gleich schnell...
Ich habe zum Debugging den Trick eingesetzt vorne in der Delphi Projektdatei ein {$APPTYPE CONSOLE} einzufügen. Dadurch werden WriteLn() Ausgaben möglich und es wird ein Konsolenfenster geöffnet. Um die WriteLn() nach dem entfernen von {$APPTYPE CONSOLE} zu einer
Exception werden zu lassen, kannst du vor jedem Writeln ein If IsConsoleApp Then schreiben, dann gibt es keine
Exception wenn du nachher einfach das {$APPTYPE CONSOLE} entfernst.
So, genug gemeckert. Wenn du das vielleicht mal einzeilig die Procedurendefinitionen dokumentierst, dann kann ich bestimmt noch mehr drehen, aber so sehe ich nicht durch.
MfG
Muetze1