TBGRABitmap Absturz durch .TextSize()

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

TBGRABitmap Absturz durch .TextSize()

Beitrag von aro »

Es gibt viele Gründe weshalb man die tatsächliche Länge benötigt, die ein String in einem Bitmap belegt hat, oder belegen wird.

Bei einem TBitmam klappt das mit "BM.Canvas.TextExtent(s).cx;"

Bei TBGRABitmap kommt es zu falschen Werten oder zum Absturz des Programms

Lazarus Version #: 2.0.0 + dfsg-2
Linux 64-Bit - Kernel 5.10.18 - amd64 - desktop
bgrabitmap-11.3.1.zip

procedure TForm1.Button1Click(Sender: TObject);
var BM : TBGRABitmap;
i, Adv, Adv1 : integer;
c : Char;
s : string;
begin
BM := TBGRABitmap.Create(100, 32, BGRABlack);
BM.FontHeight := 16;
C := 'A';
for i := 0 to 20 do begin
s := C + ' ';
Adv := BM.Canvas.TextExtent(s).cx; // Breite des Strings
Adv1 := BM.TextSize(s).cx;
inc(c);
end;
BM.Free;
end;


Adv := BM.Canvas.TextExtent(s).cx; - ergibt Werte, die 1-2 Pixel zu wenig sind!
Adv1 := BM.TextSize(s).cx; - ergibt beim ersten Aufruf den richtigen Wert
- bei mehrmaligem Aufruf wird eine Exception ausgelöst und das Programm Stürzt ab.
Dateianhänge
Daten.zip
(4.97 KiB) 28-mal heruntergeladen

Benutzeravatar
Winni
Beiträge: 913
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von Winni »

aro hat geschrieben:
Fr 23. Apr 2021, 13:27
Es gibt viele Gründe weshalb man die tatsächliche Länge benötigt, die ein String in einem Bitmap belegt hat, oder belegen wird.

Bei einem TBitmam klappt das mit "BM.Canvas.TextExtent(s).cx;"

Bei TBGRABitmap kommt es zu falschen Werten oder zum Absturz des Programms

Lazarus Version #: 2.0.0 + dfsg-2
Linux 64-Bit - Kernel 5.10.18 - amd64 - desktop
bgrabitmap-11.3.1.zip

procedure TForm1.Button1Click(Sender: TObject);
var BM : TBGRABitmap;
i, Adv, Adv1 : integer;
c : Char;
s : string;
begin
BM := TBGRABitmap.Create(100, 32, BGRABlack);
BM.FontHeight := 16;
C := 'A';
for i := 0 to 20 do begin
s := C + ' ';
Adv := BM.Canvas.TextExtent(s).cx; // Breite des Strings
Adv1 := BM.TextSize(s).cx;
inc(c);
end;
BM.Free;
end;


Adv := BM.Canvas.TextExtent(s).cx; - ergibt Werte, die 1-2 Pixel zu wenig sind!
Adv1 := BM.TextSize(s).cx; - ergibt beim ersten Aufruf den richtigen Wert
- bei mehrmaligem Aufruf wird eine Exception ausgelöst und das Programm Stürzt ab.

Hi!

Erstmal ein paar Korrekturen:
* Das Programm stürzt nicht bei BM.TextSize ab, sondern bei BM.Canvas.TextExtent(s).cx

Erstens ist der Canvas etwas, das BGRAbitmap mit von der LCL geerbt hat. Und TextExtent ist etwas, das schon bis vor 10 Jahren bei Delphi falsche Werte und Exceptions lieferte. Hat Lazarus anscheinend "geerbt".

Zweitens: warum besteht Anlass den Canvas überhaupt zu benutzen? Du hast den direkten Zugriff auf die BGRAbitmap, Du hast den BGRAcanvas, Du hast den BGRAcanvas2D. Ich habe den canvas einer BGRAbitmap noch nie benutzt und ich kenne auch keinen Code, der das tut. Da kann ich ja gleich bei der TBitmap bleiben. Und da das so ist, bist Du der erste, dem das auffällt.

Jedes Interface kann bei unsachgemäßer Anwendung geknackt werden!

Du solltest den Fehler im internationalen Forum im BGRA Board anzeigen, damit Circular sich darum kümmert.

Winni

PS.: BGRAbitmap.canvas.TextWidth bzw. TextHeight klappt ohne Probleme.
Sehr erstaunlich, da TextExtend beide aufruft.

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von aro »

Hallo,
Erstmal ein paar Korrekturen:
* Das Programm stürzt nicht bei BM.TextSize ab, sondern bei BM.Canvas.TextExtent(s).cx
das ist so nicht richtig.

BM.Canvas.TextExtent(s).cx habe ich nur in der Demo um zu zeigen, das die angezeigten Werte Falsch sind, was man im Schritt betrieb testen kann, und keine Möglichkeit besteht den richtigen Wert zu erhalte.

Wenn ich BM.Canvas.TextExtent(s).cx im Programm behalte und BM.TextSize als Kommentar setze, kann ich die Schleife beliebig oft laufen lassen ohne das das Programm abstürzt.

Wenn BM.TextSize im Programm behalte und BM.Canvas.TextExtent(s).cx als Kommentar setze, dann stürzt das Programm ab.

Benutzeravatar
Winni
Beiträge: 913
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von Winni »

aro hat geschrieben:
Di 27. Apr 2021, 14:39
Hallo,

Wenn ich BM.Canvas.TextExtent(s).cx im Programm behalte und BM.TextSize als Kommentar setze, kann ich die Schleife beliebig oft laufen lassen ohne das das Programm abstürzt.

Wenn BM.TextSize im Programm behalte und BM.Canvas.TextExtent(s).cx als Kommentar setze, dann stürzt das Programm ab.
Dann guck noch mal genau nach.
Bwei mir ist es genau andersrum.

Winni

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von aro »

Hallo,

ich habe noch mal alles überdacht und die wahrscheinliche Ursache gefunden. Der Beispieltext war ja nur ein Auszug aus einen umfangreichen Projekt. Das Projekt war ursprünglich für den Raspi entstanden und zu einer Zeit als an TBGRABitmap noch nicht zu denken war. Ich habe TBitmap in TBGRABitmap geändert und an einer ganz anderen Stelle Canvas.TextExtent(s) benutzt. Nach dem ich die Stelle beseitigt habe, konnte ich auch .TextSize() problemlos verwenden.

Wenn zwei Zugriffsmöglichkeiten bestehen dann sollten auch beide funktionieren. Wenn eine Variante nicht richtig arbeiten sollte man verhindern, das diese überhaupt aufgerufen wird.
Wenn dies nicht gelingt, sollte man wenigstens davor warnen. Ich habe kein Problem auf TBGRABitmap.Canvas komplett zu verzichten, wenn es Alternativen gibt.
Aber lernen auf die harte Tour oder durch Schmerzen muss doch wirklich nicht sein.

Benutzeravatar
Winni
Beiträge: 913
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von Winni »

Hi!

Na, klärt sich doch alles!

Bitte melde den Bug im internationalen Forum im BGRAboard:

https://forum.lazarus.freepascal.org/in ... ,46.0.html

Grüße
Winni

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von aro »

Hallo,

ich sehe da Probleme. Ich hatte eine sehr gute Schulbildung, aber dafür eben kein Englisch in der Schule. Ich habe mir inzwischen selbst so viel beigebracht, das ich Fehlermeldungen und PDF 's über Schaltkreise deuten kann. Aber einen Fachtext wo allein die Wortstellung möglicherweise einen ganz anderen Sinn ergibt, vom deutschen ins englisch mit einen annähernd vernünftigen Satzbau oder Grammatik hinzukriegen, ist eine ganz andere Hausnummer. Da bin ich echt überfordert! Und was der Google - Übersetzer jeweils draus macht ist reine Glückssache. Da wollte ich mich eigentlich nicht auf eine längere Diskussion einlassen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4671
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von af0815 »

Ich kann dich beruhigen, solange der andere eine Ahnung bekommt, wo das Problem ist, reicht das. Auch das Google-Translate ist ganz brauchbar, wenn man keine nativ Speaker Fähigkeiten voraussetzt. Pigdin-English reicht da völlig aus :D

Ohne Spass, wenn du ein Beispiel machst, so ist die Sprache relativ egal.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 913
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TBGRABitmap Absturz durch .TextSize()

Beitrag von Winni »

@aro

Okay, ich mach das denn mal für Dich.

Aber Du musst keine Angst vor English haben: Da behelfen sich Araber, Russen und sonstwer mit Google Translator,

Winni

PS.: Hier: https://forum.lazarus.freepascal.org/i ... 520.0.html

Antworten