Hi,
ich bin irgendwie ein wenig am verzweifeln... in meinem aktuellen Projekt bekomme ich nach einiger Zeit immer den Fehler "Leinwand/Bild erlaubt kein Zeichnen".
Das Programm selbst ist nur eine TestDemo für meinen eigenen TOpenDialog, sprich nix anspruchsvolles eigentlich.
Auftreten tut der fehler wenn ich eine gewisse anzahl an dateien aufgelistet habe, wieviele genau kann ich nicht sagen.. wenn ich in einen Ordner mit 1000+ Dateien gehe und 3-4mal F5 zum aktualisieren drücke, tritt er auf.. bei einem ordner mit nur wenigen dateien muß ich 2min lang F5 gedrückt halten bis der fehler kommt...
Der Fehler taucht immer auf, sobald ich mit der Maus über eine eigene Button-Komponente gehe (OnMouseEnter -> Invalidate).
Ich hab auch schon versucht das Canvas zu Locken, eine Variable zu setzen ob grad schon gezeichnet wird etc... der fehler tritt trotzdem auf
Ich habe auch mit FastMM schon geprüft ob Speicherleks irgendwo sind, aber selbst nach 100 maligem F5 drücken in dem Ordner mit 1000 dateien ist der Speicherverbrauch unverändert (und solange der Button sich nicht neuzeichnen will kommt der fehler auch nicht).
Ich hab in dem Button, welcher von TButton abgeleitet ist die CN_DRAWITEM Message hiermit überschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure TArcaneImageButton.CNDrawItem(var Message: TWMDrawItem); var SaveIndex: Integer; begin Message.Result:=0; if not currentlyPainting then begin currentlyPainting:=true; with Message.DrawItemStruct^ do begin SaveIndex:=SaveDC(Message.DrawItemStruct^.hDC); FCanvas.Handle:=Message.DrawItemStruct^.hDC; try if FCanvas.LockCount = 0 then begin FCanvas.Lock; FCanvas.Font:=Font; FCanvas.Brush:=Brush; FCanvas.Draw(0, 0, FBitmapNormal); end; finally FCanvas.Handle:=0; FCanvas.Unlock; RestoreDC(Message.DrawItemStruct^.hDC, SaveIndex); end; end; currentlyPainting:=false; Message.Result:=1; end; end; |
Lasse ich die Zeile FCanvas.Draw(..) weg, kommt der fehler nicht.. FBitmapNormal wird einmal im Create erstellt und dann durch die Property gefüllt.
Am ehesten würde ich tippen das aus irgendeinem grund der Pointer vom FBitmapNormal kaputt geht, also das TBitmap sonstwohinzeigt, aber nicht auf seine eigentlichen daten.. allerdings wüsste ich nicht wie das passieren kann
Mir ist eben noch aufgefallen, das der Fehler auftritt, wenn ich sehr oft "SHGetFileInfo" aufrufe um das Icon einer Datei zu bekommen. (Zumindest tritt er nichtmehr auf wenn ich diese Zeile auskommentiere)
Muß ich da evtl irgendwas wieder freigeben? (Allerdings kann das auchnicht sein, da ja FastMM nix entdeckt hat und der result von SHGetFileInfo nur ein Record ist..)
Hoffe mir kann irgendwer irgendwie helfen
Aya~