Und hier nun Original Embarcadero:
Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
var
MyRect: TRectF;
begin
// sets the circumscribed rectangle of the ellipse
MyRect := TRectF.Create(50, 40, 200, 270);
// draws the ellipse on the canvas
Image1.Bitmap.Canvas.BeginScene;
Image1.Bitmap.Canvas.DrawEllipse(MyRect, 40);
Image1.Bitmap.Canvas.EndScene;
end;
Und wieder "Kein Eigentümer der Objektsperre"
Ciao
Stefan
Steht das echt genau so bei Embarcadero? Da wurde doch vergessen, das Bitmap zu erzeugen und diesem eine Grösse zuzuweisen (?).
Funktioniert dies (Code unten) bei dir auch: (?)
Delphi-Quellcode:
...
MyRect: TRectF;
...
MyRect := TRectF.Create(0, 0, 200, 200);
Image1.Bitmap := TBitmap.create;
Image1.Bitmap.Width := trunc(Image1.Width);
Image1.Bitmap.Height := trunc(Image1.Height);
...
Image1.Bitmap.Canvas.BeginScene;
Image1.Bitmap.Canvas.DrawEllipse(MyRect, 40);
Image1.Bitmap.Canvas.EndScene;
...
In deinem Beispiel wird FBeginSceneCount beim EndScene dekrementiert, beim BeginScene jedoch nicht inkrementiert. FBeginSceneCount wird dadurch -1 und die Sache fällt dann so richtig auf in:
Delphi-Quellcode:
function TMonitor.CheckOwningThread: TThreadID;
begin
Result := FOwningThread; // ist dann 0
if Result <> GetCurrentThreadId then
Error(reMonitorNotLocked) // => Fehler
end;
Es wäre gut, wenn dich Delphi bereits in Image1.Bitmap.Canvas.DrawEllipse(MyRect, 40); darauf aufmerksam machen würde, dass dein Bitmap (ich nehm's mal an...) gar keinen Speicher reserviert hat für deinen Kreis.
Und es wäre natürlich auch schön, wenn FBeginSceneCount in einem solchen Problemfall (BitMap leer) korrekt zählen würde.
Letztendlich solltest du es aber mit korrektem Code schaffen, den Kreis ohne Fehler auszugeben.