Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Text zur Anzeige kürzen mit Punkten hinten (https://www.delphipraxis.net/164086-text-zur-anzeige-kuerzen-mit-punkten-hinten.html)

DeddyH 30. Okt 2011 18:55

AW: Text zur Anzeige kürzen mit Punkte hinten
 
[Stimme aus dem Off] Naja, das "Form1" ist aber nicht so geschickt, self wäre wohl besser ;) [/Stimme aus dem Off]

Luckie 30. Okt 2011 18:57

AW: Text zur Anzeige kürzen mit Punkte hinten
 
Stimmt. Geändert.

himitsu 30. Okt 2011 19:39

AW: Text zur Anzeige kürzen mit Punkte hinten
 
Sobald man etwas Systemspezifisches macht, ist es nicht mehr plattformunabhängig.

Hier wird ja eine WinAPI direkt verwendet, welche irgendein HDC (bei Microsofts das Handle für einen Device Context) haben will und dann entweder den Text zeichnet und/oder berechnet.
Wie man sieht, ginge das auch ohne ein Canvas, aber bei den Beispielkomponenten kommt man an dieses Handle nunmal über das Canvas sehr leicht dran.
Ein Canvas ist ja auch nur eine Schnittstelle, welche den Zugriff auf den HDC und damit zusammenhängene Befehle vereint/vereinfacht.

GetDC(Edit.Handle) und schon hat man aus den Window-Handle ein DC-Handle gemacht, welches man direkt nutzen,
oder über ein Canvas verwenden könnte.
das erwähnte TControlCanvas ist auch nur ein TCanvas, welches das GetDC noch mit eingebaut hat.



So, nochmal zum plattformunabhängig.
Jetzt mußt du nur noch Schnittstellen/APIs für die anderen OS suchen und könntest das in einer Komponente verpacken, bzw. mehreren Komponenten mit der selben Schnittstelle.

Vorteil: plattformunabhängig
Nachteil: da es schwer sein wird, überall etwas mit genau dem selben Funktionsumfang zu finden, wird diese unabhängige Komonente nur noch das beinhalten dürfen, was überall möglich ist ... sie wird also nur noch einen "kleinen" Teil dessen bieten, was eigentlich möglich wäre, denn sonst wäre es nicht mehr unabhängig.

Oder man "emuliert" einige der fehlenden Funktionen, auf den jeweils anderen Systemen => eventuell aufwändiger/langsamer.



Also beschwer dich nicht über das arme TCanvas, denn eigentlich ist es ganz lieb/nützlich ... denn ich wette du willst nicht immer direkt mit WinAPI oder den APIs der anderen OS zu tun haben.
Das wäre teilweise sehr aufwändig ... das was diese Wrapper für dich schön handlich zusammengefaßt haben.

Guido Eisenbeis 31. Okt 2011 04:27

AW: Text zur Anzeige kürzen mit Punkte hinten
 
Zitat:

Zitat von Luckie (Beitrag 1133584)
Guck mal genau hin. Ich gebe den Text nicht auf einem Panel aus, sondern auf der Form selber, wo du aber auch gesagt hast, das würde nicht funktionieren.

Warum sollte ich da nicht genau hingesehen haben? Ich habs sogar genau hier rauskopiert, zwei neue Projekte erstellt (1x Delphi, 1x Lazarus), ein Paint-Ereignis für Form1 erstellt und deinen Code hinein kopiert. Nix zu sehen.

Guido.

jaenicke 31. Okt 2011 06:22

AW: Text zur Anzeige kürzen mit Punkte hinten
 
Bis Windows XP sollte das funktionieren. Und ab Vista sollte der Text zumindest am Anfang auch sichtbar sein.

Durch die neuen Grafiktechniken von Vista und Windows 7 kann es sein, dass die Ressourcenoptimierung da einen Strich durch die Rechnung macht. Denn da wird WM_PAINT schlicht nicht mehr so oft an das Fenster geschickt. Dass der Text durch das DT_VCENTER aber an anderer Stelle neu gezeichnet werden müsste, weiß Windows nicht. Deshalb kann es passieren, dass der Text nicht zu sehen ist.

Dieses neue Verhalten führt zwar zu einer teilweise deutlich flüssigeren Oberfläche unter insbesondere Windows 7 gegenüber XP, aber eben auch manchmal zu Problemen, wenn man nicht auch auf das Resizen reagiert.

Lösung zum Testen:
Ersetze DT_VCENTER durch DT_TOP und schiebe das Fenster ganz nach oben links auf den Bildschirm. ;-)

Der eigentliche Fehler ist nämlich, dass das Window-Rect sich auf Bildschirmkoordinaten bezieht, DrawText hingegen auf Fenster-Koordinaten. ;-)

Guido Eisenbeis 31. Okt 2011 11:05

AW: Text zur Anzeige kürzen mit Punkte hinten
 
Danke für die ausführliche Beschreibung. Werd ich heute abend testen.

O.T. Wie kann ich denn den Thread-Titel ändern? Der Bearbeiten-Button ist nicht mehr da (Zeitlimit). Hab nämlich erst jetzt gesehen, dass ich "Punkten" ohne "n" geschrieben habe. Wenn's nicht geht, bleibt's so. :mrgreen:

