![]() |
TExpander unter Delphi 10.4.2 Fehler
Hallo,
ich belege per Code einen Expander mit Controls und male auch darauf
Delphi-Quellcode:
Das funktionierte unter Delphi 10.3 problemlos, jetzt bekomme ich bei EndScene die Meldung:
with ExpanderDokumente.Canvas do
begin BeginScene(); py := 30; br := ExpanderDokumente.Width - 10; Font.Family := 'Arial'; ... EndScene(); "Kein Eigentümer der Objektsperre" Was ist denn da schon wieder passiert? Ciao Stefan |
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; |
AW: TExpander unter Delphi 10.4.2 Fehler
Danke, den Ansatz werde ich mal ausprobieren
Ciao Stefan |
AW: TExpander unter Delphi 10.4.2 Fehler
Hallo,
ich habe mal in die Richtung umgebaut:
Delphi-Quellcode:
und der if c.BeginScene then Zweig wird nicht durchlaufen, BeginScene scheint also fehlzuschlagen, warum?
c := ExpanderDokumente.Canvas;
if c.BeginScene then begin py := 30; // oberste zeichenposition br := ExpanderDokumente.Width - 10; c.Font.Family := 'Arial'; c.Font.Size := 12; ... Auch in folgendem Code greift BeginScene nicht:
Delphi-Quellcode:
Und ein abgewandeltes Beispiel aus der Embarcadero Doku ebenfalls nicht
b := TBitmap.Create;
if b.Canvas.BeginScene then begin i := 4; b.canvas.EndScene; end;
Delphi-Quellcode:
Ciao
b := TImage.Create(self);
if b.Bitmap.Canvas.BeginScene then begin i := 4; b.canvas.EndScene; end; Stefan |
AW: TExpander unter Delphi 10.4.2 Fehler
Und hier nun Original Embarcadero:
Delphi-Quellcode:
Und wieder "Kein Eigentümer der Objektsperre"
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; Ciao Stefan |
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. ![]() |
AW: TExpander unter Delphi 10.4.2 Fehler
Sind TCanvas.Width und TCanvas.Height größer null?
|
AW: TExpander unter Delphi 10.4.2 Fehler
Image1 hat einen Parent?
|
AW: TExpander unter Delphi 10.4.2 Fehler
Zitat:
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:
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.
function TMonitor.CheckOwningThread: TThreadID;
begin Result := FOwningThread; // ist dann 0 if Result <> GetCurrentThreadId then Error(reMonitorNotLocked) // => Fehler end; 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. |
AW: TExpander unter Delphi 10.4.2 Fehler
Delphi-Quellcode:
Dein Beispiel mit dem TImage funktioniert, nur bkomme ich es nicht hin, dem TExpander Canvas ein Bitmap zu erzeugen :-(
...
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;
Delphi-Quellcode:
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...
ExpanderDokumente.Canvas.Bitmap.Width:=100;
Ciao Stefan |
AW: TExpander unter Delphi 10.4.2 Fehler
Hallo Stefan
ich habe rasch (geht ohne eine Zeile Code zu schreiben) TExpander auf TForm geklickt. In TExpander habe ich ein TImage reingesetzt. Im Objektinspektor (oder über Struktur) unter TImage finde ich die Eigenschaft Multiresbitmap. Ich klick drauf, lade ein Bild und lass das Programm laufen. Expander wird angezeigt, ich expandiere, sehe das Bild. Funktioniert. Dann sollte es doch via Code auch funktionieren? |
AW: TExpander unter Delphi 10.4.2 Fehler
Welchen TCanvas-Nachfahren verwendest du denn? Default unter Windows ist ja TCanvasD2D.
|
AW: TExpander unter Delphi 10.4.2 Fehler
Natürlich funktioniert Dein Code hier nicht:
Delphi-Quellcode:
geenauowenig wie Dein anderes Beispiel:
b := TBitmap.Create;
if b.Canvas.BeginScene then begin i := 4; b.canvas.EndScene; end;
Delphi-Quellcode:
Dein Bitmap hat immer die Größe 0,0.
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; Auf welchen Canvas willst Du dann auf welcher Postion malen? Logischerweise funktioniert dann auch kein Canvas.beginscene.... Mit anderen Worten: Das funktioniert:
Delphi-Quellcode:
b := TBitmap.Create (300,300);
if b.Canvas.BeginScene then begin i := 4; b.canvas.EndScene; end; |
AW: TExpander unter Delphi 10.4.2 Fehler
Ach ja und ergänzend zu meiner vorherigen Antwort:
WANN willst Du auf den Canvas "des Expanders" zeichnen? Anders als in der VCL hat in der FMX nicht jedes Control einen eigenen Canvas, sondern es existiert nur ein großer Canvas der Form, der von den einzelnen Controls verwendet wird. D.H. Du kannst nicht einfach irgendwann auf den Canvas zeichnen. Sondern Du machst es in den Events, wenn der Expander gezeichnet werden soll, also z.B:
Delphi-Quellcode:
Dann hast Du einen Canvas, der in diesem Moment frei ist und auch den Canvas-Bereich, der für dieses Control gilt.
procedure TForm38.Expander1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
begin end; |
AW: TExpander unter Delphi 10.4.2 Fehler
Zitat:
Dann kannst du exakt den gleichen Code verwenden wie in #9. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz