Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Textlänge abschneiden (https://www.delphipraxis.net/189448-textlaenge-abschneiden.html)

EWeiss 14. Jun 2016 05:54

Textlänge abschneiden
 
Ich ermittle die weite von Text anhand der Textlänge.

Delphi-Quellcode:
      fMaxStrLen := Strlen(SongName);
      if fMaxStrLen >= 59 then
        SongName := PAnsiChar(AnsiString(Ansimidstr(string(SongName),1, 54) + '..'));
Delphi-Quellcode:
procedure TBASSSoVis.HoldMatrixFontMode(x, y: GLFloat; Text: PAnsiChar;
  FontSet: tsFontID; TextAlign: integer);
var
  iMatrixMode : integer;
begin
  glGetIntegerv(GL_MATRIX_MODE, @iMatrixMode);
  glMatrixMode(GL_PROJECTION);
  glPushMatrix;
  try
    glPrintXY(x, y, text, FontSet, TextAlign)
  finally
    glMatrixMode(GL_PROJECTION);
    glPopMatrix;
    glMatrixMode(iMatrixMode);
  end;
 
end;
Delphi-Quellcode:
HoldMatrixFontMode(5, SON_Current_YPos, PAnsiChar(SongName), fLargeFontID, TS_ALIGN_LEFT);


Sollte eigentlich kein Problem sein.
Ist es aber da der Text in OpenGL gerendert wird.

Wenn der Text über 59 Zeichen geht, kurz vor der Zeitanzeige soll er abgeschnitten werde.
Beispiel:

xxxxx..

Warum ein Beispiel wenn man am Code schon sieht was ich machen will.
Ganz einfach.

Weil beim Rendern die breite einzelner Zeichen halt Unterschiedlich sind.
Nehme ich jetzt

IIIII..
Theoretisch könnte dann der Text eine länge von 69 Zeichen haben und wäre immer noch nicht im Bereich meiner Zeitanzeige.
Würde diese also nicht überzeichen.

Wie kann ich das jetzt lösen und woran soll ich mich halten?
Verwende Textsuite.

crosspost:
https://delphigl.com/forum/viewtopic...100406#p100406

gruss

Jasocul 14. Jun 2016 06:57

AW: Textlänge abschneiden
 
Wie du schon festgestellt hast, nützt die Anzahl der Zeichen nichts, wenn Proportionalschrift eingesetzt wird.
1. Lösung:
Keine Proportionalschrift verwenden. Ist wohl die einfachste Lösung, aber sieht oft irgendwie scheiße aus. :lol:
2. Lösung:
Die Länge des Textes in Pixeln über den Canvas der Ziel-Komponente bestimmen.
In der DP gibt es mehrere Beispiele dazu. Eins kannst du hier finden.

EWeiss 14. Jun 2016 07:08

AW: Textlänge abschneiden
 
Zitat:

Zitat von Jasocul (Beitrag 1340081)
Wie du schon festgestellt hast, nützt die Anzahl der Zeichen nichts, wenn Proportionalschrift eingesetzt wird.
1. Lösung:
Keine Proportionalschrift verwenden. Ist wohl die einfachste Lösung, aber sieht oft irgendwie scheiße aus. :lol:
2. Lösung:
Die Länge des Textes in Pixeln über den Canvas der Ziel-Komponente bestimmen.
In der DP gibt es mehrere Beispiele dazu. Eins kannst du hier finden.

Ich sagte ja schon es wird in OpenGL (TextSuite) gerendert da nutzt mir ein Canvas nichts.
Danke.

gruss

Jasocul 14. Jun 2016 07:26

AW: Textlänge abschneiden
 
Zitat:

Zitat von EWeiss (Beitrag 1340082)
Ich sagte ja schon es wird in OpenGL (TextSuite) gerendert da nutzt mir ein Canvas nichts.

Ups, sorry.
War wohl noch zu früh für meine Augen.

EWeiss 14. Jun 2016 07:36

AW: Textlänge abschneiden
 
Zitat:

Zitat von Jasocul (Beitrag 1340083)
Zitat:

Zitat von EWeiss (Beitrag 1340082)
Ich sagte ja schon es wird in OpenGL (TextSuite) gerendert da nutzt mir ein Canvas nichts.

Ups, sorry.
War wohl noch zu früh für meine Augen.

Na ja macht ja nichts ;)

Es gäbe eine Möglichkeit..
Delphi-Quellcode:
tsSetParameteri(TS_FONT_CHAR_SPACING, 1);


Damit sollte eigentlich zwischen den einzelnen Chars der Abstand immer gleich sein.
In dem Fall sollte es eigentlich funktionieren, will aber auch nicht so richtig.

Neutral General 14. Jun 2016 07:41

AW: Textlänge abschneiden
 
Du benutzt zwar OpenGL aber ich denke Canvas.TextWidth kann trotzdem ein guter Ansatz sein. Vielleicht sind die Ergebnisse nicht 1:1 auf OpenGL übertragbar aber das Verhältnis sollte ja auf jeden Fall gleich sein.

p80286 14. Jun 2016 08:14

AW: Textlänge abschneiden
 
Da jeder (TrueType-)Font seine eigenen Parameter für jeden einzelnen Buchstaben mitbringt, sollte TextWidth zumindest ein guter Anhaltspunkt sein. Allerdings nur wenn in beiden Fällen der gleiche Font in der gleichen Größe verwendet wird. Die Werte die man für Times New Roman erhält, für Garamond zu verwenden, um ein Beispiel zu nennen, ist nicht so sinnvoll.

Gruß
K-H

EWeiss 14. Jun 2016 08:15

AW: Textlänge abschneiden
 
Zitat:

Zitat von Neutral General (Beitrag 1340085)
Du benutzt zwar OpenGL aber ich denke Canvas.TextWidth kann trotzdem ein guter Ansatz sein. Vielleicht sind die Ergebnisse nicht 1:1 auf OpenGL übertragbar aber das Verhältnis sollte ja auf jeden Fall gleich sein.

Ich habe es mal damit getestet
http://www.delphipraxis.net/1333234-post4.html


Delphi-Quellcode:
function ChangeLabelWidth3(Lab: TLabel; MaxWidth: Integer): Boolean;
var LabCap: String;
     CurrWidth, n: Integer;
begin
   if Lab.Width > MaxWidth then
   begin
     LabCap:= Lab.Caption;
     MaxWidth := MaxWidth - Lab.Canvas.TextWidth('...'); //crash
     CurrWidth := Lab.Canvas.TextWidth(LabCap);

     n := Length(LabCap);
     repeat
       CurrWidth := CurrWidth - Lab.Canvas.TextWidth(LabCap[n]);
       dec(n);
     until (CurrWidth <= MaxWidth) or (n <= 0);
     Lab.Caption := copy(LabCap, 1, n) + '...';

     Result:= True;
   end
   else
     Result := false;
end;
Funktionieren tut es nicht denn es kracht schon hier.

Delphi-Quellcode:
MaxWidth := MaxWidth - Lab.Canvas.TextWidth('...'); //crash

Deaktiviere ich die zeile dann kracht es hier.

Delphi-Quellcode:
CurrWidth := Lab.Canvas.TextWidth(LabCap);

AV Read of Adress 000000


gruss

Neutral General 14. Jun 2016 08:17

AW: Textlänge abschneiden
 
Da scheint Lab.Canvas nil zu sein. Mit einem vorhandenen und gültigem Canvas bei dem du vorher Font und FontSize einstellst sollte aber wie p80286 und ich gesagt haben gute Ansätze liefern.

EWeiss 14. Jun 2016 08:33

AW: Textlänge abschneiden
 
Zitat:

Zitat von Neutral General (Beitrag 1340094)
Da scheint Lab.Canvas nil zu sein. Mit einem vorhandenen und gültigem Canvas bei dem du vorher Font und FontSize einstellst sollte aber wie p80286 und ich gesagt haben gute Ansätze liefern.

Nö der ist nicht Nil

Delphi-Quellcode:
Lab := TLabel.Create(nil);
Lab.Font.Name := 'Arial';
Lab.Font.Size := 16;
Lab.Caption := string(SongName);
Lab.AutoSize := True;
Ja Vielleicht wenn es nicht wie gesagt krachen würde bei dieser Procedure.

EDIT:
Ich denke das ist nicht möglich da ich für den Label kein Parent zuweisen kann.
Und ohne Parent denke ich mal kein gültiger Canvas ?

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.
Seite 1 von 6  1 23     Letzte »    

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