Unicode-Zeichen in TLabel.Caption

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Unicode-Zeichen in TLabel.Caption

Beitrag von photor »

Hallo Forum,

ich hoffe, ich bin richtig hier.

Ich programmiere im Ingenieur- und Technikumfeld. D.h. es gibt viele Parameter, die einzugeben sind, viele davon mit technischen Bezeichnungen - also z.B. gamma mit index M (bisher als "gamma_M") oder sigma Index D ("sigma_D") - oder man hat komplizierte Einheiten (N/mm^2 SQRT(m)). Das würde ich gerne etwas "hübscher" (= besser lesbar) in die GUI aufnehmen.

Da ich den Font für TLabel.Caption nur als Ganzes einstellen kann, sind solche gemischten Texte/Strings nicht möglich. Um im String einzelne Zeichen zu ersetzen, erscheinen mir Unicode-Zeichen als Möglichkeit. Z.B. so funktioniert es zunächst(!) unter Delphi - ich würde es aber auch gerne unter Lazarus nutzen:

Code: Alles auswählen

  // (use the number assigned with HTML-code ...)
  Label22.Caption := #947'_M';  // Safety Factor: gamma_M
  Label23.Caption := #963'_D';  // Stress Knee Point: sigma_D

  // (... or use the Unicode-Hex value like this)
  Label22.Caption := CHR($03B3)+'_M';  // Safety Factor: gamma_M
  Label23.Caption := CHR($03C3)+'_D';  // Stress Knee Point: sigma_D
Beide Varianten ergeben tatsächlich die gewünschten griechischen Symbole (mit dem eingestellten Font Tahoma).

Wie gesagt: das habe ich unter Delphi probiert; ich würde es aber auch gerne für Lazarus (unter Linux) verwenden.
  • gibt es signifikante Unterschiede zwischen Delphi und Lazarus? (natürlich schon im Netz gelesen; bin aber eher verwirrt)
  • Ist es klug, die Zeichen so einzufügen? Oder kaufe ich mir damit Probleme ein?
  • Gibt es "gute" Zeichensätze? Wenn ich das richtig verstanden habe, gibt Unicode nur die "Nummer" an; der Zeichensatz muss das Zeichen auch zur Verfügung stellen.


Es geht mir tatsächlich nur um die Label-Beschriftung; also es soll nichts editiert werden, rein statischer Text. Ich würde halt gerne wissen, ob und wie man das mit Unicode lösen kann, und wo die Unterschiede zwischen Delphi (Win) und Lazarus (Linux) liegen.

Vielleicht weiß ja jemand was.

Ciao,
Photor


PS: Die Indizierung und die komplexen Einheiten kann man auch später in Angriff nehmen; wahrscheinlich wird man da um Grafik nicht herum kommen. Das ist mir im Moment aber noch zu aufwändig.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von theo »

Ich verstehe irgendwie dein Problem nicht.
Unter Unicode sind σ oder γ gleichwertig wie ä oder ü.
Griechisch sollte auch noch in jedem Font vorhanden sein.
Verstehe ich dich falsch?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von Socke »

theo hat geschrieben:
Fr 6. Mai 2022, 18:00
Verstehe ich dich falsch?
Ich denke schon. Unicode ist nicht das Problem, sondern wie man das Unicode Zeichen im Code setzt. Im Objektinspektor geht das bequem per Copy&Paste.

Im Code wird geht es zumindest mit FPC 3.2.2 nicht von Haus aus. System.chr() akzeptiert nur Bytes, was für einen Unicode Code Point über 127 nicht funktioniert.
Das ganze kann man recht einfach lösen. Den Rest erledigt dann die Schriftart.

Code: Alles auswählen

function chr(x: Word):UnicodeChar;  overload; inline;
begin
  Result := Unicodechar(x);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := chr($03C3)+'_M';
end;
Bei der Gelegenheit könnte mit bitte jemand erklären, warum das Konstrukt oben funktioniert, ein direkter Typecast aber nicht. Ich versteh das nicht - sollte doch äquivalent sein?!

Code: Alles auswählen

  Label1.Caption := Unicodechar($03C3)+'_M'; // erzeugt ?_M
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von wp_xyz »

Prinzipiell gibt es da einen "fundamentalen" Unterschied zwischen Delphi und Lazarus: In Delphi sind Strings mit UTF16 kodiert, in Lazarus mit UTF8 (zumindest normalerweise). Bei UTF16 ist ein Char 2 Byte groß, bei UTF8 1 Byte. Um irgendein beliebiges "Zeichen" darzustellen, sind bei Delphi maximal zwei "Delphi-Chars", bei Lazarus 4 "Lazarus-Chars" erforderlich (dazu kommen noch noch Unicode-"Zeichen", die aus einzelnen "Zeichen" zusammengesetzt sind).

Um ein (nicht zusammengesetztes) Zeichen in UTF8 zu finden, kannst du die Lazarus-Zeichentabelle verwenden (im Menü "Bearbeiten"): auf der Seite "Unicode" kannst du in der Combobox den gewünschten Zeichenbereich einstellen, vorher vielleicht mit dem Button rechts daneben alphabetisch sortieren. Die griechischen Zeichen findest du unter "Greek and Coptic" (evtl auch "Greek Extended"). Es gibt auch "Superscripts and Subscripts" mit (einigen) hoch-/tiefgestellten Zeichen.

Möglicherweise kann der vom Editor verwendete Font nicht immer alle Unicode-Zeichen darstellen, z.B. bei Windows kommt das tiefgestellte "m" nur als Box. Zur Laufzeit ist das dann aber in der Regel wieder in Ordnung, sofern du nicht einen ungewöhnlichen Font verwendest. Um trotzdem nicht den Überblick im Code zu verlieren, würde ich die Texte als Konstanten definieren:

Code: Alles auswählen

const
  gamma_m = #$CE#$B3 { gamma }+ #$E2#$82#$98 { tiefgestelltes 'm' };
...
  Label1.Caption := gamma_m + ' =';  
Die Codes zeigt dir wieder die Zeichentabelle an, indem du mit der Maus über das gewünschte Zeichen fährst - links steht der UTF16-Wert, daneben die Abfolge der UFT8-Bytes. Durch einen Klick wird das Zeichen in den Editor kopiert (aber wiegesagt dort nicht immer richtig angezeigt).

Eine andere Variante wäre, ein html-fähiges Label zu verwenden und dort den Text als html-Text "&gamma;<sub>m</sub>" anzugeben. Allerdings gibt es das z.Zt. nur über die relativ umfangreiche JVCL (TJvHTLabel oder TJvMarkupLabel), und allerdings werden dort die html-Symbole wie "&gamma;" nicht erkannt. Das könnte ich aber relativ leicht beheben, denke ich...

[EDIT]
Hab' jetzt das TJvHTLabel überarbeitet, so dass es die HTML-Entities erkennt und richtig darstellt. Außerdem wurde die Darstellung von Hoch- und Tiefstellungen verbessert. (Das ist aber nur in dem Trunk-Repositorium enthalten, also noch nicht im OPM.).

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von theo »

Ich verstehe euer Problem immer noch nicht.
Es gibt mit Unicode keinen Unterschied, zwischen z.B. einem dt. Umlaut und Griechisch.
Warum soll man die anders behandeln als andere Zeichen?
Die Unicode Zeichentabelle ("Bearbeiten" -> "Aus der Zeichentabelle einfügen...") hatte ich vor 13 Jahren mal der IDE spendiert.
Zeichen auswählen und gut.
Welcher Font kann heute griechisch nicht darstellen?

laz_griech.png
laz_griech.png (26.06 KiB) 1983 mal betrachtet

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von wp_xyz »

