Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String mit ... abkürzen (https://www.delphipraxis.net/503-string-mit-abkuerzen.html)

Nuclear-Ping 20. Mär 2008 15:21

Re: String mit ... abkürzen
 
Hallo marabu,

ich denke du hast den Code getestet, sonst würdest du ihn sicher nicht hier reinstellen. Wahrscheinlich funktioniert er auch bei dir so, wie er soll. ;)

Aber wie oben im 1. Edit angemerkt, kürzt er mir den String zwar auch, allerdings viel zu weit hinten, obwohl das Rect genau passt, wenn ich es mir mit FListView.Canvas.DrawFocusRect (Rect) anzeigen lasse. :gruebel:

marabu 20. Mär 2008 15:29

Re: String mit ... abkürzen
 
Kannst du mein Beispiel (Text und Rect) so anpassen, dass ich dein Problem erkenne?

Rakshasa 20. Mär 2008 15:55

Re: String mit ... abkürzen
 
Wäre MinimizeName() nicht eine Alternative?

marabu 20. Mär 2008 16:28

Re: String mit ... abkürzen
 
Eher nein - MinimizeName() arbeitet auf (einzeiligen) Pfadnamen. Ich glaube, hier geht es allgemein um Texte.

Nuclear-Ping 21. Mär 2008 10:31

Re: String mit ... abkürzen
 
Zitat:

Zitat von marabu
Kannst du mein Beispiel (Text und Rect) so anpassen, dass ich dein Problem erkenne?

Hi marabu,

erstelle dir ein neues Projekt. Auf die Form packst du eine TListView und eine TImageList. Die ImageList setzt du auf Width 2 und Height 100. Den TListView auf vsReport, zwei Spalten. Spalte 1 Breite 32, Spalte 2 100. Die ImageList weißt du der SmallImages-Property der ListView zu.
Delphi-Quellcode:
unit LView_DrawText_TestU;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    ImageList1: TImageList;
    procedure ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    TestStr: String;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses
  StrUtils;

{$R *.dfm}

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  //
end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  Rect: TRect;
  a, w: Integer;
begin
  DefaultDraw := FALSE;

  w := 0;
  for a := 0 to SubItem - 1 do
    w := w + ListView1.Columns[a].Width;

  Rect.Left := (Item.Left - 4 + w) + 2;
  Rect.Top := Item.Top + 2;
  Rect.Right := Rect.Left + ListView1.Columns[SubItem].Width - 2;
  Rect.Bottom := Item.Top + ListView1.SmallImages.Height - 2;

  ListView1.Font.Style := [];

//  ListView1.Canvas.DrawFocusRect(Rect);
  case SubItem of
    1: begin
         ListView1.Canvas.FillRect (Rect);
         DrawText (ListView1.Canvas.Handle, PChar (TestStr), Length (TestStr),
                   Rect, DT_WORDBREAK or
                         DT_NOPREFIX or
                         DT_WORD_ELLIPSIS);
       end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  li: TListItem;
  a: Integer;
begin
  TestStr := DupeString('Der Affe den Sie meinen heißt Parmesan ', 5);
  for a := 1 to 10 do
    begin
      li := ListView1.Items.Add; // Leak erstmal egal
      li.Caption := inttostr (a);
    end;
end;

end.
In dem Beispiel funktioniert DT_WORD_ELLIPSIS nicht. Er schneidet den Text nicht ab.
DT_END_ELLIPSIS hat hier allerdings funktioniert. Aber im richtigen Projekt gabs da auch Probleme.

marabu 21. Mär 2008 13:18

Re: String mit ... abkürzen
 
Hallo,

was soll ich dazu noch schreiben? DT_WORD_ELLIPSIS ist nicht das, was du willst, verhält sich aber aus meiner Sicht erwartungsgemäß. DT_END_ELLIPSIS entspricht genau deinen Wünschen, aber der von dir früher beobachtete Fehler lässt sich mit deinem Beispiel nicht reproduzieren. Ich betrachte dieses Problem solange als gelöst, bis du eine Reproduktionsmöglichkeit gefunden hast und den Thread wieder aufnimmst.

Freundliche Grüße

Nuclear-Ping 21. Mär 2008 16:58

Re: String mit ... abkürzen
 
Laut MSDN ist DT_WORDELLIPSIS schon das, was ich will, vorrausgesetzt ich verstehe das richtig: "Truncates any word that does not fit in the rectangle and adds ellipses." -> Er schneidet das ganze Wort weg, was nicht in das Rect passt und fügt "..." an. Und das funktioniert in dem Beispiel nicht erwartungsgemäß.

DT_END_ELLIPSIS schneidet dahingegen einfach ab, egal ob mitten im Wort oder nicht und hängt die "..." an. Und das ist nicht das, was ich will.

marabu 21. Mär 2008 20:45

Re: String mit ... abkürzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Mario,

vielleicht muss ich doch etwas mehr schreiben. Betrachten wir zwei Beispieltexte:

Delphi-Quellcode:
Text1 := 'Gallia est omnis divisa in partes tres, '
       + 'quarum unam incolunt Belgae, aliam Aquitani, '
       + 'tertiam qui ipsorum lingua Celtae, nostra Galli appellantur.';
Text2 := 'Alles hat ein Ende'#13#10'nur die Wurst hat zwei';
Man beachte: Text2 enthält einen harten Zeilenumbruch. Ich brauche diese zwei Texte, denn DT_WORD_ELLIPSIS betrachtet Zeilenenden, DT_END_ELLIPSIS betrachtet das Textende. Ich habe dein Beispielprogramm leicht verändert, so dass alle mir wichtigen Szenarien behandelt werden.

Item 1 und 2 (DT_WORD_ELLIPSIS)
Jede Zeile erhält eine Ellipsis.

Item 3 und 4 (DT_WORD_ELLIPSIS or DT_WORDBREAK)
Durch den weichen Zeilenumbruch entfällt eine Ellipsis am physischen Zeilenende.

Item 5 und 6 (DT_END_ELLIPSIS)
Eine Ellipsis gibt es nur am Textende, nicht am Zeilenende.

Item 7 und 8 (DT_END_ELLIPSIS or DT_WORDBREAK)
Eine Ellipsis am Textende wird auch durch einen automatischen Umbruch nicht verhindert.

So lieber Mario, nun musst du dich entscheiden...

Freundliche Grüße

DeddyH 21. Mär 2008 20:52

Re: String mit ... abkürzen
 
[OT] "De Bello Gallico" von Gaius Julius Caesar... ich bin einigermaßen angemessen beeindruckt :shock: :thumb: [/OT]

turboPASCAL 22. Mär 2008 06:44

Re: String mit ... abkürzen
 
[OT] Sapienti sat. :mrgreen: [/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 Uhr.
Seite 2 von 3     12 3      

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