Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Textgröße an Rechteck anpassen (https://www.delphipraxis.net/98630-textgroesse-rechteck-anpassen.html)

daschaos 30. Aug 2007 10:15


Textgröße an Rechteck anpassen
 
Hi!

Ich zeichne Rechtecke, die immer einem bestimmten Element zugeordnet sind. Diese Elemente haben immer einen Namen, der Links oben innerhalb des Rechtecks erscheint. Wenn der Text länger ist als die Breite des Rechtecks, also Canvas.TextWidth(Name) > (Rect.Right - Rect.Left), dann soll er halt nur soviel Text ausgeben, wie in das Recteck passt und mit '...' symbolisieren, dass der Name noch weiter geht. Er soll also die Textlänge so anpassen, dass dieser soviele Buchstaben dazu nimmt bis das Wort + '...' noch in das Recteck passen. Eingentlich hatte ich mir das folgendermaßen vorgestellt:

Delphi-Quellcode:
procedure TCustomTreemapChart.TryText(var AText: WideString; ARect: TRect; ACanvas: TCanvas);
var
  TWidth: Integer;
  RWidth: Integer;
  PWidth: Integer;
  Points: WideString;
  Help: Integer;
begin
  Points := '...';
  TWidth := ACanvas.TextWidth(AText);
  RWidth := ARect.Right - ARect.Left;
  PWidth := ACanvas.TextWidth(Points);
  Help := Length(AText);

  if (TWidth > RWidth) then
  begin
    System.Delete(AText, RWidth-PWidth, TWidth);
    AText := AText + Points;
  end;
end;
Delete ist ja so aufgebaut, dass ich einen String übergeben muss, der dann ab Index (2.Parameter) den String TWidth Zeichen kürzt (3.Parameter). Wobei der 3. Parameter auch länger sein darf, als Zeichen da sind, dann schneidet er einfach soviele ab wie vorhanden sind.
Aber so einfach funktioniert es wohl nich mit Delete wie ich gehofft hatte... er macht da nämlich garnichts. Und gibt mir einfach den Text konkateniert mit den Punkten aus... es ist wohl das Problem, das er einmal die Länge des Textes hat und das die Breiten Pixelwerte sind.

Hat jemand eine Idee, wie ich daran gehen muss?

Dankeschön schonmal!

Lg,
Laura

mkinzler 30. Aug 2007 10:42

Re: Textgröße an Rechteck anpassen
 
Vieliecht weil es sich um eine var-Parametervariable handelt. Schon mal mit einem lokalen String versucht?

DeddyH 30. Aug 2007 10:50

Re: Textgröße an Rechteck anpassen
 
Ich denke, das ist nur in einer Schleife zu lösen.
Delphi-Quellcode:
if (TWidth > RWidth) then
  begin  
    AText := AText + Points;
    while ACanvas.TextWidth(AText) > RWidth do
      System.Delete(AText, Length(AText) - Length(Points), 1);
  end;
Ungetestet!

marabu 30. Aug 2007 10:59

Re: Textgröße an Rechteck anpassen
 
Hallo,

das Kürzen des Textes und auch die Ellipse am Ende gehören zur Funktionalität der API Funktion DrawText() - da muss nichts selbst programmiert werden.

Grüße vom marabu

daschaos 30. Aug 2007 10:59

Re: Textgröße an Rechteck anpassen
 
Hm, falls das auch noch ein Problem sein sollte... ich habs auch ma umgeändert :).

Was ich gerade aber beim Debuggen gesehen hab:

Mein Rechteck ist dann zum Beispiel 46 Pixel breit und mein Text ist z.b. 12 Zeichen lang, was zwar einer Pixellänge von 63 entsprechen würde, aber bei Delete geht es ja dann anscheinend um die Länge 12. Damit gäbe es den Index RWidth - PWidth (46-12) garnich und somit macht er auch nichts....

Aber ich denke ma gerade über die Schleife nach ... :)

daschaos 30. Aug 2007 11:02

Re: Textgröße an Rechteck anpassen
 
Klar, er kürzt den Text automatisch, er schneidet das was nich passt, einfach ab, das möchte ich aber nich (bzw. mein Chef nich ;)), ich hätte eben gerne dann den Text modifiziert mit den Punkten...

franktron 30. Aug 2007 11:24

Re: Textgröße an Rechteck anpassen
 
Guck mal in der OH nach TextRect das dürfte dein Problem beheben.

daschaos 30. Aug 2007 11:35

Re: Textgröße an Rechteck anpassen
 
Ja, das TextRect benutze ich ja auch. Ich rufe zuerst die Funktion TtryText auf und will dann den modifizierten Text in TextRect ausgeben. Aber das er den Text einfach abschneidet ist ja nich das was ich will... :(

TryText(AText, ARect, ACanvas);
ACanvas.TextRect(ARect, ARect.TopLeft.X, ARect.TopLeft.Y, AText);

daschaos 30. Aug 2007 11:50

Re: Textgröße an Rechteck anpassen
 
Ja, die Schleife klappt, dankeschön!!!

marabu 30. Aug 2007 12:24

Re: Textgröße an Rechteck anpassen
 
Hallo Laura,

ich glaube dein Chef braucht eine neue Brille, wenn er die Ellipsis nicht sieht:

Delphi-Quellcode:
var
  s: string;
  r: TRect;
begin
  s := 'Der Affe den Sie meinen heißt Parmesan';
  r := Rect(20, 60, 180, 110);
  DrawText(Canvas.Handle, PChar(s), Length(s), r, DT_BOTTOM or DT_END_ELLIPSIS);
end;
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr.
Seite 1 von 2  1 2      

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