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
Seite 5 von 6   « Erste     345 6      
EWeiss
(Gast)

n/a Beiträge
 
#41

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 19: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
nahpets
(Gast)

n/a Beiträge
 
#42

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 19:52
Eventuell noch ein anderer Ansatz:
Delphi-Quellcode:
begin
  fMaxLen := 635; // Die maximal zulässige Breite der Zeichenfolge in der Anzeige.
  fMaxStrLen := tsTextGetWidthA(SongName); // Aktuelle Breite ermitteln.
  if fMaxStrLen >= fMaxLen then begin // Ist die größer als die Maximalbreite?
    SongName := SongName + '...'; // dann ... anhängen
    fMaxStrLen := tsTextGetWidthA(SongName); // und die neue Breite ermitteln.
    repeat // Solange wiederholen
      Delete(SongName,Length(SongName) - 4,1); // viertletztes Zeichen entfernen
      fMaxStrLen := tsTextGetWidthA(SongName); // Neue Breite ermitteln.
    until fMaxStrLen <= fMaxLen; // Bis die Breite <= der Maximalbreite ist.
  end;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#43

AW: Textlänge abschneiden

  Alt 18. Jun 2016, 19:57
Dank dir werde es mal testen.

gruss
  Mit Zitat antworten Zitat
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
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Textlänge abschneiden

  Alt 19. Jun 2016, 17:39
Tja, diese Lösung von Lossy ist von der Funktionsweise exakt die gleiche, die ich auch gepostet habe. Aber anyway, es gab ja jetzt eine CopyPaste Lösung ohne Mitdenken - und die gab es von mir halt nicht
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
 
#46

AW: Textlänge abschneiden

  Alt 19. Jun 2016, 20:23
Tja, diese Lösung von Lossy ist von der Funktionsweise exakt die gleiche, die ich auch gepostet habe. Aber anyway, es gab ja jetzt eine CopyPaste Lösung ohne Mitdenken - und die gab es von mir halt nicht
Ja nur deine Funktioniert nicht.

Weil du einfach nicht verstehst das der Font in OpenGL von der Breite her niemals der gleiche wie unter VCL ist.
Hier wird auch nicht in VCL sondern unter OpenGL mit einer extra dafür ausgerichteten Bibliothek gezeichnet.
Und nein wenn du weiter runter gehst ca. auf Seite 2 wirst du sehen bzw. erkennen das bis auf die Parameter
der Code von mir vorher schon geschrieben war.

Du hättest sofort auf Anhieb erkannt das ich TS_CHAR_ADVANCE anstelle von TS_CHAR_GLYPHRECT_RIGHT hätte verwenden müssen?
Von der Logik her war dies für mich der richtige weg TS_CHAR_GLYPHRECT_RIGHT.

Und nochmal vergiss es einfach zu versuchen OpenGL mit VCL zu kombinieren.
Abhängig natürlich von der aktuellen Sachlage.

Zu deiner Unterstellung:
Vergleich einfach mal die Zeiten oder gehe mal auf DelphiGL dann siehst du wer was hier Copy/Paste hat.
Ich zumindest nicht.

Mein Post:
17. Jun 2016, 21:00 Hier und bei DelphiGL wer hat jetzt Copy paste?
Lossys Post:
18. Jun 2016, 18:07

Das Problem war nur ich habe mich von dir breit schlagen lassen es mit der VCL Methode zu versuchen.
Zitat:
Hört sich ja fast so an, als ob OpenGL = Quanten-Physik ist.
Ja wenn man versucht VCL (Font Angelegenheiten) in GL umzusetzen die eine extra Bibliothek verwendet um die Fonts zu zeichnen.
Ich habe versucht dir das mehrmals Klar zu machen...
Aber nein manche Leute wollen ihren Standpunkt mit allen Mitteln durchsetzen.
Kein Ahnung warum du jetzt sickig bist. Dein Stolz verletzt?

Versteh mich nicht falsch ich habe mich über deine Hilfe gefreut, aber jetzt mit solchen Unterstellungen zu kommen,
nur weil ich deinen nicht funktionierenden Code nicht verwende, ist unterste Schublade.

