TextWidht von Canvas berechnet Falsch

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Hallo,
die TextWidht Funktion von Canvas berechnet die breite eines Textes Falsch. Allerdings nur unter GTk2 unter GTK1 scheint es zu klappen.
Bei mir berechnet er einfach drei bis vier Zeichen zu Wenig das entspricht in etwa 66 Pixel. Wenn ich die dazurechne z.b. beim Ausrichten des Textes in meiner
"Text Engine" scheint es zu klappen.

Mit einem Grafik Programm habe ich es nach gewiesen. Das TextWidht zu Wenig berechnet.
Könnt ihr es bestätigen ?

Im Übrigen habe ich heute mein Lazarus per SVN auf den Aktuellen Stand gebracht. Ich verwende die SVN Version 0.9.27.
Könnt ihr den Fehler bestätigen ? Wenn es ein BUG ist sollte er im Bug Tracker eingetragen werden. Besten Dank !
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: TextWidht von Canvas berechnet Falsch

Beitrag von monta »

Gibts da vielleicht auch nen kleines Beispiel zu ;)
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Gern:
Ihr braucht ein Memo, eine PaintBox und ein Button. Im Button bei OnClick kommt dieser Code rein

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  str:String;
  pw:Integer;
begin
  str:='Hallo';
  PaintBox1.Canvas.Font.Size:=12;
  PaintBox1.Canvas.Font.Name:='Sans';
  PaintBox1.Canvas.Brush.Color:=clBlue;
  PaintBox1.Canvas.Font.Color:=clRed;
  pw:=PaintBox1.Canvas.TextWidth(str);
  PaintBox1.Canvas.FillRect(10,10,10+pw,20);
  PaintBox1.Canvas.TextOut(10,10,str);
  Memo1.Lines.Add(IntToStr(pw));
end;

Allerdings geht dieser Code in der Test Anwendung. Im Eigentlichen Projekt geht das so nicht. Irgendwie finde ich das komisch.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TextWidht von Canvas berechnet Falsch

Beitrag von Christian »

Dann mach doch erstmal n test projekt wo du das nachstellen kannst, bei mir funktioniert das problemlos.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Genau das habe ich auch vor. Das Problem ist halt ich kann es nicht genau abbilden im Test Projekt. Ich glaube der mehrmalige Aufruf von TextWidht ist daran schuld. In meiner "Text Engine" gehe ich so vor:
01) Alle Objekte/Elemente sind in einer TObjectList
02) Alle Objekte haben eine Canvas Variable, diese wird von einer Klasse bereit gestellt die von TCustomControl abgeleitet ist.
beim Erstellen von Objekten wird diese Canvas Variable hinzugefügt.
03) In einer Schleife gehe ich alle Objekte zu, gebe ihn eine Position und noch einige weitere Daten mit und dann zeichne ich.
Wobei jedes Objekt über eine Paint Methode verfügt, wo die Schrift Konfiguration zugewiesen wird.
04) Erst jetzt wird die Breite abgefragt. Komischerweise geht es in dieser Paint Methode Problemlos. Allerdings setzte ich die Schrift Konfiguation auch drei mal und Frage die Breite auch drei mal ab, zwischendurch mache ich noch was anders, lösche ich aber ein Aufruf kommt es zu einem Rechen Fehler.
Um noch einen Oben drauf zu setzten: Unter GTK1 klappt das alles Problemlos nur unter GTk2 macht es Probleme.
Im Groben ist das meine Vorgehensweise, es passiert natürlich noch viel mehr, aber als Überblick sollte das reichen.

Ich werde mal versuchen die Test Anwendung zu erweitern und werde Verschiedene Test machen. Ich denke halt es liegt an dem Ungültigen Handle. TextWidht ruft intern eine API Funktion auf. Die braucht das Handle. Wenn ich es nicht schaffe, den Fehler zu finden:
Kennt ihr noch weitere Schrift System außer die in Lazarus Fest eingebunden sind ? Mit den war ich noch nie zufrieden.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Ich habe weiter geforscht, eine Reproduktion vom Fehler habe ich nicht hinbekommen. Ich habe aber herausgefunden das es an der Eingestellten Schrift Größe liegt.
Je größer die Schrift deso weniger tritt der Fehler auf.
Im Übrigen Tritt der Fehler auch unter GTK1 auf. Meine erste Annahme war Falsch. Es liegt an der jeweiligen Schrift Größe. Auch die Schrift Art wird nicht übernommen. In meiner Test Anwendung klappt alles reibungslos. Zum Posten ist das Projekt zu groß. Anhängen würde gehen....
MFG
Michael Springwald

Benutzeravatar
Garfield
Beiträge: 172
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
CPU-Target: 64Bit
Wohnort: Aken

Re: TextWidht von Canvas berechnet Falsch

Beitrag von Garfield »

pluto hat geschrieben:Allerdings geht dieser Code in der Test Anwendung. Im Eigentlichen Projekt geht das so nicht. Irgendwie finde ich das komisch.

Dann wird der Fehler vermutlich woanders liegen. Da kannst Du nur die Befehle einzeln abarbeiten und die in Frage kommenden Variablen überwachen.
Gruß Garfield

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Das Problem ist auch das der Debugger nicht läuft. So muss ich halt mit writeln an passenden Stellen Abfragen.

Ich finde das verhalten sehr seltsam. Würde sich jemand mein Code mal ansehen ? Im Prinzip ist das noch nicht so viel.
Evlt. Fällt euch ja was auf was ich übersehen habe. So langsam verzweifel ich an dieser Funktion.

Bei der Test Seite wird die Größe Zufällig bestimmt, zwischen 12 und 30.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TextWidht von Canvas berechnet Falsch

Beitrag von Christian »

