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 19. Jun 2016
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 01:35
Also in meinem Original-Quelltext ist lSuffixLength initialisiert ... wenn du das vergessen hast, warum initialisierst du die nicht einfach, anstatt da eine globale Variable von zu machen?

Anyway, im Anhang mal der Source (etwas umgebaut) und ein EXE (zum direkten Testen). Mit einem Klick auf die Paintbox kann man den Font auswählen und schwupps wird der Text mit dem neuen Font wieder angepasst dargestellt.

Ich hoffe wegen der Pixel-Geschichte sprechen wir jetzt nicht darüber, dass der Text ganz exakt genau so breit sein soll wie die Vorgabe ist. Das das so (zeichne mal einfach so den Text) nicht geht is hoffentlich jedem klar.
Angehängte Dateien
Dateityp: zip dp_189448.zip (965,1 KB, 13x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 01:46
Zitat:
wenn du das vergessen hast, warum initialisierst du die nicht einfach, anstatt da eine globale Variable von zu machen?
Wir reden irgendwie aneinander vorbei..
Es war doch von dir Initialisiert.

lSuffixLength := 0;
Ich hatte vergessen wie im vorherigen Post schon gesagt

Delphi-Quellcode:
   if not Assigned( CharMeasurement )
   then
// raise EArgumentNilException.Create( 'CharMeasurement' );
   if MaxLength < 0
   then
// raise EArgumentOutOfRangeException.Create( 'MaxLength' );

   lSuffixLength := 0;
die vier Zeilen ebenfalls noch zu Kommentieren.

Das hatte zu folge das dieser code ausgeführt wurde

Delphi-Quellcode:
   if MaxLength < 0
   then
     lSuffixLength := 0;
In dem Fall ist lSuffixLength natürlich nicht mehr initialisiert.

Aber wie gesagt das habe ich in meinem anderen Post schon mitgeteilt und berichtigt.
Es gibt unter D2010 kein "EArgumentNilException".

Zitat:
Die Hauptfrage ist, was ist für OpenGL schneller: Einen ganzen Text mehrmals zu messen oder jeweils ein Zeichen
Schneller ist nicht so das Problem ich lese den Text nur einmal wenn der Songtitel sich ändert.
Das schafft OpenGL allemal.

Zitat:
Das ist bei dir aktuell diese ominöse 58
Das ist nicht ominös.
Das sind die menge an Chars die in dem Bereich zwischen 5 und 635 reinpassen.
Nicht mehr nicht weniger.


gruss

Geändert von EWeiss (18. Jun 2016 um 02:36 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 15:27
Ach so
Meine ominösen 58 sind letztendlich deine ominösen 80

Habe deine Unit getestet ist aber leider für meine Zwecke nicht Verwendbar.
Sie funktioniert nur verlässlich mit Monotypen Fonts die ich aber nicht einbinden will.
Destotrotz gute Arbeit andere können sie sicherlich verwenden.

Ich beende das hier und werde mich noch etwas mehr in die TextSuite einarbeiten.
Da gibt es eine Lösung dessen bin ich sicher.

gruss
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 15:39
Also, ich stelle mir das (analog zu Post #14) so vor:
Delphi-Quellcode:
if fMaxStrLen = 0 then begin
  fMaxLen := 635;
  fMaxStrLen := tsTextGetWidthA(SongName);
  if fMaxStrLen >= fMaxLen then begin
    fSuffixLen := tsTextGetWidthA('...');
    fMaxLen := fMaxLen - fSuffixLen;
    while fMaxStrLen >= fMaxLen do begin
      SongName := Copy(SongName,1,Length(SongName) - 1);
      fMaxStrLen := SongName);
    end;
    SongName := SongName + '...';
  end;
end;
Liefert tsTextGetWidthA für 'iiiiiiii' und 'wwwwwwww' eigentlich das gleiche Ergebnis?

Wenn ja, wird das mit der Routine nix.

Geändert von nahpets (18. Jun 2016 um 18:39 Uhr) Grund: fehlendes begin ergänzt.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 15:55
Zitat:
Liefert tsTextGetWidthA für 'iiiiiiii' und 'wwwwwwww' eigentlich das gleiche Ergebnis?
Nein natürlich nicht.
Da es sich nicht um einen Monotonen Font handelt.
Aber das verstehen einige Leute hier nicht.

Arial:
I = 11
W = 25

Courier New
i= 25
W =25

Mit W bin ich also früher an die grenze von 635 gestoßen als mit I
Das führt dazu das der Umbruch viel früher stattfindet als bei I.
Der Abstand zu der Zeitanzeige ist dann logischer weise Unterschiedlich.

Zitat:
Zitat:
// Ist von der Breite so angelegt, dass mit Courier New 8 genau 80 Zeichen hineinpassen
Wie schon gesagt..
Funktioniert 100% solange es ein Monotoner Font ist.
Wenn nicht vergiss es denn dann Passen keine 80 Zeichen mehr hinein.

Man könnte das jetzt weiter verfolgen, aber mich scheinen einige Leute für so blöd zu halten
das ich nicht mal in der Lage bin einen Canvas den richtigen Font zuzuweisen.
Von daher vergesse ich das Thema jetzt hier.

Wenn Lossy im GL Forum zeit hat hineinzuschauen werde ich eine Antwort finden.
Danke für eure Hilfe.

gruss

Geändert von EWeiss (18. Jun 2016 um 16:03 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 17:53
Zitat:
Liefert tsTextGetWidthA für 'iiiiiiii' und 'wwwwwwww' eigentlich das gleiche Ergebnis?
Nein natürlich nicht.
Das hatte ich egentlich auch nicht erwartet und daher verwundert es mich, dass das Ganze nur mit Monotonen Font funktioniert.
Da es sich nicht um einen Monotonen Font handelt.
Aber das verstehen einige Leute hier nicht.

Arial:
I = 11
W = 25

Courier New
i= 25
W =25

Mit W bin ich also früher an die grenze von 635 gestoßen als mit I
Das führt dazu das der Umbruch viel früher stattfindet als bei I.
Der Abstand zu der Zeitanzeige ist dann logischer weise Unterschiedlich.
Von einem Ergebnis dieser Art bin ich eigentlich ausgegangen.
Zitat:
Zitat:
// Ist von der Breite so angelegt, dass mit Courier New 8 genau 80 Zeichen hineinpassen
Wie schon gesagt..
Funktioniert 100% solange es ein Monotoner Font ist.
Wenn nicht vergiss es denn dann Passen keine 80 Zeichen mehr hinein.
Bei Arial würd' ich hier jetzt davon ausgehen, dass 57 i oder 25 W passen.
Man könnte das jetzt weiter verfolgen, aber mich scheinen einige Leute für so blöd zu halten
das ich nicht mal in der Lage bin einen Canvas den richtigen Font zuzuweisen.
Den Eindruck, dass Dich hier im Thread irgendwer für blöd hält, habe ich nicht. Das Problem, mit dem Du Dich da rumschlägst, ist von der Logik her nicht zu fassen. Eigentlich müsste Dein Vorgehen zu einem richtigen Ergebnis führen und ebenso auch die anderen Lösungsvorschläge. Irritierend ist halt, dass dem nicht so ist. Aber dass hat doch nichts mit Deiner Person zu tun.
Von daher vergesse ich das Thema jetzt hier.

Wenn Lossy im GL Forum zeit hat hineinzuschauen werde ich eine Antwort finden.
Danke für eure Hilfe.

gruss
Momentan gehe ich davon aus, dass das Problem an einer Stelle liegt, auf die Du als Programmierer keinen Zugriff hast, also irgendwo innerhalb der von Dir genutzten Bibliothek.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 18:27
Zitat:
Bei Arial würd' ich hier jetzt davon ausgehen, dass 57 i oder 25 W passen.
Ich denke das Problem liegt an der Herangehensweise.
Man muss sich nur mal diese Aussage anschauen.

Zitat:
// Ist von der Breite so angelegt, dass mit Courier New 8 genau 80 Zeichen hineinpassen
Label2.Caption := ShortenText( Edit1.Text, 80, CalculateFixedCharWidth );
Es passen also exakt 80 Zeichen in einer breite von 560 hinein.
Somit ist gewährleistet das egal welche Zeichen es sind diese immer eine fixe breite von 7 haben (560 div 80)

Wenn ich nun davon ausgehe das bei einer fixen Weite von 560

SongName := PAnsiChar(AnsiString(Ansimidstr(string(SongName),1, 80) + '...'));

80 Zeichen reinpassen dann wird mein SongTitel genau egal welche Zeichen dieser enthält (gleiche Breite pro Char)
100% und immer kurz vor meiner Zeitanzeige gezeichnet.

Jetzt ändere mal den Font wo die Zeichen nicht mehr gleich sind.
Tja nun dann ist diese Aussage nicht mehr rechtens
Zitat:
// Ist von der Breite so angelegt, dass mit Courier New 8 genau 80 Zeichen hineinpassen
es passen dann einfach keine 80 Zeichen mehr rein.
Das würde dann unweigerlich Fehlschlagen

SongName := PAnsiChar(AnsiString(Ansimidstr(string(SongName),1, 80) + '...'));

gruss
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#8

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 18:21
Bin mir nicht sicher, aber ist beim Proportionalfont nicht auch die Reihenfolge der Zeichen wichtig ?

Der Font sollte doch der Typogrrafie entsprechen: z.B. im Buchdruck.

Dann wäre z.B. "o" nach "P" etwas näher rangerückt (so inder der Art).
Also kämen bei "Po" andere Werte als bei "oP", oder so ähnlich.

Könnte das eventuell dein Problem damit sein ?
Dann müsste immer der ein ganzer String analysiert werden und
nur eine charakterweise Addition müsste Unterschiede ergeben.

Das wäre vielleicht die Erklärung wenn es ein Font tut und der Andere nicht.

Das nurmal als Gedankenanregung, bin auch kein Fontspezialist.

Rollo
  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 14:33 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-2025 by Thomas Breitkreuz