![]() |
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: |
Re: String mit ... abkürzen
Kannst du mein Beispiel (Text und Rect) so anpassen, dass ich dein Problem erkenne?
|
Re: String mit ... abkürzen
Wäre MinimizeName() nicht eine Alternative?
|
Re: String mit ... abkürzen
Eher nein - MinimizeName() arbeitet auf (einzeiligen) Pfadnamen. Ich glaube, hier geht es allgemein um Texte.
|
Re: String mit ... abkürzen
Zitat:
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:
In dem Beispiel funktioniert DT_WORD_ELLIPSIS nicht. Er schneidet den Text nicht ab.
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. DT_END_ELLIPSIS hat hier allerdings funktioniert. Aber im richtigen Projekt gabs da auch Probleme. |
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 |
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. |
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:
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.
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'; 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 |
Re: String mit ... abkürzen
[OT] "De Bello Gallico" von Gaius Julius Caesar... ich bin einigermaßen angemessen beeindruckt :shock: :thumb: [/OT]
|
Re: String mit ... abkürzen
[OT] Sapienti sat. :mrgreen: [/OT]
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 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