AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TExpander unter Delphi 10.4.2 Fehler

Ein Thema von skoschke · begonnen am 18. Mär 2021 · letzter Beitrag vom 19. Mär 2021
Antwort Antwort
Seite 1 von 2  1 2      
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#1

TExpander unter Delphi 10.4.2 Fehler

  Alt 18. Mär 2021, 09:39
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 18. Mär 2021, 10:17
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;
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 18. Mär 2021, 17:38
Danke, den Ansatz werde ich mal ausprobieren

Ciao
Stefan
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 19. Mär 2021, 06:06
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

Geändert von skoschke (19. Mär 2021 um 06:22 Uhr)
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 19. Mär 2021, 06:34
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 19. Mär 2021, 07:53
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 19. Mär 2021, 07:55
Sind TCanvas.Width und TCanvas.Height größer null?
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.174 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 19. Mär 2021, 08:03
Image1 hat einen Parent?
  Mit Zitat antworten Zitat
Michael II
Online

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

AW: TExpander unter Delphi 10.4.2 Fehler

  Alt 19. Mär 2021, 08: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 08:34 Uhr)
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: TExpander unter Delphi 10.4.2 Fehler

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

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

Geändert von skoschke (19. Mär 2021 um 09:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
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