Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Wordwrap umbruch (https://www.delphipraxis.net/198619-wordwrap-umbruch.html)

EWeiss 19. Nov 2018 14:04

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

EWeiss 19. Nov 2018 16:20

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:
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

KodeZwerg 19. Nov 2018 19:14

AW: Wordwrap umbruch
 
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...

EWeiss 19. Nov 2018 21:02

AW: Wordwrap umbruch
 
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

TiGü 19. Nov 2018 22:11

AW: Wordwrap umbruch
 
Du möchtest also alle Leerzeichen in einem String mit einem Zeilenumbruch austauschen?:roll:

http://docwiki.embarcadero.com/Libra...Utils.WrapText

EWeiss 19. Nov 2018 22:16

AW: Wordwrap umbruch
 
Zitat:

Zitat von TiGü (Beitrag 1418483)
Du möchtest also alle Leerzeichen in einem String mit einem Zeilenumbruch austauschen?:roll:

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

TiGü 20. Nov 2018 10:35

AW: Wordwrap umbruch
 
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
...

DieDolly 20. Nov 2018 10:37

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.

hoika 20. Nov 2018 10:57

AW: Wordwrap umbruch
 
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.

EWeiss 20. Nov 2018 13:24

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:

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..
Delphi-Quellcode:
 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?
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 23:31 Uhr.
Seite 1 von 3  1 23      

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