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
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Textlänge abschneiden

  Alt 17. Jun 2016, 21:35
Danke dir für deine mühe.
Aber ich kann leider davon nichts verwenden.
Ich muss den Text parsen/Ausgeben mit der Bibliothek mit der die Texte auch gezeichnet werden.

GetTextExtentPoint geht nicht GDI.
Auch alle anderen Texte (Berechnungen) die basierend auf GDI sind kann ich nicht verwenden.

Zitat von Lossy https://delphigl.com/forum/viewtopic...100413#p100413
Zitat:
Hier solltest du grundsätzlich die TextBreite etc. nur mit der Bibliothek erfragen mit der du die Texte auch zeichnest. Alles andere kann nicht funktionieren. Bzw. Birgt einfach zu viele Risiken.
Ich weiß nicht wie ich hier den Text zuschneiden soll.
Habe keinen Anhaltspunkt.

Delphi-Quellcode:
    while fMaxStrLen >= 635 do
       // string kürzen und '...' anhängen
       fMaxStrLen := tsTextGetWidthA(>gekürzter string<);
     end;
gruss

Geändert von EWeiss (17. Jun 2016 um 21:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Textlänge abschneiden

  Alt 17. Jun 2016, 21:45
Hast du eine Möglichkeit die effektive Breite eines Zeichens abzufragen?
Geht das nicht mit tsFontGetCharParameteri ?

Dann so eine Funktion der ShortenText mitgeben und du bekommst den Text, den du zeichnen kannst.
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
 
#3

AW: Textlänge abschneiden

  Alt 17. Jun 2016, 21:50
Hast du eine Möglichkeit die effektive Breite eines Zeichens abzufragen?
Geht das nicht mit tsFontGetCharParameteri ?

Dann so eine Funktion der ShortenText mitgeben und du bekommst den Text, den du zeichnen kannst.
Ja doch..
Delphi-Quellcode:
          // Parse width of Glyph
           for I := 0 to High(Char) do
           begin
             Char[I] := WideChar(SongNameTmp[I]);
             CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_GLYPHRECT_RIGHT);
             CharLen := CharLen + CharLength;
           end;
CharLength ist die länge des Aktuellen Chars basierend auf i

Nur wie soll ich da den Titel mit kürzen.
Es geht aber wie man an den Bildern sieht ist der Abstand zur Zeitanzeige basierend auf der Breite der Chars unterschiedlich.
Aber vielleicht geht es auch nicht anders. ?

Ich setze hier die länge des Strings auf 58.

SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, 58) + '...'));

Die 58 jedoch ist eigentlich der Bereich den ich berechnen müsste, wenn ich denn einen Anhaltspunkt hätte.

gruss

Geändert von EWeiss (17. Jun 2016 um 21:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Textlänge abschneiden

  Alt 17. Jun 2016, 22:00
Nun ja, wenn dir ein kompletter Source noch nicht reicht, wie soll man dann noch helfen?

Mir scheint, du schaust einfach nur flüchtig drüber und "... oh, der hat da was mit VCL verwendet, dann passt es eh nicht ..."

Schau dir meinen Source an und du wirst sehen, wie der Text so passend wie nur möglich zurechtgestutzt wird.

BTW: ShortenText weiß nicht, wie man die Breite eines Zeichens bestimmt (dafür ist der Parameter CharMeasurement da - CallbackFunktion).
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)

Geändert von Sir Rufo (17. Jun 2016 um 22:04 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Textlänge abschneiden

  Alt 17. Jun 2016, 22:07
Nun ja, wenn dir ein kompletter Source noch nicht reicht, wie soll man dann noch helfen?

Mir scheint, du schaust einfach nur flüchtig drüber und "... oh, der hat da was mit VCL verwendet, dann passt es eh nicht ..."

Schau dir meinen Source an und du wirst sehen, wie der Text so passend wie nur möglich zurechtgestutzt wird.
Mir hat dein Quelltext immer gereicht.
Und ich kann auch gerne drüber schauen.
Das Problem ist nur die länge der Chars ist nicht identisch alleine deshalb schon nicht weil ich unter OpenGL Schatten verwende.
Ich werde nie auch nur halbwegs an die korrekte breite jedes einzelnen Chars herankommen.

Es geht nicht um nicht wollen ich schätze deinen Code.
Aber es wird damit nicht funktionieren.
Tut mir leid

Aber ich denke andere die ein ähnliches Problem unter VCL haben werden sich darüber sicher freuen (Was nicht bedeutet ich hätte mich nicht gefreut )

Vielleicht muss ich wirklich auf Lossy warten er hat die Bibliothek geschrieben.
Er kann mir vielleicht zu einigen Parametern noch genauere Auskunft geben.

Zitat:
Courier New
Monotype Fonts.
Damit hätte ich auch kein Problem weil hier alle Zeichen gleich breit sind.
Aber ehrlich? Das sieht bescheiden aus.
Da bekomme ich vom Text her gerade mal die hälfte auf meinem Rendercontex wie bisher.
Aber, könnte dann mit einer fixen Anzahl von Char's Arbeiten wie ich es jetzt tue 58 und der abstand wäre immer gleich.
Wenn es nicht so bescheiden aussehen würde.

Im Fall von Monotypen Fonts könnte man komplett auf deinen Code verzichten.
Wie gesagt da alle Chars gleich breit sind.

gruss

Geändert von EWeiss (17. Jun 2016 um 22:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Textlänge abschneiden

  Alt 17. Jun 2016, 22:38
Ich werde nie auch nur halbwegs an die korrekte breite jedes einzelnen Chars herankommen.
Hört sich ja fast so an, als ob OpenGL = Quanten-Physik ist.

Wenn man die Breite nicht bestimmen kann, dann kann man das auch nicht zeichnen, weil der Bildschirm hat einfach nur Pixel und die müssen mit Farbe gefüllt werden

Ausserdem machst du das doch genau hier:
Delphi-Quellcode:
// Parse width of Glyph
  for I := 0 to High(Char) do
  begin
    Char[I] := WideChar(SongNameTmp[I]);
    // .......... vvvvvvvvvvvvvvvvvvvvvvv
    CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_GLYPHRECT_RIGHT);

    CharLen := CharLen + CharLength;
  end;
Irgendwann läufst du aus dem Maximalbereich heraus und musst jetzt den Text soweit kürzen, dass aber auch der Suffix noch dargestellt werden kann.

Nehmen wir mal eine feste Breite von 20 (das Verfahren ist genau wie bei der varaiblen Laufweite, nur einfacher darzustellen) und als Suffix ... (more) :

OriginalgekürztKommentar
1234567890123456789012345678901234567890Original passt, da brauchen wir nichts zu kürzen
1234567890123456789011234567890... (more)hier müssen wir kürzen

Beim Kürzen des Textes muss man also wieder ein paar Zeichen zurück gehen ... oder sich diesen speziellen Zustand einfach merken.

Du musst also nichts anderes machen als
  1. Die Breite des Suffixs zu bestimmen
    Delphi-Quellcode:
      lSuffixLength := 0;
      for lChar in ShortenSuffix do
        begin
          lSuffixLength := lSuffixLength + CharMeasurement( lChar ); // <- das könnte auch eine OpenGL-Zeichenbreiteermittlungsfunktion sein
        end;
  2. Jetzt den Text Zeichen für Zeichen durcharbeiten
    Delphi-Quellcode:
      Result := '';
      lText := TrimRight( Text );
      lTextLength := 0;
      lShortendWithSuffixFound := False;

      for lChar in lText do
        begin
          lCharLength := CharMeasurement( lChar ); // <- das könnte auch eine OpenGL-Zeichenbreiteermittlungsfunktion sein
  3. dabei aber den Zeitpunkt abpassen, wenn die bisher ermittelte Textlänge mit der Suffixlänge und dem aktuellen Zeichen über die Maximallänge hinausgeht. Denn den Text solltest du dir für den Fall der Fälle merken, wenn du den Text kürzen musst. Das ist bei dir aktuell diese ominöse 58
    Delphi-Quellcode:
          if not lShortendWithSuffixFound and ( lTextLength + lCharLength + lSuffixLength > MaxLength )
          then
            begin
              lShortenedWithSuffix := Result + ShortenSuffix;
              lShortendWithSuffixFound := True;
            end;
  4. Wenn man dann über die Maximallänge kommt gibt man einfach diesen eben gemerkten Text zurück
    Delphi-Quellcode:
          if lTextLength + lCharLength > MaxLength
          then
            begin
              Result := lShortenedWithSuffix; // <- das ist das gesuchte Ergebnis
              Exit;
            end;
  5. ansonsten einfach mal zusammenzählen und zum nächsten Zeichen
    Delphi-Quellcode:
          Result := Result + lChar;
          Inc( lTextLength, lCharLength );
        end;
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)

Geändert von Sir Rufo (17. Jun 2016 um 22:58 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Textlänge abschneiden

  Alt 17. Jun 2016, 22:49
Zitat:
Hört sich ja fast so an, als ob OpenGL = Quanten-Physik ist.
LOL..

Ach so jetzt verstehe ich was du meinst es geht hier nicht im speziellen um GDI
sondern ich könnte/sollte diese Parse Funktion zu GL konvertieren bsp. mit meinen
Möglichkeiten die breite eines Zeichen zu bestimmen.

Anschließend deine Funktionen durchgehen um zu verstehen wie ich den String in der länge entsprechend anpassen kann.

Jo das kann ich mal versuchen.

Danke für deine Ausführung..
Hoffe das ich richtig liege

gruss
  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 03:47 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