Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Höhe eines Labels mit WordWrap
Patriol - Mi 11.04.07 14:30
Titel: Höhe eines Labels mit WordWrap
Hallo,
ich erzeuge zu Laufzeiten ein Label. Der angezeigt Text kann aber relativ Lang sein, deswegen hab ich WordWrap := true damit der Text umgebrochen werden kann. AutoSize musste ich false setzen, da ich eine festgelegte Länge des Labels habe.
Meine Frage ist, wie kann ich nun die Höhe des Labels ermitteln, wenn der Text darauf dargestellt wird. Zur Zeit seh ich immer nur die erste Zeile!
Danke für eure Hilfe.
Stefan S. - Mi 11.04.07 15:17
Genau das selbe Problem hab ich zufällig auch. ^^ Die Zeilenumbrüche werden zwar gemacht, aber man sieht nur die erste Zeile, weil die Höhe des Labels nicht entsprechend eingestellt ist. Und die soll natürlich (auch in meinem Fall) so sein, dass genau alle Zeilen angezeigt werden, weder größer noch kleiner.
Mit Label.Canvas.TextHeight kann man zwar feststellen, wie viele Pixel der Text in der jeweiligen Schriftart hoch ist, aber das nützt in dem Fall nichts, weil man ja nicht weiss, wie viele Zeilen der Text einnimmt. Mir würde da eine ganz umständliche Lösung einfallen, nämlich dass man immer mit Canvas.TextWidth darauf schließt, welche Wörter noch in eine Zeile passen und welche schon in der nächsten stehen müssen und so dann auf die Zeilenanzahl kommt, aber da gibt es sicher auch einen eleganten, weniger aufwändigen Weg.
Coder - Mi 11.04.07 16:44
Nehmt ein RichEdit und macht im OnResizeRequest:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.RichEdit1ResizeRequest(Sender: TObject; Rect: TRect); begin RichEdit1.Height := Rect.Bottom - Rect.Top; end; |
MfG
noidic - Mi 11.04.07 16:54
Mh, blöde Frage, warum nicht einfach Autosize einschalten und MinWidth/MaxWidth so anpassen, dass die Breite passt?
Patriol - Mi 11.04.07 17:05
Zu
Stefan S.:
An sowas umständliches hab ich auch schon gedacht ... habs dann aber auch erst mal sein lassen. :wink:
Zu
Coder:
Werd mal schaun was ich mit der Komponente anfangen kann. Es wäre aber nicht schlecht wenn ichs auch mit einem Label hinbekommen könnte.
Zu
noidic:
| Zitat: |
Mh, blöde Frage, warum nicht einfach Autosize einschalten und MinWidth/MaxWidth so anpassen, dass die Breite passt? |
Also ich kann dies nicht machen, da ich das Label mittels Anchors := [akLeft,akTop,akRight] in der Breite ändere. Wollte nicht unbeding im Resize-Event expliziet alle dynamisch erzeuten Komponenten manuell auf die Breite anpassen.
noidic - Mi 11.04.07 17:12
Mh, in meiner hilfe steht, dass bei eingeschaltetem WordWrap autosize nur die Höhe, nicht aber die Breite ändert, müsste also doch so gehen.
Tante Edith: Ok, in der Hilfe stehts zwar, funktioniert aber nicht :)
Lannes - Mi 11.04.07 18:44
Hallo,
Stefan S. hat folgendes geschrieben: |
...
Mit Label.Canvas.TextHeight kann man zwar feststellen, wie viele Pixel der Text in der jeweiligen Schriftart hoch ist, aber das nützt in dem Fall nichts, weil man ja nicht weiss, wie viele Zeilen der Text einnimmt. Mir würde da eine ganz umständliche Lösung einfallen, nämlich dass man immer mit Canvas.TextWidth darauf schließt, welche Wörter noch in eine Zeile passen und welche schon in der nächsten stehen müssen und so dann auf die Zeilenanzahl kommt, aber da gibt es sicher auch einen eleganten, weniger aufwändigen Weg... |
Der elegantere Weg:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure SetLabelCaptionAndHeight(aLabel: TLabel;s: String); var aRect : TRect; bmp : TBitmap; begin with aLabel do begin aRect := Rect(0,0,Width,0); bmp := TBitmap.Create; try bmp.Canvas.Font.Assign(Font); Caption := s; Height := DrawText(bmp.Canvas.handle, PChar(s), Length(s), aRect, dt_calcrect or dt_wordbreak); finally bmp.Free; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin SetLabelCaptionAndHeight(Label1,'Höhe eines Labels mit WordWrap'); end; |
Stefan S. - Do 12.04.07 00:17
Bei mir funktioniert es, dankeschön. :)
Patriol - Do 12.04.07 22:42
Joa danke für die Lösung
Lannes. Bei mir klappt das auch super.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!