![]() |
Canvas.Textwidth liefert falschen Wert
Hallo zusammen,
Um die Mindestgröße eines Labels zu definieren verwende ich
Delphi-Quellcode:
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.
Canvas.Textwidth(mytext);
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 |
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. |
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. |
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; |
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) |
AW: Canvas.Textwidth liefert falschen Wert
Zitat:
Zitat:
Zitat:
|
AW: Canvas.Textwidth liefert falschen Wert
Um die Mindestgröße eines Buttons zu ermitteln gehe ich im Prinzip so vor:
Delphi-Quellcode:
Mit dieser Methode haben die Buttons auch dann noch eine korrekte Breite, wenn die Schriftgröße zur Laufzeit verändert wird.
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; Verallgemeinert könnte das dann eventuell ungefähr so aussehen:
Delphi-Quellcode:
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
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;
Delphi-Quellcode:
. Damit sieht das eigentlich in allen Anwendungen ordentlich aus.
Leerzeichen + Text + Leerzeichen
|
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:
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.
Label1.Canvas.Font.Assign(Label1.Font);
Result := Label1.Canvas.TextWidth(DerText);
Delphi-Quellcode:
with TFontRecall.Create(Label1.Canvas.Font) do
try Label1.Canvas.Font.Assign(Label1.Font); Result := Label1.Canvas.TextWidth(DerText); finally Free; end; |
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 |
AW: Canvas.Textwidth liefert falschen Wert
Das "Durchreichen" wahr wohl der richtige Tip.
Delphi-Quellcode:
So funktioniert alles wie notwendig;
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'; Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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