| Autor |
Beitrag |
Patriol
      
Beiträge: 52
D3, D5, D7
|
Verfasst: 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.
      
Beiträge: 184
D5
|
Verfasst: 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
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: 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
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: 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 
      
Beiträge: 52
D3, D5, D7
|
Verfasst: 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.
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
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Stefan S.
      
Beiträge: 184
D5
|
Verfasst: Do 12.04.07 00:17
Bei mir funktioniert es, dankeschön. 
|
|
Patriol 
      
Beiträge: 52
D3, D5, D7
|
Verfasst: Do 12.04.07 22:42
Joa danke für die Lösung Lannes. Bei mir klappt das auch super.
|
|
|