Griechisch ist kein Problem, aber die hoch-/tiefgestellten Zeichen im Block "Superscripts and Subscripts" kommen im Editor gar nicht, sehr wohl aber zur Laufzeit mit dem "default"-Font (zumindest unter Windows). Das war der Grund meiner Nachricht (und tiefgestellte Großbuchstaben gibt es dort von vornherein nicht, daher der Hinweis auf das HTML-Label).
Dateianhänge
utf8_subscript.png
utf8_subscript.png (8.32 KiB) 1950 mal betrachtet

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von theo »

wp_xyz hat geschrieben:
Sa 7. Mai 2022, 10:31
Griechisch ist kein Problem, aber die hoch-/tiefgestellten Zeichen im Block "Superscripts and Subscripts" kommen im Editor gar nicht, sehr wohl aber zur Laufzeit mit dem "default"-Font (zumindest unter Windows). Das war der Grund meiner Nachricht (und tiefgestellte Großbuchstaben gibt es dort von vornherein nicht, daher der Hinweis auf das HTML-Label).
OK, ich wusste nicht, dass das auf Windows nicht angezeigt wird.
Unter Linux ist das kein Problem.

lazsup.png
lazsup.png (10.94 KiB) 1947 mal betrachtet

Aber es wird auch unter Windows funktionieren, auch wenn man nur "Kästchen" in der IDE sieht.
Ob sich da Umwege lohnen?

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von wp_xyz »

theo hat geschrieben:
Sa 7. Mai 2022, 10:46
Ob sich da Umwege lohnen?
Zwangsweise. Wie willst du im Quelltext die Caption 'gamma_n' von 'gamma_m' unterscheiden, wenn das tiefgestellte n und m nur als Kästchen angezeigt werden?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von theo »

wp_xyz hat geschrieben:
Sa 7. Mai 2022, 11:13
theo hat geschrieben:
Sa 7. Mai 2022, 10:46
Ob sich da Umwege lohnen?
Zwangsweise. Wie willst du im Quelltext die Caption 'gamma_n' von 'gamma_m' unterscheiden, wenn das tiefgestellte n und m nur als Kästchen angezeigt werden?
Muss man das? Die Hex-Reihe versteht ja auch niemand auswendig.
Sonst macht man eine kommentierte Const, wie du oben.
Sieht dann auf Windows ungefähr so aus:

Code: Alles auswählen

const
  gamma_m = '□□'; { gamma  + tiefgestelltes 'm' };
Und auf Linux kann man es direkt lesen.

Gibt es auf Win keinen Font für die IDE, welcher das auch so kann?

Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von photor »

Hallo Forum,

Was habe ich da ausgelöst?

Aber, gar nicht schlecht, weil ich schon einiges gelernt/mitgenommen habe (z.B. hoch und tief gestellte Indizes existieren; direkte Eigabe über die Zeichentabelle).

Mir geht es darum, Labels mit entsprechend technischer Beschriftung zu erstellen. Da ich sowohl Lazarus (@home) undDelphi (im Büro) einsetze, sollte die Lösung nicht zu unterschiedlich sein. Im Prinzip ist sie das auch nicht - ziehe ich aus der Diskussion - gut. Die Unterschiede, die es gibt, sind beherrschbar.

Mit Hex-Zeichen im Label kann ich im Prinzip leben (Kommentar im Code dazu, fertig). Das gilt auch für Kästchen (im Code) solange sie im Programm lesbar sind.

Es wäre z.B. ein Problem gewesen, wenn man erst noch irgenwo ein Encoding hätte einstellen müssen, was möglicherweise Nebeneffekte (z.B. beim Speichern von Ergebnissen) gezeigt hätte.

Daher, bis hierher schonmal Danke,
Photor

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von theo »

Jetzt musste ich alter Mann doch tatsächlich noch Windows booten. Schwitz... :mrgreen:
Mit einem vernünftigen Font, gehen dort Super- und Subscripts auch.
Es gibt also keinen Grund für Verrenkungen im Code, wenn es doch nur um die Darstellung im IDE-Editor geht.

Der ist schon besser: https://fonts.google.com/specimen/Source+Code+Pro

