Autor Beitrag
Patriol
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52


D3, D5, D7
BeitragVerfasst: Mi 11.04.07 14:30 
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.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 184


D5
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Mi 11.04.07 16:44 
Nehmt ein RichEdit und macht im OnResizeRequest:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.RichEdit1ResizeRequest(Sender: TObject; Rect: TRect);
begin
  RichEdit1.Height := Rect.Bottom - Rect.Top;
end;


MfG
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Mi 11.04.07 16:54 
Mh, blöde Frage, warum nicht einfach Autosize einschalten und MinWidth/MaxWidth so anpassen, dass die Breite passt?

_________________
Bravery calls my name in the sound of the wind in the night...
Patriol Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52


D3, D5, D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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 :)

_________________
Bravery calls my name in the sound of the wind in the night...
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:
ausblenden 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;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Stefan S.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 184


D5
BeitragVerfasst: Do 12.04.07 00:17 
Bei mir funktioniert es, dankeschön. :)
Patriol Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52


D3, D5, D7
BeitragVerfasst: Do 12.04.07 22:42 
Joa danke für die Lösung user profile iconLannes. Bei mir klappt das auch super.