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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#1

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
30 Beiträge
 
Delphi 12 Athens
 
#2

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
Online

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

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
30 Beiträge
 
Delphi 12 Athens
 
#4

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
Michael II

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

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 Uwe Raabe
Uwe Raabe
Online

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

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 11:14 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