Zeilenumbruch geht nicht...

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Zeilenumbruch geht nicht...

Beitrag von Lion »

Hallo Jungs,

wieso funktioniert bei Lazarus kein Zeilenumbruch bzw. WordWrap, z.B. mit Label oder DBLabel? AutoSize steht auf True, wie es sein muss, aber es funktioniert trotzdem nicht. Mit Delphi bei gleichen Einstellungen klappt alles wunderbar, mit Lazarus aber nicht.

Die Lösung, dass man AutoSize auf False setzt und die Breite/Höhe angibt hilft mir leider nicht, da ich nie weiß wie lang der Text wird. Mal 10 Zeichen lang, mal 400.

Hat jemand eine Idee? Danke!

wp_xyz
Beiträge: 5146
Registriert: Fr 8. Apr 2011, 09:01

Re: Zeilenumbruch geht nicht...

Beitrag von wp_xyz »

Wenn man WordWrap auf true und AutoSize auf false setzt, funktioniert der Zeilenumbruch, sofern die Labelbreite kleiner ist als die Textlänge. Der Unterschied zu Delphi ist, dass Lazarus mit AutoSize = true immer auf den Ein-Zeilenmodus zurückschaltet, und nicht wie Delphi den mehrzeiligen Text beibehält und damit die Labelgröße bestimmt. Wär' m.E. einen Feature-Request im BugTracker wert.

Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Re: Zeilenumbruch geht nicht...

Beitrag von Lion »

wp_xyz hat geschrieben:Wenn man WordWrap auf true und AutoSize auf false setzt, funktioniert der Zeilenumbruch, sofern die Labelbreite kleiner ist als die Textlänge. Der Unterschied zu Delphi ist, dass Lazarus mit AutoSize = true immer auf den Ein-Zeilenmodus zurückschaltet, und nicht wie Delphi den mehrzeiligen Text beibehält und damit die Labelgröße bestimmt. Wär' m.E. einen Feature-Request im BugTracker wert.
Hm... und was mache ich jetzt? Wie setzte ich die Höhe des Labels der Länge des Textes entsprechend?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Zeilenumbruch geht nicht...

Beitrag von Christian »

Autosize gibts doch bei Delphi gar nicht, das ne lazarus erfindung soweit ich weiss um mit unterschiedlichen Widgetsets umzugehn. In Windows only hat man das Problem nicht.

Du macht das jetzt einfach so das du autosize auslässt und mit Anchors oder Align die breite deines Labels bestimmst. Dann ist alles gut.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

wp_xyz
Beiträge: 5146
Registriert: Fr 8. Apr 2011, 09:01

Re: Zeilenumbruch geht nicht...

Beitrag von wp_xyz »

Christian hat geschrieben:Autosize gibts doch bei Delphi gar nicht
Delphi 7 hatte es schon, ältere Versionen habe ich nicht mehr verfügbar.

Ansonsten kannst du mit DrawText und dem Flag DT_CALCRECT die Größe des umgebrochenen Textes berechnen und anschließend die Größe des Labels entsprechend setzen.

Das Verfahren klingt nach Windows, aber nachdem die Routinen in der Unit LCLIntf stehen, sollte es plattformunabhängig implementiert sein.

Code: Alles auswählen

 
uses
  LCLType, LCLIntf; 
 
procedure TForm1.FormCreate(Sender: TObject);
var
  txtRect: TRect;
  flags: DWord;
  txt: String;
begin
  Label1.Left := 8;
  Label1.Top := 8;
  Label1.Width := 128;
  label1.Height := 128;
  Label1.AutoSize := false;
  Label1.Wordwrap := true;
  Label1.Caption := 'Das ist ein sehr langer, langer, langer Text';
 
  flags := DT_WORDBREAK and not DT_SINGLELINE or DT_CALCRECT;
  txt :=Label1.Caption;
  txtRect := Rect(0, 0, Label1.Width, Label1.Height);
  LCLIntf.DrawText(Label1.Canvas.Handle, PChar(txt), Length(txt), txtRect, flags);
 
  Label1.Width := txtRect.Right - txtRect.Left;
  label1.Height := txtRect.Bottom - txtRect.Top;
 
  label1.Color := clWhite; // damit man die Größe sieht
end;
 

Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Re: Zeilenumbruch geht nicht...

Beitrag von Lion »

Kann ich damit den Labels auch irgendwelche Schriftarten oder Farben zuweisen? Ich habe irgendwo gelesen, dass nicht. Stimmt das?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zeilenumbruch geht nicht...

Beitrag von Michl »

z.B.

Code: Alles auswählen

  Label1.Font.Color:=clRed;
  Label1.Font.Name:='Arial Black'; 
funktioniert bei mir.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

wp_xyz
Beiträge: 5146
Registriert: Fr 8. Apr 2011, 09:01

Re: Zeilenumbruch geht nicht...

Beitrag von wp_xyz »

Falls mein Code weiter oben mit Michls Code zusammen nicht funktioniert, müsstest du vor dem LCLInft.DrawText dem Canvas des Labels noch dessen Font zuweisen: Label1.Canvas.Font.Assign(Label1.Font)

Lion
Beiträge: 197
Registriert: Mo 24. Mär 2014, 09:58

Re: Zeilenumbruch geht nicht...

Beitrag von Lion »

Christian hat geschrieben: Du macht das jetzt einfach so das du autosize auslässt und mit Anchors oder Align die breite deines Labels bestimmst. Dann ist alles gut.
Wie bestimme ich die Labelhöhe wenn ich nicht weiß wie lang der Text wird? Mit Anchors und Align geht es nicht.

wp_xyz
Beiträge: 5146
Registriert: Fr 8. Apr 2011, 09:01

Re: Zeilenumbruch geht nicht...

Beitrag von wp_xyz »

wenn ich nicht weiß wie lang der Text wird
Das musst du auch nicht. Aber du musst wissen, wieviel Platz du dem Text zur Verfügung stellen willst/kannst, bevor ein Zeilenumbruch durchgeführt werden soll. Damit kannst du dann die Methode mit DrawText(..., DT_CALCRECT...) - siehe Code weiter oben - anwenden.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Zeilenumbruch geht nicht...

Beitrag von Christian »

Doch das gelingt mit Anchors du musst im Anchoreditor als oberes Control dein Label einstellen und das andere Control darauf beziehen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Mathias
Beiträge: 6917
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zeilenumbruch geht nicht...

Beitrag von Mathias »

Bei mir bricht er die Zeile um, oder verstehe ich etwas falsch ?

Code: Alles auswählen

Label2.Caption:='Hello World'#13#10'Hello World';
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten