Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Komponentenbreite an Textbreite anpassen (https://www.delphipraxis.net/119303-komponentenbreite-textbreite-anpassen.html)

gfjs 24. Aug 2008 03:02


Komponentenbreite an Textbreite anpassen
 
Guten Morgen, Allerseits.

Ich probiere schon seit zwei Stunden, die Breite eines Memo zur Laufzeit so einzustellen, dass ein vorgegebener Text reinpasst.

Delphi-Quellcode:
begin
  Label1.Font.Size := 18;
  Memo1.Font.Size := 18;
  w               := Label1.Canvas.TextWidth('TESTTEXT');
  Memo1.Width     := w;
  d               := w - Memo1.ClientWidth;
  Memo1.Width     := d + w;
  Memo1.Clear;
  Memo1.Lines.Add('TESTTEXT');
  ShowMessage(IntToStr(w) + '/' + IntToStr(d) + '/' + IntToStr(Memo1.Width));
end;
Das Memo ist - egal welche Schriftgröße ich nehme - immer ein wenig zu klein. Ich habe auch schon den Umweg gewählt, den Text direkt (ohne Verwendung von Canvas) einem Label.Caption zuzuweisen und dann die Breite des Labels zu verwenden - der Effekt ist derselbe.

Wer kann mir weiterhelfen?

Vielen Dank und noch einen schönen Sonntag.

Gruß Jürgen

r29d43 24. Aug 2008 08:16

Re: Komponentenbreite an Textbreite anpassen
 
Moin moin,

der Text im Memo geht doch vorne nie gleich beim allerersten Pixel los, sondern erst mit einem kleinen Offset rechts davon. Genauso endet die Textanzeige am rechten Memo-Rand auch schon etwas vorm letzt möglichen Pixel. Ergo musst du diese Versatzlängen zur eigentlichen TextWidth einfach immer noch dazuaddieren:


Delphi-Quellcode:
Offsets := 8; // 8, sonst schlägt das "WordWrap" zu, wenn dieses TRUE ist
Memo1.ClientWidth := Offsets + Label1.Canvas.TextWidth(Label1.Caption);
Übrigens kann man die Größe dieser Abstandsränder bei einem Memo oder einem RichEdit auch selbst auslesen bzw. selbst einstellen, und zwar mittels EM_GETRECT bzw. EM_SETRECT.


Auch schönen Sonntag noch,
mfg

gfjs 24. Aug 2008 09:08

Re: Komponentenbreite an Textbreite anpassen
 
@ r29d43

Guten Morgen ...

und vielen Dank für Dein frühes Engagement.

Das mit Offsets := 8 klappt nur bei Font.Size < 11 (bei Arial). Je größer die Schrift ist, desto größer wird dieser Wert. Ich habe das mal für Schriftgrößen bis 72 angeschaut:

Zitat:

Q := Font.Size/Offsets ===> 1,1 < Q < 1,34
Wenn Du magst, kannst Du mir vielleicht noch ein Beispiel zu EM_GETRECT bzw. EM_SETRECT schicken - habe damit bisher noch nichts zu tun gehabt.

Gruß Jürgen

SirThornberry 24. Aug 2008 09:12

Re: Komponentenbreite an Textbreite anpassen
 
hallo Jürgen. 8 war auch nur ein Beispiel.

schau dir nochmal den Beitrag über deinem genau an:
Zitat:

Übrigens kann man die Größe dieser Abstandsränder bei einem Memo oder einem RichEdit auch selbst auslesen bzw. selbst einstellen, und zwar mittels EM_GETRECT bzw. EM_SETRECT.

MSSSSM 24. Aug 2008 10:34

Re: Komponentenbreite an Textbreite anpassen
 
Delphi-Quellcode:
var rec:TRect;
begin
  SendMessage(Memo1.Handle,EM_GETRECT,0,Integer(@rec));
Heißt:
Du sendest eine Nachricht (EM_GETRECT) an das Memo, das du sein Rechteck in Rec haben willst. (@ ist für die Adresse und diese muss auf Integer gecastet werden)
In Rec steht das ganze dann.

mfg MSSSSM

gfjs 24. Aug 2008 11:14

Re: Komponentenbreite an Textbreite anpassen
 
Zur Vermeidung von Frust bei Leuten meines Alters sollte es Minderjährigen untersagt werden, im Forum Ihr Alter preiszugeben! :zwinker:

Erst mal vielen Dank, aber das Ganze wird mir immer unheimlicher:

Delphi-Quellcode:
Memo1.Font.Size := 10;
Memo1.Height   := 20;
Memo1.Clear;
Memo1.Text := 'TEST';
funktioniert!

Delphi-Quellcode:
Memo1.Font.Size := 10;
Memo1.Height   := 20;
Memo1.Clear;
Memo1.Lines.Add('TEST');
funktioniert nicht! - d.h. es funktioniert erst, wenn Memo1.Height > 37.

Jetzt könnte man annehmen, dass mit dem Lines.Add auch gleich ein Zeilenwechsel eingefügt wird, d.h. dass noch eine zweite leere Zeile vorhanden ist. Dem ist aber nicht so, denn die Abfrage von Lines.Count ergibt eindeutig 1.

Gruß Jürgen

DeddyH 24. Aug 2008 11:31

Re: Komponentenbreite an Textbreite anpassen
 
Gegenprobe:
Delphi-Quellcode:
Memo1.Font.Size := 10;
Memo1.Height   := 20;
Memo1.Clear;
Memo1.Lines.Add('TEST');
Memo1.Lines.ItemIndex := 0;
Wie sieht es damit aus?

gfjs 24. Aug 2008 11:43

Re: Komponentenbreite an Textbreite anpassen
 
@ DeddyH

??? Schlecht!

Ich will ja nicht die unsichtbare Zeile auslesen, sondern möchte, dass die Zeile angezeigt wird. Das könnte ich jetzt ja durch Memo1.Text := 'TEST' erreichen. Aber das Problem ist doch, dass ich zur Laufzeit feststellen möchte, wie groß ein Memo sein muss, um einen mehrzeiligen Text in vorgegebener Schriftgröße unterzubringen bzw. wie groß die Schriftgröße sein muss, damit ich diesen Text in einem Memo mit vorgegebener Größe unterbringen kann.

Vielleicht stelle ich mich ja wirklich nur zu blös an?!

Gruß Jürgen


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 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