Und ja deinen ganzen code kann ich mit einer einzelnen Zeile ersetzen und komme auf das gleiche Ergebnis.

SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, 'Meine bekannte Anzahl von Chars') + '...'));
Zitat:
Das das so (zeichne mal einfach so den Text) nicht geht is hoffentlich jedem klar.
Klar geht das und ist auch der Grund warum es mit VCL nicht funktioniert.
Denn die TextSuite tut nichts anderes.

EDIT:
Ich habe sogar noch mit meinem Code selber verglichen was ich vergessen bzw. wo meine Fehler waren.
Ich verstehe deine Probleme einfach nicht.

Habe jetzt allen hier bewiesen das deine Unterstellung Nonsens ist, somit ist es gut für mich.
Jetzt können wir wieder Freunde sein.


gruss

Geändert von EWeiss (19. Jun 2016 um 21:47 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
 
#47

AW: Textlänge abschneiden

  Alt 19. Jun 2016, 21:54
Da mein Code einfach nur Integer Werte zusammenzählt und anhand der Aufsummierungen derselbigen Entscheidungen trifft, müssen wohl die von OpenGL zurückgelieferten Integer Werte total anders von der Bedeutung sein. So OpenGL-Spezial-Integer Werte.

Schon krass dieses OpenGL - sowas kann ich natürlich nicht berücksichtigen.

Vielleicht kann mir das ja der Kryptochef erklären, werde den mal anschreiben
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
 
#48

AW: Textlänge abschneiden

  Alt 19. Jun 2016, 21:57
Da mein Code einfach nur Integer Werte zusammenzählt und anhand der Aufsummierungen derselbigen Entscheidungen trifft, müssen wohl die von OpenGL zurückgelieferten Integer Werte total anders von der Bedeutung sein. So OpenGL-Spezial-Integer Werte.

Schon krass dieses OpenGL - sowas kann ich natürlich nicht berücksichtigen.

Vielleicht kann mir das ja der Kryptochef erklären, werde den mal anschreiben
Mir ging es um die Unterstellung die du hier gemacht hast..
Dazu habe ich alles gesagt.

Diese Antwort... nun ja! Ich verkneife mir darauf zu Antworten.
Äußere dich doch mal zu den von dir gemachten Unterstellungen das hätte mir mehr gebracht.

gruss

Geändert von EWeiss (19. Jun 2016 um 22:14 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#49

AW: Textlänge abschneiden

  Alt 19. Jun 2016, 22:33
Also ich verstehe das nicht.

Lösung Sir Rufo:
Delphi-Quellcode:
type
  TCharMeasureWidthDelegate = function( const C: Char ): Integer of object;

function ShortenText( const Text: string; const MaxLength: Integer; const CharMeasurement: TCharMeasureWidthDelegate; const ShortenSuffix: string = '...' ): string;
snip...

So jetzt eine function

Delphi-Quellcode:
function TmyView.CalculateCharWith( const C: Char ): Integer;
begin
  Result := tsFontGetCharParameteri(C, TS_CHAR_ADVANCE);
end;
und das ganze Aufrufen mit

lDrawText := ShortenText( Edit1.Text, PaintBox1.ClientWidth, myView.CalculateCharWith ); fertig.

Also in meinen Augen ist die Lösung von Sir Rufo super weil komplett unabhängig
und vor allem auch testbar.
Fritz Westermann
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#50

AW: Textlänge abschneiden

  Alt 19. Jun 2016, 22:36
Zitat:
Also in meinen Augen ist die Lösung von Sir Rufo super weil komplett unabhängig
Nö weil nicht OpenGL konform und mit meiner Bibliothek die ich verwende um die Glyphen zu zeichnen nicht vereinbar ist.
Schön und gut für VCL das war's dann.

Zudem warum soll ich 5 Seiten Quelltext verwenden wenn ich das gleiche mit 10 Zeilen erledigt habe.
Außerdem versuche ich zu vermeiden mein Programm mit Copy/Paste zu verwirklichen und nein brauche auch keine fertigen Lösungen
zumal diese hier eh nicht funktioniert.

gruss

Geändert von EWeiss (19. Jun 2016 um 22:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


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 02:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz