AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wordwrap umbruch

Ein Thema von EWeiss · begonnen am 19. Nov 2018 · letzter Beitrag vom 20. Nov 2018
Antwort Antwort
Seite 1 von 3  1 23      
EWeiss
(Gast)

n/a Beiträge
 
#1

Wordwrap umbruch

  Alt 19. Nov 2018, 15:04
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Wordwrap umbruch

  Alt 19. Nov 2018, 17:20
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:
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;
Ich prüfe zuerst ob der string 'blank' enthält also ein Leerzeichen.
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

Geändert von EWeiss (11. Jul 2019 um 16:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wordwrap umbruch

  Alt 19. Nov 2018, 20:14
Es ist nur eine Vermutung aber ich glaube Autosize und Wordwrap vertragen sich nicht.

edit
Schau mal was ich gefunden habe, vielleicht hilft es Dir...
Gruß vom KodeZwerg

Geändert von KodeZwerg (19. Nov 2018 um 20:18 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Wordwrap umbruch

  Alt 19. Nov 2018, 22:02
Zitat:
Es ist nur eine Vermutung aber ich glaube Autosize und Wordwrap vertragen sich nicht.
Hat damit nichts zu tun.
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:
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.
Ich denke muss das mit dem Label verwerfen das macht so keinen sinn da mir die Umbrüche im String nicht addiert werden.

Delphi-Quellcode:
Lbl.WordWrap := bNull;
FAudioSessionInfo.DisplayName := Lbl.Caption;
mag zwar die höhe des Labels ändern addiert aber nicht den Umbruch in dieser form "13#10" zu meinem Label.
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

Geändert von EWeiss (19. Nov 2018 um 22:24 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Wordwrap umbruch

  Alt 19. Nov 2018, 23:11
Du möchtest also alle Leerzeichen in einem String mit einem Zeilenumbruch austauschen?

http://docwiki.embarcadero.com/Libra...Utils.WrapText
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Wordwrap umbruch

  Alt 19. Nov 2018, 23:16
Du möchtest also alle Leerzeichen in einem String mit einem Zeilenumbruch austauschen?

http://docwiki.embarcadero.com/Libra...Utils.WrapText
Nein.. sorry wenn das so rübergekommen ist.

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

Geändert von EWeiss (19. Nov 2018 um 23:31 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Wordwrap umbruch

  Alt 20. Nov 2018, 11:35
Delphi-Quellcode:
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.
Ausgabe:

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
...
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: Wordwrap umbruch

  Alt 20. Nov 2018, 11:37
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Wordwrap umbruch

  Alt 20. Nov 2018, 11:57
Hallo,
Zitat:
Auf Deutsch.. Der Zeilenumbruch hat keinerlei Effekt auf den zurückgegebenen String "FAudioSessionInfo.DisplayName"
Das ist richtig. Wäre auch schlimm (unschön), wenn in das Label was reingeschrieben wird
und beim Auslesen es eine Rolle spielt, wo groß das Label ist.
Bei einem Memo ist das auch auch so.
Heiko
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Wordwrap umbruch

  Alt 20. Nov 2018, 14:24
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:
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.
Zitat:
Wenn ja dann muss AutoSize auf False, WordWrap auf True und dann ziehst du das Label so groß wie du es brauchst.
Nein die weite des Control ist fix da ist nix mit ziehen und AutoSize muss true sein.

Zitat:
Das ist richtig. Wäre auch schlimm (unschön), wenn in das Label was reingeschrieben wird
Es soll ja nichts reingeschrieben sondern der Label umgebrochen werden.

Siehe..
 Umbruch := 'Emil''s' + 13#10 + 'MediaPlayer';
Zitat:
und beim Auslesen es eine Rolle spielt, wo groß das Label ist.
Was geschieht hier bei der Berechnung wenn AutoSize nicht True ist?
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

Geändert von EWeiss (20. Nov 2018 um 14:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 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