AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Unterschiedliche Textlängen bei Design bzw. Berechnung
Thema durchsuchen
Ansicht
Themen-Optionen

Unterschiedliche Textlängen bei Design bzw. Berechnung

Ein Thema von dschiffler · begonnen am 7. Mär 2011 · letzter Beitrag vom 7. Mär 2011
Antwort Antwort
dschiffler

Registriert seit: 25. Okt 2006
30 Beiträge
 
Delphi 10.4 Sydney
 
#1

Unterschiedliche Textlängen bei Design bzw. Berechnung

  Alt 7. Mär 2011, 09:16
Hallo DPler,

ich habe folgendes Phänomen:

Wenn ich der Label-Eigenschaft Caption (AutoSize ist True) einen Text zuweise, wird die Länge/Weite des Labels automatisch auf die notwendige Länge für die vollständige Darstellung des Textes gesetzt. Soweit so gut und richtig.

Nun habe ich auch eine Funktion (GetTextWidth), in der ich unabhängig von einem Formular die Weite eines übergebenen Textes berechnen möchte. Zur korrekten Berechnung wird auch ein Font-Objekt mit übergeben.

Ich habe für die Berechnung zwei Varianten versucht:

Variante 1
Delphi-Quellcode:
function GetTextWidth(const AValue: string; AFont: Font): Integer;
var
  lCanvas: TCanvas;
  lRect: TRect;
begin
  {temporäre Zeichenfläche erzeugen und mit AFont initialisieren}
  try
    lCanvas := TCanvas.Create;
    try
      lCanvas.Handle := GetDC(0);
      lCanvas.Font := AFont;
      {Zeichenkette temporär zeichnen und neu berechnen}
      SetRect(lRect, 0, 0, Screen.Width, Screen.Height);
      DrawText(lCanvas.Handle,
               PChar(Trim(AValue)),
               -1,
               lRect,
               DT_CALCRECT or DT_EXPANDTABS or DT_WORDBREAK);
    finally
      ReleaseDC(0, lCanvas.Handle);
      lCanvas.Free;
    end;
  except
    SetRect(lRect, 0, 0, 0, 0);
  end;
  Result := lRect.Right;
end;
Variante 2:
Delphi-Quellcode:
function GetTextWidth(const AValue: string; AFont: Font): Integer;
var
  lLabel: TLabel;
begin
  lLabel := TLabel.Create(nil);
  try
    lLabel.Font := AFont;
    lLabel.Caption := AValue;
    Result := lLabel.Width;
  finally
    lLabel.Free;
  end;
end;
In beiden Varianten ist der Rückgabewert der Funktion immer um den Wert 4 kleiner als die Länge des Labels auf dem Formular.
Dies ist natürlich unschön, wenn ich auf Grund dieser Berechnung zur Laufzeit z.B. die Größe eines Formulars setzen möchte und nach der Zuweisung des Textes an ein ebenfalls erst zur Laufzeit erzeugtes Label dieses dann aber tatsächlich länger ist und dann näher am rechten Formularrand ist als geplant.

Warum ist das Ergebnis der Berechnung der Textlänge mit einer der beiden Varianten also nicht identisch zur der im Designer?
Liebe Grüße
Dirk Schiffler
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Unterschiedliche Textlängen bei Design bzw. Berechnung

  Alt 7. Mär 2011, 09:21
ich verwende Canvas.TextWidth , also im Prinzip Deine erste Funktion soweit reduzieren, dass nach der Font Zuweisung nur noch Canvas.TextWith aufgerufen wird.

Delphi-Quellcode:
function GetTextWidth2(const AValue: string; AFont: TFont): Integer;
var
  lCanvas: TCanvas;
begin
  try
    lCanvas := TCanvas.Create;
    try
      lCanvas.Handle := GetDC(0);
      lCanvas.Font := AFont;
      Result := lCanvas.TextWidth(AValue);
    finally
      ReleaseDC(0, lCanvas.Handle);
      lCanvas.Free;
    end;
  except
    Result := 0;
  end;
end;
Sehe aber gerade, es kommt der gleiche Wert heraus, wie in Deiner ersten Funktion, also wohl auch abweichend. Wobei bei Label.Width wohl von Haus aus ein Rand mit eingerechnet wird? (Habe hier leider nicht den VCL-Source parat)

Geändert von Satty67 ( 7. Mär 2011 um 09:29 Uhr)
  Mit Zitat antworten Zitat
dschiffler

Registriert seit: 25. Okt 2006
30 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Unterschiedliche Textlängen bei Design bzw. Berechnung

  Alt 7. Mär 2011, 13:10
Hallo Satty67,

dein Hinweis
Zitat:
Wobei bei Label.Width wohl von Haus aus ein Rand mit eingerechnet wird?
brachte mich auf eine Idee und siehe da, man sieht den Wald vor lauter Bäumen nicht.
Auf dem Formular hatte ich ein TcxLabel (Developer Express) verwendet und dieses hat einen feststehenden Rand von 4 Pixeln.
Meine Berechnungsfunktion ist also in beiden Varianten korrekt und ich muss nur beachten, welche Komponente ich weiter verwende.
Liebe Grüße
Dirk Schiffler
  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 10:10 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