AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Text zur Anzeige kürzen mit Punkten hinten
Thema durchsuchen
Ansicht
Themen-Optionen

Text zur Anzeige kürzen mit Punkten hinten

Ein Thema von Guido Eisenbeis · begonnen am 28. Okt 2011 · letzter Beitrag vom 4. Nov 2011
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#1

Text zur Anzeige kürzen mit Punkten hinten

  Alt 28. Okt 2011, 01:17
Ich benutze Lazarus im {$mode delphi} für Win 32.

Hier geht es um einen Workaround, der vom Thread Verschiedene Controls an Procedur übergeben "abstammt".

Wenn eine Form in der TitleBar einen langen Text anzeigt und man die Form seitlich verkleinert (zusammenschiebt), wird der Text gekürzt und mit Punkten am Ende dargestellt, sobald der gesamte Text nicht mehr in die TitleBar passt. Dieses Verhalten will ich für verschiedene Controls nachbilden, die man z. B. als TitleBar für eine rahmenlose Form verwenden kann.

Bei meiner Recherche (Google, Foren-SF) habe ich zu diesem Thema nur Beiträge gefunden, die sich auf Pfade beziehen und die Punkte in der Mitte haben. Mir geht es aber um beliebigen Text, dem die Punkte hinten angehängt werden. (Wer einen fertigen Code kennt, kann ihn gerne posten.)

Für die Anzeige des gekürzten Textes mit Punkten kommen verschiedene Controls in Frage, die auch nicht unbedingt eine TitleBar darstellen müssen (TitleBar war nur ein Beispiel). Wichtig ist nur, dass das Control eine Caption- oder Text-Eigenschaft hat.

Hier eine Übersicht der Bedingungen, die in einer einzigen Procedure erfüllt werden sollen:

- Im Procedure-Kopf wird ein Control und der Text übergeben.

- Es wird geprüft, ob das Control eine Caption- oder Text-Eigenschaft besitzt.

- Die Textlänge wird in Pixel ermittelt und mit der Width des Controls verglichen.
. . . dabei wird die Schrift, Schrift-Größe, Fett-Schrift, usw. berücksichtigt.

- Ist der Text zu lang, um komplett im Control dargestellt zu werden,
. . . a) wird er gekürzt, sodass er ins Control passt und "..." angehängt,
. . . b) wird der komplette Text im Tooltipp des Controls angezeigt.


Nun werd ich mich daran machen, das Ganze in Code umzusetzen. Einige Ansätze wurden schon im o. g. "Abstamm"-Thread gezeigt. Über weitere Ideen und Anregungen würde ich mich freuen!

Guido.

Geändert von mkinzler (31. Okt 2011 um 12:07 Uhr) Grund: Threadtitel auf Wunsh von TE angepasst
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 28. Okt 2011, 01:43
Der schönste Ansatz ist es nicht gerade, aber vielleicht kannst du damit was anfangen:
Delphi-Quellcode:
function shortenString(c: TCanvas; s: string; w: integer; dots: boolean): string;
var
  exploder: TStringList;
  appendDots: boolean;
begin
  exploder := TStringList.Create;
  exploder.Delimiter := ' ';
  exploder.DelimitedText := trim(s);
  appendDots := False;
  while exploder.Count > 0 do
  begin
    if appendDots then
      s := exploder.DelimitedText + ' ...'
    else
      s := exploder.DelimitedText;
    if c.TextWidth(s) > w then
    begin
      exploder.Delete(exploder.Count - 1);
      appendDots := dots;
    end
    else
    begin
      break;
    end;
  end;
  exploder.Free;
  Result := s;
end;
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 28. Okt 2011, 02:53
Zumindestens in Delphi gibt es da irgendwo eine Funktion dafür, aber ich glaub das war sogar eine WinAPI, also sollte es sie auch in Lazarus geben.

PS: Bei den TLabel (Delphi) kann man das jetzt auch über den OI regeln.
Wobei es intern schon viel länger möglich war.
(ich weiß nicht wie dieses in Lazarus arbeitet, aber vermutlich ähnlich)

Stichwort: DrawTextW und DT_PATH_ELLIPSIS, DT_END_ELLIPSIS oder DT_WORD_ELLIPSIS.
$2B or not $2B
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 28. Okt 2011, 05:09
@BUG

Dein Ansatz ist zwar etwas grob, aber schon ganz gut. Mit grob meine ich, dass das Kürzen immer ganze Wörter weg nimmt. Bei längeren Wörtern (z. B. "Weltwirtschaftskrise") wäre das schon jeweils ein ziemlich krasser Sprung. An sich aber eine interessante Idee.


Zumindestens in Delphi gibt es da irgendwo eine Funktion dafür, aber ich glaub das war sogar eine WinAPI, also sollte es sie auch in Lazarus geben.
Welche Funktion ist das denn? Die von dir erwähnte DrawText? DrawText will ich nicht.
Nee, Spaß beiseite, für DrawText wird ein hdc benötigt, was nicht bei allen in Frage kommenden Controls der Fall ist. Außerdem soll der gekürzte Text als string vorliegen, um in z. B. weiterverarbeiten zu können.

Falls du eine andere Funktion meintest, dann raus damit.


Bei den TLabel (Delphi) kann man das jetzt auch über den OI regeln.
Wobei es intern schon viel länger möglich war.
(ich weiß nicht wie dieses in Lazarus arbeitet, aber vermutlich ähnlich)
Denke ich auch. Wie heißt die Eigenschaft denn? Ab welcher Delphi-Version?


Ansonsten, eine Routine zum kürzen habe ich mittlerweile selbst geschrieben. Funktioniert ganz gut. Hier ein Code-Ausschnitt:
Delphi-Quellcode:
  // Text kürzen, bis er ins Control passt.
  while (ACtrl.Width < (TmpCanvas.TextWidth(TmpTxt) + 50)) do
  begin
    if Length(TmpTxt) < 2 then exit;
    TmpTxt := LeftStr(TmpTxt, Length(TmpTxt) - 1);
  end;
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 28. Okt 2011, 05:47
Denke ich auch. Wie heißt die Eigenschaft denn? Ab welcher Delphi-Version?
EllipsisPosition, siehe Doku:
http://docwiki.embarcadero.com/VCL/d...lipsisPosition
Das sieht dann so aus:

ellipsisposition.png

Geben tut es das ab Delphi 2006. Intern wird das 1:1 auf die entsprechenden Konstanten gemappt und an DrawText übergeben. Auch Canvas.TextRect kennt ein entsprechendes Flag. Aber das sind eben alles nur für die Ausgabe vorhandene Funktionen.

Wenn du also den gekürzten Text benötigst, musst du das selbst machen.

