AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponentenbreite an Textbreite anpassen

Ein Thema von gfjs · begonnen am 24. Aug 2008 · letzter Beitrag vom 24. Aug 2008
Antwort Antwort
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#1

Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 04:02
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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 09:16
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
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 10:08
@ 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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 10:12
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von MSSSSM
MSSSSM

Registriert seit: 18. Apr 2008
223 Beiträge
 
Delphi 7 Professional
 
#5

Re: Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 11:34
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
Marius
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 12:14
Zur Vermeidung von Frust bei Leuten meines Alters sollte es Minderjährigen untersagt werden, im Forum Ihr Alter preiszugeben!

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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#7

Re: Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 12:31
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Komponentenbreite an Textbreite anpassen

  Alt 24. Aug 2008, 12:43
@ 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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  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 06:44 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