Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 05.10.06 22:25 
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:
ausblenden 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(00, FBitmapNormal); /// <<-- ohne die Zeile kommt der Fehler nicht!
        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~

_________________
Aya
I aim for my endless dreams and I know they will come true!
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 05.10.06 22:32 
Die Fehlermeldung bedeutet ja, daß der Canvas nicht "bemalbar" ist. Was hast du dieser property zugewiesen?

_________________
Markus Kinzler.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 05.10.06 22:47 
Was die meldung bedeutet weiß ich ja.. aber woher kommt sie?
Und welches Property meinst du?

_________________
Aya
I aim for my endless dreams and I know they will come true!
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 05.10.06 22:50 
Zitat:
Und welches Property meinst du?
FCANVAS, ist ja eigentlich ein privates Feld(Member), ich vermute aber, das es mit Hilfe einer property gesetzt wird.

_________________
Markus Kinzler.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 05.10.06 23:11 
Ne, ich erstelle es einfach via FCanvas:=TCanvas.Create (Siehe "Colored Button" Tutorial das man hier ganz oft findet)

_________________
Aya
I aim for my endless dreams and I know they will come true!
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 28.10.06 11:54 
Es gibts ja schon diverse Threats zu diesem Thema, aber die helfen mir alle nicht...bei mir kommt dieser Fehler, wenn ich ne weile auf dem Desktop 'rummale'. Es dauert etwas, dann kommt dieser Fehler total oft. Sieht fast so aus, als würde ich zu oft auf den Desktop zugreifen...

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 28.10.06 15:04 
ah, bei mir lags dran, dass der speicher übergelaufen is ;) dafür ists aber ein seltsamer Fehler...

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)