German Maximale Anzahl Zeichen in einem Label

pjo12345

Active Member
Licensed User
Longtime User
Hallo!
In ein Label passen ja, je nach Schriftgröße und Schriftart, Auflösung, Ausrichtung, etc. unterschiedlich viele Zeichen. Ich versuche gerade einen Weg zu finden, wie ich die maximale Anzahl an Zeichen ermitteln kann, welche in ein Label passen ohne Wortumbruch. Ich möchte nicht die Schriftgröße anpassen.
Für einen Denkanstoß wäre ich dankbar.
 

DonManfred

Expert
Licensed User
Longtime User
forum durchsuchen. Da gibt es code um die ausmasse eines Textes in einer bestimmten Schriftgrösse zu ermitteln.
Diese Routine kannst Du benutzen und bastelst dir damit was... Text aufsplitten um jeweils ganze Worte anzuhängen.
Dann berechnest du von deinem Text die benötigte Breite...
Irgendwann überschreitest Du die Breite des Labels was einen Umbruch auslösen würde... Damit hast du dann auch die Textlänge "die passt"
 

mw71

Active Member
Licensed User
Longtime User
wie Manfred schon schreibt, Forumssuche ;)
Damals hatte ich folgenden Code gefunden:
B4X:
Sub GetButtonSize(btn As Button, pnl As Panel) As Int
   
Dim cvs As Canvas

    cvs.Initialize(pnl)
    Return cvs.MeasureStringWidth(btn.Text,btn.Typeface,btn.TextSize) + getPaddingLeft(btn) + getPaddingRight(btn)

End Sub
'Gets the Left padding of the given view
Sub getPaddingLeft(v As View) As Int
    Dim jo = v As JavaObject
    Return jo.RunMethod("getPaddingLeft", Null)
End Sub
'Gets the Right padding of the given view
Sub getPaddingRight(v As View) As Int
    Dim jo = v As JavaObject
    Return jo.RunMethod("getPaddingRight", Null)
End Sub

grüße
 

pjo12345

Active Member
Licensed User
Longtime User
Die Suche habe ich schon bemüht aber hatte wohl die falschen Suchbegriffe.
Danke für den Code. Ich versuche es mal damit.
 

pjo12345

Active Member
Licensed User
Longtime User
Habe jetzt einige Versuche gemacht aber irgendwie wird das nichts. Ich komme da absolut nicht weiter. Bei den CodeSnippets habe ich einige Sachen gefunden aber die bringen mich nicht weiter bzw. verstehe ich das nicht oder weiß nicht wie ich das benutzen soll (getPadding...).

@mw71: In deinem Codebeispiel bekomme ich als Ergebnis immer 72. Egal wie groß oder klein der Button ist.

Vielleicht habe ich mich auch falsch ausgedrückt.

Ich möchte ermitteln, wie viele Zeichen ein String lang sein darf damit er ohne Wortumbruch in ein Label passt. Ich möchte nicht das Label anpassen und auch nicht die Schriftgröße ändern damit der String passt.
 

mw71

Active Member
Licensed User
Longtime User
moin,

ja, direkt wird das so sicher nicht gehen, keine Ahnung ob es dafür fertigen Code gibt.
Was gehen müsste: For Next Schleife in der du den String zerlegst und dann mit 1, 2, 3...4.....10 Zeichen testest ob es rein passt.
(also ob der benötigte Buttonsize kleiner ist als dein Button, evtl. mit etwas Offset)

Ist sicher keine Top Lösung, aber sollte funktionieren.

grüße
 

klaus

Expert
Licensed User
Longtime User
Ich möchte ermitteln, wie viele Zeichen ein String lang sein darf damit er ohne Wortumbruch in ein Label passt.
Dafür gibt es, meines Wissens, keine direkte Funktion.
Die Anzahl der Zeichen ist unterschiedlich je nach Text, denn die Zeichen haben nicht die gleiche Breite!
Das heisst dass die Textbreite je nach dem Text unterschiedlich ist, ausser Du nimmst Fonts mit gleicher Buchstabenbreite!
Jetzt die Frage, was ist das Grundproblem?
 

pjo12345

Active Member
Licensed User
Longtime User
Das Grundproblem ist, dass ich ein Label mit Text füllen möchte. Wobei der Anfang rechtsbündig und das Ende linksbündig angeordnet sein soll. Der Zwischenraum soll mit Punkten aufgefüllt werden. Zu Vergleichen mit einer Speisekarte, links das Getränk rechts der Preis und dazwischen Punkte. Z. B. Bier.................... 3.50.
 

klaus

Expert
Licensed User
Longtime User
Wenn nur eine Zeile im Label ist, könnte man es mit MeasureStringWidth machen.
Einen String nehmen den linken und rechten Text zufügen und dann Punkze dazwischen einfügen bis die Breite gefüllt ist.
Wenn es mehrere Zeilen sind, befürchte ich dass die Punkte nicht genau übereinader angeornet sind.
Ausser du nimmst eine monospace Schriftart.
Mit einer monospace Schriftart könnte man die Breite eines Buchstaben mit MeasureStringWidth messen.
Dann weiss man wie viele Buchstaben in die Breite des Labels reingehen und dann den String mit den fehlenden Punkten füllen.
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Bei DEN Anforderungen würde ich zu 100000% einen font mit fester Schriftbreite nehmen. Courier New z.B.
Anders wirst Du das nicht sauber hinbekommen. Also so, dass alles schön in "einer flucht" ist...
Alternativr wäre evtl. ZWEI Labels zu verwenden. Eins für den linksbündigen text (Speise), eins für den rechtsbündigen (Preis).

Bei Schriften mit gleicher Schriftbreite kannst du auch relativ einfach (und gleichbleibend) die maximale Zeichenzahl je Zeile ermitteln...
 

pjo12345

Active Member
Licensed User
Longtime User
Ich glaube jetzt habe ich es:

B4X:
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
   
    Dim text1, text2 As String
    Dim sf As StringFunctions
    Dim lbl As Label
    Dim cvs As Canvas
    Dim w As Float
    text1 = "Bier"
    text2 = "2.50 €"
    sf.Initialize
    lbl.Initialize("lbl")
    cvs.Initialize(Activity)
    Activity.AddView(lbl,10%x,0,40%x,30dip)
    lbl.Color = Colors.Red
    lbl.Typeface=Typeface.MONOSPACE
    Log("X=  " & cvs.MeasureStringWidth("X",Typeface.MONOSPACE,14))
    Log("lbl.Width=  " & lbl.Width)
    w = Floor(lbl.Width/cvs.MeasureStringWidth("X",Typeface.MONOSPACE,14))
    Log("max Char:  " & w)
    w = w-text2.Length
    Log("max Char - text2:  " & w)
    lbl.Text = sf.Pad(text1,".",w,True) & text2
End Sub
 

Attachments

  • MaxCharInLabel.zip
    6.3 KB · Views: 264

ilan

Expert
Licensed User
Longtime User
Du koenntest auch clv benutzten und anstatt 1 label 3 label benutzen.

Links is das label rechtsbuendig und rechts links buendig and in der mitte fuellst du das label mit punkten.

Wenn es eine speise karte sein soll dann musst du ja sowieso eine scrollview benutzten und da wuerde ich schon clv nehmen. wirds einfacher und schneller andsatt jedes label die leange ausrechnen.
 

pjo12345

Active Member
Licensed User
Longtime User
Diese Variante hatte ich auch schon. Aber ich möchte es links linksbündig und rechts rechtsbündig. Meine Label habe ich in einen Scrollview. Ich rechne ja nur beim Start einmal aus, wie viele Zeichen in mein Label passen. Mit dem Ergebnis kann ich dann meine Strings zusammenstellen.
Das Beispiel mit der Speisekarte habe ich zum besseren Verständnis gewählt.
 
Top