Guido.

jaenicke 31. Okt 2011 12:53

AW: Text zur Anzeige kürzen mit Punkte hinten
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1133668)
O.T. Wie kann ich denn den Thread-Titel ändern? Der Bearbeiten-Button ist nicht mehr da (Zeitlimit). Hab nämlich erst jetzt gesehen, dass ich "Punkten" ohne "n" geschrieben habe. Wenn's nicht geht, bleibt's so. :mrgreen:

In diesem Forum kannst du den Thread dafür nur melden, damit es ein Moderator macht.

Guido Eisenbeis 2. Nov 2011 08:23

AW: Text zur Anzeige kürzen mit Punkten hinten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Den Thread-Titel wurde schon von einem netter Moderator geändert! :-D Danke.

Zitat:

Zitat von jaenicke (Beitrag 1133627)
Lösung zum Testen:
Ersetze DT_VCENTER durch DT_TOP und schiebe das Fenster ganz nach oben links auf den Bildschirm. ;-)

Der eigentliche Fehler ist nämlich, dass das Window-Rect sich auf Bildschirmkoordinaten bezieht, DrawText hingegen auf Fenster-Koordinaten. ;-)

Das war's! :) Ich wundere mich nur, dass das Lucky nicht aufgefallen ist. Hast du (Lucky) deine Form ganz links oben platziert? Der Text müsste bei dir doch auch verschwinden, wenn die Form woanders ist, oder? :gruebel:

Somit sollte DrawText jetzt abgehandelt sein.


Mit DrawTextEx kann man eine Rückgabe als String erhalten. Siehe die letzte Variante, also die mit dem Handle (HDC), in Text kürzen (Ellipsis...) von himitsu.


----------------------------------- Nachtrag Anfang -----------------------------------

Habe gerade festgestellt, dass die Funktion von himitsu in Lazarus beim Kürzen von Umlauten ein "?" an der Stelle des Umlauts zeigt. Zum Testen habe ich den Code-Teil von himitsu hier als kompaktes Beispiel zusamengestellt.

Einfach ein TLabel (Label1) auf die Form setzen, AutoSize ausschalten, Label1 links und rechts bis knapp vor den Rand vergrößern. Dann ein FormCreate und ein FormResize erstellen und folgenden Code einfügen. Für ganz Bequeme häng ich ein Beispiel-Projekt an.

Wird die Form langsam verkleinert, bis gerade so das "ü" verschwindet, taucht an dessen Stelle ein "?" auf. Muss da irgendwas auf UniCode umgestellt, oder Lazarus neu kompiliert werden?

Delphi-Quellcode:
// "Classes" und "Windows" zu den uses hinzufügen.

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Label1.AutoSize muss zur Design-Zeit = False gestellt werden;

  Label1.Anchors := [akLeft, akRight, akTop];
end;

function GetEllipsisText(Handle: HDC; S: String; MaxWidth: Integer; MaxHeight: Integer = 0;
  PathEllipsis: Boolean = False; TextFormat: LongWord = 0): String;
var
  R: TRect;
begin
  Result := S;
  UniqueString(Result);
  if MaxHeight <= 0 then
    MaxHeight := 1000;
  R := Classes.Rect(1, 1, MaxWidth, MaxHeight);
  TextFormat := TextFormat or DT_CALCRECT or DT_MODIFYSTRING;
  if PathEllipsis then
    TextFormat := TextFormat or DT_PATH_ELLIPSIS;
  if TextFormat and (DT_END_ELLIPSIS or DT_PATH_ELLIPSIS) = 0 then
    TextFormat := TextFormat or DT_END_ELLIPSIS;
  DrawTextEx(Handle, PChar(Result), Length(Result), R, TextFormat, nil);
  SetLength(Result, StrLen(PChar(Result)));
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Label1.Caption := GetEllipsisText(
    Label1.Canvas.Handle, 'Beispiel-Text für FormResize.', Label1.Width);
end;
------------------------------------- Nachtrag Ende -------------------------------------


Meine Variante "SetShortenedTextWithDots" folgt alsbald. :-D . . . Nachtrag: Das Umlautproblem tritt hier auch auf.

Guido.


Edit: Nachtrag und Beispiel-Projekt hinzugefügt.

jaenicke 2. Nov 2011 12:50

AW: Text zur Anzeige kürzen mit Punkten hinten
 
Das Problem mit dem Umlauten liegt jedenfalls an Lazarus, mit Delphi geht es problemlos. Da musst du wohl schauen was da intern passiert...

himitsu 2. Nov 2011 14:10

AW: Text zur Anzeige kürzen mit Punkten hinten
 
Also entweder 'nen WideString (gibt's den auch in Lazarus? ) und DrawTextExW verwenden, oder DrawTextExA mit AnsiString.

DrawTextExA könnte man zwar auch auf einen UTF-8-String loslassen, aber da könnte es passieren, daß er die Umlaute zerlegt, wenn er mitten drin die "..." einfügen will.

Eine UTF-8-Variante wird es von DrawTextEx wohl nicht geben? (Von Windows nicht, es sei denn man stellt UTF-8 als DefaultCodepage ein oder Lazarus konvertiert es nach Unicode)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 Uhr.
Seite 3 von 4     123 4      

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