Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Canvas.Textwidth liefert falschen Wert (https://www.delphipraxis.net/191408-canvas-textwidth-liefert-falschen-wert.html)

p80286 12. Jan 2017 11:54

Canvas.Textwidth liefert falschen Wert
 
Hallo zusammen,
Um die Mindestgröße eines Labels zu definieren verwende ich
Delphi-Quellcode:
Canvas.Textwidth(mytext);
Nur kommt dort ein Wert zurück, der grob gesagt, gerade einmal halb so groß ist wie eigentlich nötig. Der verwendete Font ist WebDings mit Size=16.
An anderer Stelle habe ich das schon einmal verwandt, und wenn ich mich richtig erinnere gab es auch bei "normalen" Fonts, ein paar Klippen an denen man scheitern konnte.

Wie bekomme ich eine realistische Textlänge für mein Label zurück?

Gruß
K-H

P.S es ist eine VCL-Anwendung

Neutral General 12. Jan 2017 12:02

AW: Canvas.Textwidth liefert falschen Wert
 
Zeig mal bitte deinen Code. Ich ahne etwas.
Edit: Ehrlich gesagt bin ich mir ziemlich sicher. Du benutzt sicher das Canvas des Formulars um die Textbreite zu ermitteln.
Die Textbreite hängt aber u.a. an Schriftgröße und Schriftart ab und das Canvas deines Formulars wird dann dementsprechend die Breite für die im Canvas des Forms eingestellte Schriftgröße/Schriftart berechnen.

Geda 12. Jan 2017 12:11

AW: Canvas.Textwidth liefert falschen Wert
 
Hallo,

Du musst sicherstellen, dass der Canvas mit dem gleichen Font / der gleichen Schriftgröße wie das Control arbeitet (ist nicht zwingend der Fall, z.B. wenn ParentFont = TRUE). Das erreichst Du z.B. durch assignen des Fonts.

EmWieMichael 12. Jan 2017 17:58

AW: Canvas.Textwidth liefert falschen Wert
 
Ich mach das so:
Code:
function GetDots(S:String):Integer;
 var B:TBitMap; Font:TFont;
begin
  Font:=TFont.Create;
  Font.Name:='MS Sans Serif';
  Font.Height:=-11;
  Font.Size:=8;
  Font.Style:=[];
  Font.Pitch:=fpDefault;
  Font.PixelsPerInch:=96;
  B:=TBitMap.Create;
  B.Canvas.Font:=Font;
  Result:=B.Canvas.TextWidth(S);
  Font.Free;
  B.Free;
end;

himitsu 12. Jan 2017 21:09

AW: Canvas.Textwidth liefert falschen Wert
 
Kein Ressourcenschutzblock?

Und warum nicht gleich direkt den vorhandenen Font des Bitmaps verwenden?
Oder das Canvas des Labels? (wobei TLabel, TImage, TPaintBox und paar Andere eigentlich keine eigene Zeichenfläche besitzen, sie alle Zeichenoperationen an ihren Parent durchreichen und sich auf ihn drauf malen)

EmWieMichael 13. Jan 2017 05:56

AW: Canvas.Textwidth liefert falschen Wert
 
Zitat:

Zitat von himitsu (Beitrag 1358753)
Kein Ressourcenschutzblock?

Das ist ein Beispiel; Übergabe von Fontgröße und -eigenschaften fehlt auch.

Zitat:

Und warum nicht gleich direkt den vorhandenen Font des Bitmaps verwenden?
Müsste auch funktionieren. Man kann so aber auch ein TFont an die Funktion übergeben.
Zitat:

Oder das Canvas des Labels? (wobei TLabel, TImage, TPaintBox und paar Andere eigentlich keine eigene Zeichenfläche besitzen, sie alle Zeichenoperationen an ihren Parent durchreichen und sich auf ihn drauf malen)
Du hast die Frage selber beantwortet.

nahpets 13. Jan 2017 11:06

AW: Canvas.Textwidth liefert falschen Wert
 
Um die Mindestgröße eines Buttons zu ermitteln gehe ich im Prinzip so vor:
Delphi-Quellcode:
function TfrmDGB.SetButton;
var
          lb : TLabel;
begin
  lb             := TLabel.Create(Self);
  lb.Font        := btnFilter.Font;
  lb.AutoSize    := True;
  lb.Caption     := btnFilter.Caption;
  btnFilter.Width := lb.Width + 16;
  lb.Free;
end;
Mit dieser Methode haben die Buttons auch dann noch eine korrekte Breite, wenn die Schriftgröße zur Laufzeit verändert wird.

Verallgemeinert könnte das dann eventuell ungefähr so aussehen:
Delphi-Quellcode:
function GetWidth(c : TControl; Caption : String) : Integer;
var
          lb : TLabel;
begin
  lb         := TLabel.Create(Nil);
  lb.Font    := c.Font;
  lb.AutoSize := True;
  lb.Caption := Caption;
  Result     := lb.Width + 16;
  lb.Free;
end;
Bei Labels, die automatisch die richtige Breite haben sollen, setze ich AutoSize auf True. Damit links und rechts ein kleiner Rand bleibt (was meiner Meinung nach besser aussieht), setze ich die Caption immer in der Form
Delphi-Quellcode:
Leerzeichen + Text + Leerzeichen
. Damit sieht das eigentlich in allen Anwendungen ordentlich aus.

himitsu 13. Jan 2017 11:24

AW: Canvas.Textwidth liefert falschen Wert
 
Falls dem gemeinsamen DeviceContext grade nicht de korrekte Font zugewiesen ist, dann kann man das ja leicht ändern.
Delphi-Quellcode:
Label1.Canvas.Font.Assign(Label1.Font);
Result := Label1.Canvas.TextWidth(DerText);
Aber da wir hier ja von "gemeinsam" reden und andere Prozeduren, so wie unsere, nicht immer alles korrekt initilisieren/zurücksetzen ....... nicht dass der Nächste dann mit unserem Font weiterarbeitet, obwohl er 'nen Anderen hätte.
Delphi-Quellcode:
with TFontRecall.Create(Label1.Canvas.Font) do
  try
    Label1.Canvas.Font.Assign(Label1.Font);
    Result := Label1.Canvas.TextWidth(DerText);
  finally
    Free;
  end;

p80286 13. Jan 2017 12:14

AW: Canvas.Textwidth liefert falschen Wert
 
Ich wollte mich nur kurz für die vielen Anregungen bedanken. Da ich z.Zt. auffe Arbeit bin und es sich hier um eine private Bastelei handelt, kome ich z.Zt. nicht dazu, mich darum zu kümmern.
Nur soviel. 'Autosize' geht in die Hose wenn man auf D7 125% Bildschirm losläßt, darum ja auch das selberbasteln, der Größe.
das mit dem Durchreichen, scheint das richtige Stichwort zu sein, es handelt sich um ein Label auf einem Panel auf einem Form. (ParantFont sollte Null sein, da ich beim Entwurf darauf geachtet habe).

Sobald ich Zeit habe mich zu kümmern, melde ich mich wieder.

Gruß
K-H

p80286 15. Jan 2017 23:00

AW: Canvas.Textwidth liefert falschen Wert
 
Das "Durchreichen" wahr wohl der richtige Tip.
Delphi-Quellcode:
  self.Font.Name:='Webdings';
  self.Font.Size:=16;
  self.L_Left.Width:=self.Canvas.TextWidth(peakline[18]);
  self.L_Right.Width:=self.L_Left.Width;
....
  self.L_Left.Font.Name:='Webdings';
So funktioniert alles wie notwendig;

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 Uhr.
Seite 1 von 2  1 2      

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