AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textlänge abschneiden

Ein Thema von EWeiss · begonnen am 14. Jun 2016 · letzter Beitrag vom 20. Jun 2016
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:08
Wie du schon festgestellt hast, nützt die Anzahl der Zeichen nichts, wenn Proportionalschrift eingesetzt wird.
1. Lösung:
Keine Proportionalschrift verwenden. Ist wohl die einfachste Lösung, aber sieht oft irgendwie scheiße aus.
2. Lösung:
Die Länge des Textes in Pixeln über den Canvas der Ziel-Komponente bestimmen.
In der DP gibt es mehrere Beispiele dazu. Eins kannst du hier finden.
Ich sagte ja schon es wird in OpenGL (TextSuite) gerendert da nutzt mir ein Canvas nichts.
Danke.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:26
Ich sagte ja schon es wird in OpenGL (TextSuite) gerendert da nutzt mir ein Canvas nichts.
Ups, sorry.
War wohl noch zu früh für meine Augen.
Peter
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:36
Ich sagte ja schon es wird in OpenGL (TextSuite) gerendert da nutzt mir ein Canvas nichts.
Ups, sorry.
War wohl noch zu früh für meine Augen.
Na ja macht ja nichts

Es gäbe eine Möglichkeit..
tsSetParameteri(TS_FONT_CHAR_SPACING, 1);

Damit sollte eigentlich zwischen den einzelnen Chars der Abstand immer gleich sein.
In dem Fall sollte es eigentlich funktionieren, will aber auch nicht so richtig.

Geändert von EWeiss (11. Jul 2019 um 16:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:41
Du benutzt zwar OpenGL aber ich denke Canvas.TextWidth kann trotzdem ein guter Ansatz sein. Vielleicht sind die Ergebnisse nicht 1:1 auf OpenGL übertragbar aber das Verhältnis sollte ja auf jeden Fall gleich sein.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 09:14
Da jeder (TrueType-)Font seine eigenen Parameter für jeden einzelnen Buchstaben mitbringt, sollte TextWidth zumindest ein guter Anhaltspunkt sein. Allerdings nur wenn in beiden Fällen der gleiche Font in der gleichen Größe verwendet wird. Die Werte die man für Times New Roman erhält, für Garamond zu verwenden, um ein Beispiel zu nennen, ist nicht so sinnvoll.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 09:15
Du benutzt zwar OpenGL aber ich denke Canvas.TextWidth kann trotzdem ein guter Ansatz sein. Vielleicht sind die Ergebnisse nicht 1:1 auf OpenGL übertragbar aber das Verhältnis sollte ja auf jeden Fall gleich sein.
Ich habe es mal damit getestet
http://www.delphipraxis.net/1333234-post4.html


Delphi-Quellcode:
function ChangeLabelWidth3(Lab: TLabel; MaxWidth: Integer): Boolean;
var LabCap: String;
     CurrWidth, n: Integer;
begin
   if Lab.Width > MaxWidth then
   begin
     LabCap:= Lab.Caption;
     MaxWidth := MaxWidth - Lab.Canvas.TextWidth('...'); //crash
     CurrWidth := Lab.Canvas.TextWidth(LabCap);

     n := Length(LabCap);
     repeat
       CurrWidth := CurrWidth - Lab.Canvas.TextWidth(LabCap[n]);
       dec(n);
     until (CurrWidth <= MaxWidth) or (n <= 0);
     Lab.Caption := copy(LabCap, 1, n) + '...';

     Result:= True;
   end
   else
     Result := false;
end;
Funktionieren tut es nicht denn es kracht schon hier.

MaxWidth := MaxWidth - Lab.Canvas.TextWidth('...'); //crash
Deaktiviere ich die zeile dann kracht es hier.

CurrWidth := Lab.Canvas.TextWidth(LabCap);
AV Read of Adress 000000


gruss
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 09:17
Da scheint Lab.Canvas nil zu sein. Mit einem vorhandenen und gültigem Canvas bei dem du vorher Font und FontSize einstellst sollte aber wie p80286 und ich gesagt haben gute Ansätze liefern.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 09:33
Da scheint Lab.Canvas nil zu sein. Mit einem vorhandenen und gültigem Canvas bei dem du vorher Font und FontSize einstellst sollte aber wie p80286 und ich gesagt haben gute Ansätze liefern.
Nö der ist nicht Nil

Delphi-Quellcode:
Lab := TLabel.Create(nil);
Lab.Font.Name := 'Arial';
Lab.Font.Size := 16;
Lab.Caption := string(SongName);
Lab.AutoSize := True;
Ja Vielleicht wenn es nicht wie gesagt krachen würde bei dieser Procedure.

EDIT:
Ich denke das ist nicht möglich da ich für den Label kein Parent zuweisen kann.
Und ohne Parent denke ich mal kein gültiger Canvas ?

gruss

Geändert von EWeiss (14. Jun 2016 um 09:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 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