SourceCodeProK.png
SourceCodeProK.png (9.55 KiB) 1867 mal betrachtet

Zur Delphi Kompatibilität kann ich nichts sagen.

EDIT: Leider sind mit obigem Font die Buchstaben von Super- und Subscripts auch nicht sichtbar.
Aber immerhin scheint jetzt klar, dass es sich um ein reines Font Problem handelt und nicht um eine Begrenzung von Lazarus

Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von photor »

Moin,

für mich geht es weniger um die Darstellung in der IDE. Mir geht es um die Darstellung im (stand-alone) Programm. Beim Programmieren kann ich mit allem leben (wenn es kommentiert ist); aber der User wird mich mit Fragen zuwerfen, wenn er nicht darstellbare oder nicht eindeutige Zeichen in Eingabe-Masken sieht.

Und ursprünglich hatte ich halt die Frage, ob es reicht, diese Zeichen einfach im TLabel.Caption platt zu nutzen, oder - im Extremfall - muss ich irgendwelche Klimmzüge veranstalten, um diese Zeichen darzustellen (die dann noch Nebeneffekte zeigen). Das wurde aber ja schon ausgeräumt.

Was Delphi angeht, wäre noch zu klären, ob so ein (nicht zu exotischer) Font wie Tahoma oder Calibre die Zeichen dann auch richtig darstellen/besitzen. Das muss ich aber ausprobieren.

Ich bin erstmal mit den Antworten hier glücklich. :D

Ciao,
Photor

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von wp_xyz »

Ich habe jetzt auch das TJvMarkupLabel und den TJvMarkupViewer der JVCL so erweitert, dass HTML-Entities und Hoch-/Tiefstellung funktionieren. Diese beiden Komponenten haben gegenüber dem oben erwähnten TJvHTLabel den Vorteil, dass sie leichter aus dem JVCL-Dinosaurier herauszulösen sind: Kopier dir einfach die beiden Units jvmarkuplabel.pas und jvmarkupcommon.pas ins Projekt, und schon kannst du dir zur Laufzeit ein html-fähiges Label erzeugen, ohne irgendwas installieren zu müssen (siehe angehängtes Demo-Projekt):

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1 := TJvMarkupLabel.Create(self);
  Label1.Parent := Self;
  Label1.Left := 10;
  Label1.Top := 10;
  Label1.AutoSize := true;
  Label1.Text := 'sin<sup>2</sup>&alpha; + cos<sup>2</sup>&alpha; = 1';
end; 
Damit bist du völlig von den durch die Fonts festgelegten Randbedingungen losgelöst und kannst schreiben, was du willst (naja, fast...)
Dateianhänge
jvMarkupLabel-without JVCL.zip
(8.22 KiB) 61-mal heruntergeladen

Benutzeravatar
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: Unicode-Zeichen in TLabel.Caption

Beitrag von Winni »

Hi!

Wenn wieder diverse Windows-Fonts nicht alle UTF8-Blocks abdecken, dann die Liberation Fonts (sans, serif, mono) benutzen.

Hier bei github: https://github.com/liberationfonts/libe ... s/releases

caption := '🚀🚍🛻🛵';

Winni

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von theo »

Winni hat geschrieben:
Sa 7. Mai 2022, 18:18
Wenn wieder diverse Windows-Fonts nicht alle UTF8-Blocks abdecken, dann die Liberation Fonts (sans, serif, mono) benutzen.

Hier bei github: https://github.com/liberationfonts/libe ... s/releases
Habe deinen Tipp auch noch ausprobiert, hat aber das gleiche Problem wie Source Code Pro.
Die Buchstaben der Super- und Subscript Page werden nicht angezeigt. Die anderen Zeichen dort aber schon.
Ich fürchte, dass es diese in keinem Monotype Font gibt.

Linux/X macht wahrscheinlich Font-Substitution, d.h. Wenn ein Zeichen in dem gewöhlten Font nicht vorkommt, nimmt es das Zeichen aus einem Font, der's hat.
Das scheint mir sinnvoll.

Antworten