Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TExpander unter Delphi 10.4.2 Fehler (https://www.delphipraxis.net/207378-texpander-unter-delphi-10-4-2-fehler.html)

skoschke 18. Mär 2021 09:39

TExpander unter Delphi 10.4.2 Fehler
 
Hallo,

ich belege per Code einen Expander mit Controls und male auch darauf
Delphi-Quellcode:
  with ExpanderDokumente.Canvas do
  begin
    BeginScene();
    py := 30;
    br := ExpanderDokumente.Width - 10;
    Font.Family := 'Arial';
...
    EndScene();
Das funktionierte unter Delphi 10.3 problemlos, jetzt bekomme ich bei EndScene die Meldung:
"Kein Eigentümer der Objektsperre"

Was ist denn da schon wieder passiert?

Ciao
Stefan

TiGü 18. Mär 2021 10:17

AW: TExpander unter Delphi 10.4.2 Fehler
 
Probiere mal testweise das with aufzulösen, indem du stattdessen eine kurze lokale Variable für den Canvas nimmst.
BeginScene hat auch ein boolschen Rückgabewert, den du vor dem Zeichnen prüfen kannst.

Delphi-Quellcode:
 if MyCanvasVariable.BeginScene then
begin
  //...Drawing...
  MyCanvasVariable.EndScene;
end;

skoschke 18. Mär 2021 17:38

AW: TExpander unter Delphi 10.4.2 Fehler
 
Danke, den Ansatz werde ich mal ausprobieren

Ciao
Stefan

skoschke 19. Mär 2021 06:06

AW: TExpander unter Delphi 10.4.2 Fehler
 
Hallo,

ich habe mal in die Richtung umgebaut:
Delphi-Quellcode:
  c := ExpanderDokumente.Canvas;
  if c.BeginScene then
  begin
    py := 30; // oberste zeichenposition
    br := ExpanderDokumente.Width - 10;
    c.Font.Family := 'Arial';
    c.Font.Size := 12;
    ...
und der if c.BeginScene then Zweig wird nicht durchlaufen, BeginScene scheint also fehlzuschlagen, warum?

Auch in folgendem Code greift BeginScene nicht:
Delphi-Quellcode:
  b := TBitmap.Create;
  if b.Canvas.BeginScene then
  begin
    i := 4;

    b.canvas.EndScene;
  end;
Und ein abgewandeltes Beispiel aus der Embarcadero Doku ebenfalls nicht
Delphi-Quellcode:
  b := TImage.Create(self);
  if b.Bitmap.Canvas.BeginScene then
  begin
    i := 4;

    b.canvas.EndScene;
  end;
Ciao
Stefan

skoschke 19. Mär 2021 06:34

AW: TExpander unter Delphi 10.4.2 Fehler
 
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

TiGü 19. Mär 2021 07:53

AW: TExpander unter Delphi 10.4.2 Fehler
 
Sind andere Threads im Spiel?
Lass dir den BeginSceneCount ausgeben.
Wenn sonst noch keiner BeginScene gerufen hat, dann müsste der ja 0 davor und 1 danach sein.
http://docwiki.embarcadero.com/Libra...eginSceneCount

TiGü 19. Mär 2021 07:55

AW: TExpander unter Delphi 10.4.2 Fehler
 
Sind TCanvas.Width und TCanvas.Height größer null?

TigerLilly 19. Mär 2021 08:03

AW: TExpander unter Delphi 10.4.2 Fehler
 
Image1 hat einen Parent?

Michael II 19. Mär 2021 08:31

AW: TExpander unter Delphi 10.4.2 Fehler
 
Zitat:

Zitat von skoschke (Beitrag 1485482)
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.

skoschke 19. Mär 2021 09:05

AW: TExpander unter Delphi 10.4.2 Fehler
 
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;
Dein Beispiel mit dem TImage funktioniert, nur bkomme ich es nicht hin, dem TExpander Canvas ein Bitmap zu erzeugen :-(

Delphi-Quellcode:
ExpanderDokumente.Canvas.Bitmap.Width:=100;
funktioniert nicht da das ExpanderDokumente.Canvas = Nil und ExpanderDokumente.Canvas.BitMap = Nil ist, ExpanderDokumente.Canvas.Bitmap kann ich nichts zuweisen weil es eine "nur Lesen" Eigenschaft ist...

Ciao
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz