TBGRABitmap Absturz durch .TextSize()
-
- 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()
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.
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) 183-mal heruntergeladen
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: TBGRABitmap Absturz durch .TextSize()
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.
-
- 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()
Hallo,
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.
das ist so nicht richtig.Erstmal ein paar Korrekturen:
* Das Programm stürzt nicht bei BM.TextSize ab, sondern bei BM.Canvas.TextExtent(s).cx
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.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: TBGRABitmap Absturz durch .TextSize()
Dann guck noch mal genau nach.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.
Bwei mir ist es genau andersrum.
Winni
-
- 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()
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.
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.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: TBGRABitmap Absturz durch .TextSize()
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
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
-
- 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()
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.
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: TBGRABitmap Absturz durch .TextSize()
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
Ohne Spass, wenn du ein Beispiel machst, so ist die Sprache relativ egal.

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).
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: TBGRABitmap Absturz durch .TextSize()
@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
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