Delphi-PRAXiS

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/)
-   -   Problem mit TextWidth (https://www.delphipraxis.net/214756-problem-mit-textwidth.html)

BRobby 5. Mär 2024 10:20

Problem mit TextWidth
 
Hallo zusammen,

ich habe Probleme mit der Darstellung von Zahlen in einem StringGrid.
Die Zahlen (d.h. die Strings, die die Zahlen darstellen) passen nicht korrekt in das Zeichenfeld. Rechts wird ein mehr oder weniger großer Teil abgeschnitten, da das Feld zuende ist, oft mehr als ein Zeichen.

Die maximale Stringlänge aller Felder habe ich vorher mit
: MaxColWidth:=Max(MaxColWidth, Canvas.TextWidth(aTxt));bestimmt und dem Grid
mit DefaultColWidth:=MaxColWidth+4;zugewiesen.
Probeweise habe ich auch GridLineWidth auf Null gesetzt, hat nichts geändert.
Was mache ich falsch oder übersehe ich?

Sherlock 5. Mär 2024 10:45

AW: Problem mit TextWidth
 
In einer Zelle gibt es ja vielleicht auch noch einen inneren Rand bzw. Padding oder auch als "Abstand vom Rand" bekannt. Das solltest Du auch berücksichtigen.

Delphi.Narium 5. Mär 2024 10:54

AW: Problem mit TextWidth
 
Ist der Text in aTxt den "breit" genug, um als Defaultwert für alle Zeichen-/Zahlenfolgen zu dienen?

Wenn ich eine Mindestbreite für Texte benötige, nehme ich immer eine aus W bestehende Zeichenfolge, die soviele W enthält, wie ich maximal an Zeichen darstellen möchte. (W ist meist das breiteste Zeichen in einer Schrift.)

Soll also eine Zahlenfolge maximal 9 Ziffern enthalten, ist meine Zeichenfolge WWWWWWWWW. Das ist dann meist ein bisserl zu breit, aber eigentlich nie zu schmal (wenn ich, wie Sherlock schon schrieb) innere Abstände ... mit berücksichtige). Ausnahmen sind natürlich alle Schriftarten, bei denen alle Zeichen gleich breit sind, wie z. B. Courier New, da kann man jedes beliebige Zeichen nehmen.

BRobby 5. Mär 2024 11:06

AW: Problem mit TextWidth
 
Ja, muss breit genug sein, denn MaxColWidth wird auf die maximale Breite ALLER Strings in dem Feld cells[] gesetzt.
Habe jetzt eine Teillösung gefunden, indem ich

MaxColWidth:=Max(MaxColWidth, Canvas.TextWidth(' '+aTxt+' '));
die Strings mit einem Leerzeichen davor und dahinter verlängere.
Trotzdem bin ich mit dem Ergebnis nicht zufrieden.

Uwe Raabe 5. Mär 2024 11:29

AW: Problem mit TextWidth
 
Ein Blick in die Sourcen könnte da hilfreich sein:
Delphi-Quellcode:
procedure TStringGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
  AState: TGridDrawState);
var
  LText: string;
  LX: Integer;
  LTextRect: TRect;
begin
  if DefaultDrawing then
  begin
    LTextRect := ARect;
    LTextRect.Inflate(-1, -1);
    if not LTextRect.IsEmpty then
    begin
      LText := Cells[ACol, ARow];
      case CellAlignments[ACol, ARow] of
      taLeftJustify:
        LX := LTextRect.Left + 5;
      taRightJustify:
        LX := LTextRect.Right - 5 - Canvas.TextWidth(LText);
      taCenter:
        LX := LTextRect.Left + (LTextRect.Width - Canvas.TextWidth(LText)) div 2;
      else
        LX := 0;
      end;
      Canvas.TextRect(LTextRect, LX, LTextRect.Top + (LTextRect.Height - Canvas.TextHeight(LText)) div 2, LText);
    end;
  end;
  inherited DrawCell(ACol, ARow, ARect, AState);
end;
Beim Aufruf von DrawCell hat ARect die Breite des entsprechenden ColWidths-Werts. Mit dem Inflate wird es 2 Pixel schmaler. Dann kommt je nach CellAlignments eventuell noch ein Offset dazu.

BRobby 5. Mär 2024 11:50

AW: Problem mit TextWidth
 
Danke,
das ist die Lösung.

Mit dem Summand +7 in
MaxColWidth:=Max(MaxColWidth, Canvas.TextWidth(aTxt)+7);werden die Zahlen nun korrekt dargestellt.

Danke für die Erklärung!

himitsu 5. Mär 2024 12:14

AW: Problem mit TextWidth
 
GridLine ist das zwischen zwei Zellen. Hat aber nichts mit der Breite einer Zelle zu tun.
Und ja, natürlich gibt es noch ein Padding, wo davor und dahinter innerhalb der Zelle noch bissl Platz gelassen wird.

Michael II 5. Mär 2024 13:57

AW: Problem mit TextWidth
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1534188)
Delphi-Quellcode:
        LX := LTextRect.Left + 5;
        LX := LTextRect.Right - 5 -State);

Zur 5 eine Frage: Wird da effektiv - egal für welche Monitorauflösung - 5 verwendet?

dummzeuch 5. Mär 2024 14:10

AW: Problem mit TextWidth
 
Nur falls es kompatibel zu anderen Delphi Versionen sein soll: Die Berechnungen für Stringrid-Zellen haben sich im Laufe der Zeit mehrfach geändert. Da ich lieber StringGrids oder DrawGrids als ListViews verwende, hat mir das schon einiges an Kopfzerbrechen bereite.

Uwe Raabe 5. Mär 2024 14:32

AW: Problem mit TextWidth
 
Zitat:

Zitat von Michael II (Beitrag 1534194)
Zur 5 eine Frage: Wird da effektiv - egal für welche Monitorauflösung - 5 verwendet?

Ja, das ist so. In Folge hat man bei höherer Auflösung nicht nur eine schärfere Schrift, sondern kann auch mehr Buchstaben sichtbar machen. Ich bin mir aber nicht sicher ob das Absicht ist.

Das deckt sich allerdings auch mit dem (Windows-)Verhalten eines simplem TEdit (zumindest wenn man das Default AutoSize auf True lässt). Die Höhe wird zwar an den skalierten Font angepasst, ist dann aber kleiner als man es bei der Skalierung erwarten würde. Kann man einfach mal selbst mit zwei Edits probieren und bei einem davon AutoSize auf False stellen. Persönlich finde ich die Darstellung mit AutoSize besser.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 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