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 user profile iconStefan S.:

An sowas umständliches hab ich auch schon gedacht ... habs dann aber auch erst mal sein lassen. :wink:

Zu user profile iconCoder:
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 user profile iconnoidic:
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,
user profile iconStefan 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 user profile iconLannes. Bei mir klappt das auch super.