Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Größe eines Label mit WordWrap richtig definieren (https://www.delphipraxis.net/168524-groesse-eines-label-mit-wordwrap-richtig-definieren.html)

Helmi 26. Mai 2012 19:00

Größe eines Label mit WordWrap richtig definieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich hab grad ein kleines Problem.

Anbei ein Bild einer Form. Dort ist ein Label names "Label_MSGText" drauf.
Dieses Label bekommt programmseitig verschieden lange Texte, in verschiedenen Schriftgrößen und auch in verschiedenen Sprachen.

Nun möchte ich dass sich die Breite der Form soweit verändert, bis entweder der Text zu Ende ist / des Label-Ende erreicht ist oder, wenn der Text länger ist, eine maximale Breite der Form erreicht wird und dann das Label mehrere Zeilen haben soll.

Eigentlich ist das kein Problem mit den Property "AutoSize" und "WordWrap".
Ich dachte auch noch, wenn ich Anchors auf akRight dass sich dann das Label mit vergrößert wenn ich die Form vergrößere.
Aber irgendwie macht die das nicht wirklich.

Ich wollt das zuvor so machen (Anchors = akRight nicht gesetzt):
Ich lasse WordWrap ausgeschaltet, schreib dann den Text ins Label. Lese mir danach die Höhe und Breite des Labels aus. Wenn die Breite des Labels plus Left des Labels größer ist als die Breite der Form, dann wird die Form verbreitert. Ist die max. erlaubte Breite erreicht, so wird WordWrap des Labels eingeschaltet und die akt. Höhe des Labels ausgelesen. Um die Differenz der zuerst ermittelten Höhe und der akt. Höhe des Labels wird die Form erhöht. Somit habe ich immer die gleichen Abstände etc.
Aber irgendwie scheint das Label es nicht zu wollen, dass man WordWrap ein- und ausschaltet und reagiert dementsprechend nicht (mehr) darauf.

Jetzt meine Frage: Wie könnte ich das am Besten hinbekommen?
(Die Progressbar und das gelbe Image mal aussen vor lassen)

Uwe Raabe 26. Mai 2012 19:48

AW: Größe eines Label mit WordWrap richtig definieren
 
Wenn das Label sich mit der Form vergrößern soll, musst du den Anchor left und right einschalten und AutoSize ausschalten. WordWrap korrespondiert wohl auch nicht so gut mit AutoSize.

Helmi 26. Mai 2012 19:54

AW: Größe eines Label mit WordWrap richtig definieren
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1168238)
Wenn das Label sich mit der Form vergrößern soll, musst du den Anchor left und right einschalten und AutoSize ausschalten. WordWrap korrespondiert wohl auch nicht so gut mit AutoSize.

Ich werds ausprobieren!

Bezüglich AutoSize in Verbindung mit WordWrap sagt mir die Hilfe:

Zitat:

Mit AutoSize können Sie den Client-Bereich des Steuerelements automatisch an die Höhe und die Breite des angezeigten Textes anpassen. Wenn AutoSize False ist, hat die Beschriftung eine feste Größe. Ist AutoSize True, bewirkt jede Änderung am Text eine Anpassung der Beschriftungsgröße. Die Anpassung erfolgt auch, wenn sich die Eigenschaft Font ändert.

Wenn WordWrap den Wert True hat, ist die Breite des Steuerelements fest. Ist AutoSize ebenfalls True, bewirken Änderungen am Text, dass das Steuerelement in der Höhe angepasst wird. Wenn AutoSize True ist und WordWrap False, wird die Höhe des Steuerelements von der Schriftart vorgegeben, und Änderungen am Text bewirken eine Breitenänderung.

Helmi 26. Mai 2012 21:09

AW: Größe eines Label mit WordWrap richtig definieren
 
Anscheinend hat WordWrap ein Problem mit AutoSize in Verbindung mit Anchors.
Setze ich Anchors auf akRight und AutoSize auf true, wird die Breite des Labels auf die aktuellen Textbreite gesetzt. Durch akRight kann ich per Maus die Breite des Labels manuell verändern.
Schreibe ich dann einen Text ins Label der länger ist wird durch WordWrap zwar der Text umgebrochen, aber nur nach der alten Breite, wie sie zum Designzeitpunkt war

Popov 26. Mai 2012 21:24

AW: Größe eines Label mit WordWrap richtig definieren
 
Mach es einfach, nimm TPanel, stell es auf die gewünschte Breite und Höhe, füge TLabel rein, stelle es auf alClient und WordWrap, schon verteilt sich der Text.

Edit:

Ok, immer vorher die Problemstellung lesen. Sorry, du willst was anderes.

Helmi 26. Mai 2012 22:05

AW: Größe eines Label mit WordWrap richtig definieren
 
Also ich habs jetzt.

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  Label_MSGText.Caption := '';

  ShowMessage(IntToStr(Label_MSGText.Height));

  Label_MSGText.WordWrap := false;

  Label_MSGText.Constraints.MaxWidth := Form2.Width - Label_MSGText.Left - 50;

  Label_MSGText.Caption := Edit1.Text;
 
  Label_MSGText.WordWrap := true;

  ShowMessage(IntToStr(Label_MSGText.Height));
end;
Somit bricht das Label ab einer bestimmten Breite um. Diese kann variabel sein.
Bei Anchors sind nur noch akLeft und akTop, also die Standard-Einstellungen aktiv.

Warum man das so kompliziert machen muss kann ich leider nicht sagen.

[Edit]
AutoSize kann in OI fix auf true gesetzt werden und braucht nicht mit WordWrap im Code mit ein- und ausgeschaltet werden!

Uwe Raabe 27. Mai 2012 08:52

AW: Größe eines Label mit WordWrap richtig definieren
 
Und wie reagiert das Label und das Form jetzt, wenn du das Form vergrößerst oder verkleinerst?

Helmi 27. Mai 2012 09:00

AW: Größe eines Label mit WordWrap richtig definieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe (Beitrag 1168268)
Und wie reagiert das Label und das Form jetzt, wenn du das Form vergrößerst oder verkleinerst?

keine Ahnung :-)

Nein, also wenn ich den Code mehrmals ausführe mit anderen Breiten der Form, dann wird das Label dementsprechend angepasst.

Ich hab mal mein Testprojekt angehängt.
Einfach die Form verbreitern/verschmälern und erneut den Button drücken

Uwe Raabe 27. Mai 2012 09:27

AW: Größe eines Label mit WordWrap richtig definieren
 
Ein Label das sich dynamisch anpasst:

OI
Anchors = [akLeft, akTop, akRight]
Autosize = false;
WordWrap = true;


Delphi-Quellcode:
procedure SetLabelCaption(ALabel: TLabel; const AValue: string);
begin
  ALabel.Caption := AValue;
  ALabel.AutoSize := true;
  ALabel.AutoSize := false;
end;

procedure ResizeLabel(ALabel: TLabel);
var
  W: Integer;
begin
  W := ALabel.Width;
  ALabel.AutoSize := true;
  ALabel.AutoSize := false;
  ALabel.Width := W;
end;

procedure TForm140.Button1Click(Sender: TObject);
begin
  SetLabelCaption(Label1, Edit1.Text);
end;

procedure TForm140.FormResize(Sender: TObject);
begin
  ResizeLabel(Label1);
end;
Wenn das Label in einem Panel oder etwas Ähnlichem mit einem OnResize-Event liegt, dann sollte man natürlich diesen Event nehmen.

Helmi 27. Mai 2012 09:35

AW: Größe eines Label mit WordWrap richtig definieren
 
schaut interessant aus - nur meiner Anforderungen waren etwas anders.

Ich lasse zuerst WordWrap ausgeschaltet und schreibe dann den Text ins Label.
Ist dann das Label zu breit für die Form wird die Form so lange verbreitert bis entweder das Label nun reinpasst oder bis eine zuvor vorgegebene maximale Breite der Form erreicht wurde.
Ist dies geschehen, so muss sich das Label von der Höhe her anpassen. Also WordWrap wird wieder eingeschaltet und die sich daraus neu ergebende Höhe ausgelesen.
Um die Differenz der aktuellen Höhe des Labels zur alten Höhe des Labels wird die Form erhöht.

Somit beinflussen sich die Form und das Label gegenseitig, je nach Anforderung


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz