Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

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