Dann installier doch endlich mal die Stanble aus den debian repositores, wenn dus immernoch nicht hinbekommen hast den debugger beim svn einzurichten.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Dann installier doch endlich mal die Stanble

Das währe eine Idee. Aber ich glaube der Debugger würde mir hier leider auch nicht helfen. Ich finde einfach die Ursache nicht. Als test währe das sicher Spanend, ob es da läuft.
MFG
Michael Springwald

Benutzeravatar
Garfield
Beiträge: 172
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
CPU-Target: 64Bit
Wohnort: Aken

Re: TextWidht von Canvas berechnet Falsch

Beitrag von Garfield »

pluto hat geschrieben:... Aber ich glaube der Debugger würde mir hier leider auch nicht helfen. ...

Wenn es im Test funktioniert und in der Anwendung nicht, dann ist der Fehler in Deinem anderen Code. Und der Debugger wird Dir zeigen, an welcher Stelle Deine Werte verändert werden. :?
Gruß Garfield

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Wenn es im Test funktioniert und in der Anwendung nicht, dann ist der Fehler in Deinem anderen Code

OK! Aber wenn du meinst das es an meinen Code liegt, wie Erklärst du folgende Beobachtung:
Ich habe die Schrift Arten ausprobiert. Ich habe eine gefunden, mit gleich Großen Buchstaben. Dort treten bisher noch keine Probleme auf. Bei allen anderen hat die Funktion anscheint große Probleme bei bestimmten Schrift Größen. Gut, ich gebe zu es könnte immer noch an meinem Code liege, aber seltsam finde ich es das es mit Schrift Arten klappt, wo jeder Buchstabe gleich Groß ist.

Im IRC habe ich mit einem darüber diskutiert und der meinte es könnte ein Cash Problem sein. Ein Internes. Was nur unter bestimmten Bedingungen Auftreten.
Währe eine Plausibel Erklärung. Und das Problem tritt nur bei bestimmten Schrift Größen aus. Ich denke das sind alles sehr viele Indizien dafür das es ein Internes Problem ist bei TextWidht.

Ich werde gleich mal Anfangen zu versuchen den Code zu reduzieren auf ein Minimum, dazu werde ich das Projekt kopieren und an einem meiner Einträge hängen.

Ich arbeite mit writeln und der Console. An passenden Stellen gebe ich den Inhalt der Variablen aus. Der Debugger macht doch nichts anders. Eine AV kommt leider nicht oder eine andere Fehler Meldung.

Da ich eine Schrift Art gefunden habe die Funktioniert, d.h. mit der TextWidht keine Probleme hat, werde ich ersteinmal weiter machen und das Problem auf später verschieben.

edit01:
bei diesen Schrift Arten treten offenbar keine Probleme mit TextWidht auf:

Code: Alles auswählen

01) courier [adobe]
02) bitstream vera sans mono
03) courier 10 pitch
04) Monospace
MFG
Michael Springwald

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Re: TextWidht von Canvas berechnet Falsch

Beitrag von bembulak »

Pluto, ein Screenshot würde vlt. ein wenig helfen...
Die Schriften, die du aufzählst, sind alle Monospace. Jedes Zeichen benötigt gleich viel Platz, egal ob es ein "a" oder ein "." ist.
Da "muss" es fast funktionieren. Man zählt einfach die Buchstaben und multipliziert sie mit der Breite des Fontsets. Wenn du andere Schriften benutzt, dann sind deren Abstände der Zeichen, bzw. den Platz den ein Zeichen benutzt, nicht gleich. Da geht das mit dem "Anzahl Zeichen * Breite" nicht, sondern man muss jedes Zeichen addieren.
Kann es sein, dass Lazarus (bzw. was auch immer dahinter aufgerufen wird) damit nicht zurecht kommt?
Im Übrigen heißt es "Cache" nicht "Cash". Cash ist Bargeld.

Hier noch ein wenig Hintergrundinfo zu der Sache mit den Fonts:
http://de.wikipedia.org/wiki/Typographie
http://de.wikipedia.org/wiki/Nichtpropo ... Schriftart
http://de.wikipedia.org/wiki/Proportionalschrift

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextWidht von Canvas berechnet Falsch

Beitrag von pluto »

Die Schriften, die du aufzählst, sind alle Monospace

Ja, darum habe ich es mit den Versucht. Wenn die "Multispace" Schriften nicht gehen, dachte ich teste ich die doch mal

Kann es sein, dass Lazarus (bzw. was auch immer dahinter aufgerufen wird) damit nicht zurecht kommt?

Die gleiche Frage habe ich mir auch schon gestellt. Was mich nur stutzig macht das es in meiner Test Anwendung klappt.

Im Übrigen heißt es "Cache" nicht "Cash". Cash ist Bargeld.

Danke ! Meinst du das es auch daran liegen könnte ?

Danke für die Links. Werde ich durcharbeiten.

ein Screenshot würde vlt. ein wenig helfen.

Findest du im Anhang. Ich denke auf den Bild ist es ganz gut zu erkennen. Alle sind "Monospace" bis auf ein Text Element. Das Markierte, im OI kannst du auch sehen welche Schrift Art ich genommen habe.
Dateianhänge
Neu01.jpg
MFG
Michael Springwald

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Re: TextWidht von Canvas berechnet Falsch

Beitrag von bembulak »

Hm, sieht zugegeben etwas komisch aus. Ich würde aber nicht in erster Linie auf einen "Bug" tippen. Es kann schlichtweg einfach sein, dass man etwas beachten muss, von dem du einfach noch nichts weißt. Wenn hier niemand einen Tip zur Breitenmessung von Proportionalschrift hat, würde ich noch im englischen Forum suchen/fragen.
Vielleicht ist schon mal jemand über sowas gestolpert und kennt einen Lösungsweg.

Antworten