Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 19. Mär 2021, 09:31
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.
Michael Gasser

Geändert von Michael II (19. Mär 2021 um 09:34 Uhr)
  Mit Zitat antworten Zitat