![]() |
Wordwrap umbruch
Bei einer Zuweisung von Wordwrap an einem Label wird der gesamte string umgebrochen abhängig von der weite des Controls.
Wie kann ich jetzt verhindern das er auf mehr wie 2 Zeilen umbricht? Wenn mehr wie 2 Zeilen dann soll ein Ellipsis angefügt werden. gruss |
AW: Wordwrap umbruch
Um was es mir geht.
Ich möchte einen string ohne es zu sehr zu komplizieren so auslegen das er die Eigenschaften vom Label übernimmt inkl. Zeilenumbruch usw.
Delphi-Quellcode:
Ich prüfe zuerst ob der string 'blank' enthält also ein Leerzeichen.
function TAudioSessionVolume.AudioSessionInfo: TAudioSessionInfo;
var Lbl: TLabel; tmpStr: string; bNull: BOOL; i: integer; begin Result := NullAudioSessionInfo; bNull := False; tmpStr := ExtractFileExt(FAudioSessionInfo.DisplayName); if Length(tmpStr) > 1 then tmpStr := ChangeFileExt(FAudioSessionInfo.DisplayName, '') else tmpStr := FAudioSessionInfo.DisplayName; if tmpStr <> '' then begin Lbl := TLabel.Create(nil); Lbl.Caption := tmpStr; Lbl.AutoSize := True; // check for blank for i := 1 to Length(tmpStr) do begin if tmpStr[i] = ' ' then bNull := True; end; if not bNull then begin if (Lbl.Width > ParentWidth) and (ParentWidth > 0) then begin Lbl.Caption := Lbl.Caption + '...'; while Lbl.Width > ParentWidth do Lbl.Caption := Copy(Lbl.Caption, 1, Length(Lbl.Caption) - Lbl.Font.Size) + '...'; end; end; Lbl.WordWrap := bNull; FAudioSessionInfo.WordWrap := bNull; FAudioSessionInfo.DisplayName := Lbl.Caption; tmpStr := ''; FreeAndNil(Lbl); Result := FAudioSessionInfo; end; end; Wenn eine Leerzeichen existiert soll der string umgebrochen werden dazu setze ich dann Lbl.Wordwrap auf true. Wenn der string kein 'blank' enthält und länger ist wie die gesamte weite des Controls (ParentWidth) soll Ellipsis Character angehängt werden. (funktioniert und ist in Ordnung). Wenn der string mehrere 'blank' enthält soll er maximal 2 Zeilen umbrechen und dann ein Ellipsis Character angehängt werden das funktioniert nicht wie gewünscht. Der WordWrap scheint aber nicht wirklich vom string angenommen zu werden. Wo liegt mein Denkfehler? Das Problem sieht man im Anhang. gruss |
AW: Wordwrap umbruch
Es ist nur eine Vermutung aber ich glaube Autosize und Wordwrap vertragen sich nicht.
edit ![]() |
AW: Wordwrap umbruch
Zitat:
Wenn ich Autosize nicht auf true setze wird die Höhe des Label nicht verändert die ich dann benötige um beide Zeilen nach dem Umbruch anzuzeigen. Siehe Zitat deines links.. Zitat:
Delphi-Quellcode:
mag zwar die höhe des Labels ändern addiert aber nicht den Umbruch in dieser form "13#10" zu meinem Label.
Lbl.WordWrap := bNull;
FAudioSessionInfo.DisplayName := Lbl.Caption; Der Label sähe dann immer noch so aus.. "Emil's MediaPlayer" und nicht wie er sollte ('Emil's' + 13#10 + 'MediaPlayer') Da ich den String nachher nach GDI+ schicken muss und mir der Umbruch fehlt im string wird das nix. Ich dachte das die property WordWrap des Labels das automatisch macht (versteckt) scheint aber nicht so. Auf Deutsch.. Der Zeilenumbruch hat keinerlei Effekt auf den zurückgegebenen String "FAudioSessionInfo.DisplayName" gruss |
AW: Wordwrap umbruch
Du möchtest also alle Leerzeichen in einem String mit einem Zeilenumbruch austauschen?:roll:
![]() |
AW: Wordwrap umbruch
Zitat:
Ich möchte den gesamten Text umbrechen und wenn die Zeilenanzahl 2 erreicht ist Ellipsis Character anhängen. Danach darf kein weiterer Umbruch mehr stattfinden. gruss |
AW: Wordwrap umbruch
Delphi-Quellcode:
Ausgabe:
program WrapTextProject;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.StrUtils; const cText = 'The rain in Spain falls mainly on the plain.'; var MyWrapedText, MyWrapedWithEllipsisText: string; I, SplitPoints: Integer; begin try Writeln('Org: ' + sLineBreak, cText, sLineBreak); MyWrapedText := WrapText(cText, sLineBreak, [' '], 15); Writeln('Wraped: ' + sLineBreak, MyWrapedText, sLineBreak); MyWrapedWithEllipsisText := ''; SplitPoints := 0; for I := 1 to Length(MyWrapedText) do begin if IsDelimiter(sLineBreak, MyWrapedText, I) then begin Inc(SplitPoints); if SplitPoints > 2 then begin MyWrapedWithEllipsisText := MyWrapedText; SetLength(MyWrapedWithEllipsisText, I + 1); MyWrapedWithEllipsisText := MyWrapedWithEllipsisText + '...'; Break; end; end; end; Writeln('Wraped with Ellipsis: ' + sLineBreak, MyWrapedWithEllipsisText, sLineBreak); Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
Code:
Org:
The rain in Spain falls mainly on the plain. Wraped: The rain in Spain falls mainly on the plain. Wraped with Ellipsis: The rain in Spain falls ... |
AW: Wordwrap umbruch
Ich weiß nicht ob ich das richtig verstanden habe.
Wenn ja dann muss AutoSize auf False, WordWrap auf True und dann ziehst du das Label so groß wie du es brauchst. |
AW: Wordwrap umbruch
Hallo,
Zitat:
und beim Auslesen es eine Rolle spielt, wo groß das Label ist. Bei einem Memo ist das auch auch so. |
AW: Wordwrap umbruch
Ich weis was WrapText ist aber diese API ist nicht die Lösung.
Ich sagte ja schon die Anzahl der Zeilen "2" darf nicht überschritten werden außerdem wird bei WrapText die gesamte breite des Textes zur weite des Controls nicht berücksichtig. Ellipsis macht nur sinn wenn der String in der 2 Zeile die weite des Controls überschreitet. Meine Frage! Zitat:
Zitat:
Zitat:
Siehe..
Delphi-Quellcode:
Umbruch := 'Emil''s' + 13#10 + 'MediaPlayer';
Zitat:
Delphi-Quellcode:
Lbl.Caption := Copy(Lbl.Caption, 1, Length(Lbl.Caption) - Lbl.Font.Size) + '...';
Werde den String splitten und die länge sowie den Umbruch von Hand berechnen. Der Label hat sich dann erledigt. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz