AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit TextWidth

Ein Thema von BRobby · begonnen am 5. Mär 2024 · letzter Beitrag vom 5. Mär 2024
Antwort Antwort
BRobby

Registriert seit: 30. Dez 2004
Ort: Bottrop
22 Beiträge
 
Delphi 11 Alexandria
 
#1

Problem mit TextWidth

  Alt 5. Mär 2024, 10:20
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 10:45
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.
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.418 Beiträge
 
Delphi 7 Professional
 
#3

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 10:54
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.
  Mit Zitat antworten Zitat
BRobby

Registriert seit: 30. Dez 2004
Ort: Bottrop
22 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 11:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.015 Beiträge
 
Delphi 12 Athens
 
#5

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 11:29
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
BRobby

Registriert seit: 30. Dez 2004
Ort: Bottrop
22 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 11:50
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 12:14
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
732 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 13:57
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?
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 14:10
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.015 Beiträge
 
Delphi 12 Athens
 
#10

AW: Problem mit TextWidth

  Alt 5. Mär 2024, 14:32
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 20:00 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