![]() |
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? |
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.
|
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. |
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. |
AW: Problem mit TextWidth
Ein Blick in die Sourcen könnte da hilfreich sein:
Delphi-Quellcode:
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.
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; |
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! |
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. |
AW: Problem mit TextWidth
Zitat:
|
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.
|
AW: Problem mit TextWidth
Zitat:
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:51 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