// EDIT:
Nee, Spaß beiseite, für DrawText wird ein hdc benötigt, was nicht bei allen in Frage kommenden Controls der Fall ist.
Bei welchen denn? Nicht bei allen kommst du direkt heran, aber eigentlich haben alle einen Device Context.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (28. Okt 2011 um 06:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 28. Okt 2011, 08:33
Vielleicht geht es mit MinimizeName, obwohl das AFAIK nur für Pfadangaben gedacht ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 28. Okt 2011, 08:42
Ahhh, MinimizeName war das ... nichts gefunden, aber doch erinnert, daß vor Jahren mal gesehn zu haben

Schade, hatte gehofft das nutzt die gleiche Funktion, welche auch DrawText nutzt.
$2B or not $2B
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 29. Okt 2011, 01:23
Vielleicht geht es mit MinimizeName, obwohl das AFAIK nur für Pfadangaben gedacht ist.
Stimmt, ist nur für Pfade.


EllipsisPosition
...
Geben tut es das ab Delphi 2006. Intern wird das 1:1 auf die entsprechenden Konstanten gemappt und an DrawText übergeben. Auch Canvas.TextRect kennt ein entsprechendes Flag. Aber das sind eben alles nur für die Ausgabe vorhandene Funktionen.
Danke für die Info. Hab EllipsisPosition gefunden beim TLabel in TurboDelphi. In Lazarus scheint's das nicht zu geben. In Delphi scheinbar nur im TLabel?

... für DrawText wird ein hdc benötigt, was nicht bei allen in Frage kommenden Controls der Fall ist.
Bei welchen denn? Nicht bei allen kommst du direkt heran, aber eigentlich haben alle einen Device Context.
Ok, ich sitze jetzt schon über eine halbe Stunde nur daran, ein blöden Text mit DrawText auf ein Panel zu bekommen. (Habs auch mit Form1 versucht.) Ich habe bestimmt 1 Mio. Codes von MSDN bis Was-weiß-ich-was-WebSites und Foren (auch hier) probiert und bin am verzweifen! Ich krieg ums Verrecken keinen Text mit Panel zu sehen!! Das kenn ich von "damals", als ich noch mit VB (Classic) programmierte. Und genau aus diesem Grund wollte ich DrawTest nicht haben. Das nervt einfach nur.

Es folgt ein Beispiel-Code, den ich ausprobiert habe. Bitte zeig mir doch den Fehler, oder einen funktionierenden Code. Und glaub mir, ich hab zig verschieden Kombinationen der Paramter und Funktionen probiert!

Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
var
  Txt: String;
  h: HDC;
  Rct: TRect;
begin
  Txt := 'Dies ist ein Beispiel-Text.';
  //h := GetDC(Panel1.Handle);
  //h := GetWindowDC(Panel1.Handle);
  GetWindowRect(Panel1.Handle, Rct);

  DrawText(Panel1.Canvas.Handle, PChar(Txt), Length(Txt), Rct,
    DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS);
end;
Guido.

Geändert von Guido Eisenbeis (29. Okt 2011 um 01:31 Uhr) Grund: Beispiel-Code korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 29. Okt 2011, 01:56
Das wird so nix werden.
Wenn sich das Panel dann zeichnet übermalt es seinen Canvas ja wieder.
Du musst also ein eigenen Panel ableiten und die Paint-Methode mit override überschreiben.
Dazu kannst Du alles machen wie das originale Panel (Fläche füllen, Rahmen zeichnen etc.) und nur die Textausgabe an Deine Zwecke anpassen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Text zur Anzeige kürzen mit Punkte hinten

  Alt 29. Okt 2011, 02:20
Vielen Dank Stahli!

Das hat mir jetzt eine riesen Stein von der Seele purzeln lassen. Ich dachte schon, ich wär zu blöd, um ein "Hallo Welt" in ein Panel zu bekommen.

Das wird so nix werden.
Wenn sich das Panel dann zeichnet übermalt es seinen Canvas ja wieder.
Du musst also ein eigenen Panel ableiten und die Paint-Methode mit override überschreiben.
Dazu kannst Du alles machen wie das originale Panel (Fläche füllen, Rahmen zeichnen etc.) und nur die Textausgabe an Deine Zwecke anpassen.

Von Anfang an hatte ich das Gefühl, dass das so läuft. Aus Urzeiten hatte ich diese Probleme noch im Hinterkopf und mein Gefühl hat mich nicht getrogen. Siehe hier:
DrawText will ich nicht.

Und deshalb habe ich auch auf einem String als Resultat bestanden, der problemlos weiterverarbeitet werden kann. DrawText ist also hinfällig, denn es sollen ja verschiedene Controls übergeben werden können, ohne jedes einzelne auf seinen Typ zu prüfen. Dementsprechend ist es vom Aufwand her ja unsinnig, was-weiß-ich-wieviele Controls abzuleiten und Methoden zu überschreiben.

Vielen Dank für diese Info André!

Guido.

Geändert von Guido Eisenbeis (29. Okt 2011 um 07:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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