Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#44

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 22:13
Mit Lossys Hilfe funktioniert es jetzt wie soll.
Nochmals Danke für seine Hilfe.

Delphi-Quellcode:
      // Only change if Title different
      if (CurrentTitle <> OldTmpTitle) then
      begin
        // Adding all the characters that are present in the text
        tsFontAddChars(@SongNameTmp[0]);

        //Get max length of String
        fMaxStrLen := tsTextGetWidthA(SongNameTmp);
        if fMaxStrLen >= 635 then
        begin
          // Since we want to '...' have in any case at the end we need these characters to only.
          CharLen := tsFontGetCharParameteri('.', TS_CHAR_ADVANCE) * 3;

          // Parse width of Glyph
          for I := 0 to High(Char) do
          begin
            // read and add width of the current character
            Char[I] := WideChar(SongNameTmp[I]);
            CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_ADVANCE);
            CharLen := CharLen + CharLength;
            // If the width is greater than the available space, then loop exit
            if CharLen >= 635 then
              break;
          end;
          // Here is through the loop and our new text is from 1 to i-1.
          SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, i-1) + '...'));
        end
        else
          SongName := BassSoInfo.SongTitle;

        CurrentTitle := OldTmpTitle;
      end;
Mit dem ganzen VCL Kram war das nicht zu bewerkstelligen.
Ist abhängig von der Bibliothek mit der Gezeichnet wird.

Zitat:
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.
Nun ja das was man mir nicht glaubte VCL ist nicht OpenGL
Und das Handling mit den Fonts in VCL ist eine andere Geschichte als in OpenGL.
Aber gut funktioniert ja jetzt auf diese weise.

Meine Fehler resultierten daraus weil ich zu wenig Kenntnis über die zu Übergebenden Parameter hatte.
Delphi-Quellcode:
    // Display Song Name
     SongNameTmp := BassSoInfo.SongTitle;
     OldTitle := string(BassSoInfo.Songfile);
  
     if assigned(SongNameTmp) then
     begin
       SetLength(Char, length(SongNameTmp));
  
       // Only change if Title different
       if (OldTitle <> CurrentTitle) then
       begin
         //Get max length of String
         fMaxStrLen := tsTextGetWidthA(SongNameTmp);
         if fMaxStrLen >= 635 then
         begin
           // 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;
           // CharLen = length of all combine Glyph
           if CharLen >= ((CharLen - fMaxStrLen) + 635) then
           begin
             SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, 58) + '...'));
           end;
         end
         else
           SongName := BassSoInfo.SongTitle;
  
         CurrentTitle := OldTitle;
       end;

Ich hatte vergessen die Chars den Aktiven Font zuzuweisen
tsFontAddChars(@SongNameTmp[0]);

die länge des Suffix (...) nicht addiert basierend auf der verwendeten Bibliothek.
CharLen := tsFontGetCharParameteri('.', TS_CHAR_ADVANCE) * 3;

Und hier den falschen Parameter übergeben mit der Annahme das ich die weite über TS_CHAR_GLYPHRECT_RIGHT in Erfahrung bringe. Schien mir am logischsten.
CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_ADVANCE);

was mich hier gerissen hat weiß ich letztendlich auch nicht.. war wohl mehr oder weniger eine Verzweiflungstat.
if CharLen >= ((CharLen - fMaxStrLen) + 635) then

Ansonsten war die Herangehensweise gar nicht mal so verkehrt.
Vielleicht können andere Leute die mit der TextSuite Arbeiten damit jetzt was anfangen.
Die müssen sich dann nicht mehr damit rumschlagen.

Letztendlich noch ein Satz.
Wäre die exakte Anzahl von Chars bekannt, bei nicht Monotonen Fonts die in den Bereich von 5 > 635 hineinpassen, könnte man sich den ganzen Kram sparen
denn dafür würde eine einzige Zeile reichen.

SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, 'Meine bekannte Anzahl von Chars') + '...'));

gruss

Geändert von EWeiss (19. Jun 2016 um 07:48 Uhr)
  Mit Zitat antworten Zitat