Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Höhe eines RichEdit an den Text anpassen


UGrohne - Mi 25.08.04 11:31
Titel: Höhe eines RichEdit an den Text anpassen
Hallo,
bei mir werden automatisch RichEdits erzeugt für verschiedene Texte. Diese werden später auch direkt mit RTF-formatiertem Text gefüttert. Jetzt brauche ich die Möglichkeit, herauszufinden, wie lange der Text in diesem RichEdit sein wird, also auf welche Höhe ich das RichEdit einstellen muss, damit ich keine Scrollbalken habe. Mit normaler Schrift wäre das ja relativ einfach, nur Texthöhe und Zeilenzahl. Aber mit formatiertem Text könnte das dann etwas schwieriger werden.

Hat das jemand schonmal gemacht oder hat eine Idee, wie das auf einfach Weise funktionieren könnte?


StefanH - Mi 25.08.04 20:58

Zeile für Zeile durchgehen, und die jeweils höchsten Schriftgrößen addieren? oder haben andere Formatierungen auch einfluss?


UGrohne - Mi 25.08.04 23:40

Naja, genau das wollte ich eigentlich vermeiden, denn dann muss ich wirklich in jeder Zeile überprüfen, was die größte Schriftgröße ist und damit die Höhe bestimmen. Und das bei mehreren RichEdits, die recht viel Text enthalten könnten, da wird das dann doch recht aufwändig....

Fällt denn wirklich niemandem eine bessere Lösung ein? Irgendwie arbeitet doch auch der Scrollbalken, wenn ich da evtl. einen Wert abzapfen könnte ....


blackbirdXXX - Do 26.08.04 05:07

Gibt es einen Wert, der angibt, ob ein Scrollbalken angezeigt wird oder nicht?
Wenn es diesen Wert gibt, kannst du es mit einer Schleife machen:

Delphi-Quelltext
1:
2:
3:
  RichEdit.Height := 1;
  while (RichEdit.ScrollBalkenSichtbar = true) 
    RichEdit.Height := RichEdit.Height+1;

Da ich aber keinen solchen Wert gefunden habe, hab ich da keinen wirklichen Tipp für dich.
Aber könnten man nicht das Handle des RichEditors bestimmen und so überprüfen, ob er den Scrollbalken anzeigt?


Keldorn - Do 26.08.04 10:26

für den scollbalken: http://www.delphipraxis.net/topic17387_scrollbalken.html
wenn kein scrollbalken angezeigt wird, nützt dir das aber auch wenig.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
//uses CommCtrl
var Scrollinfo: TScrollInfo;
begin
  Scrollinfo.cbsize := sizeof(Scrollinfo);
  Scrollinfo.fmask  := SIF_RANGE;

  if GetScrollInfo(RichEdit1.Handle, SB_VERT, Scrollinfo) then
    label1.Caption:=inttostr(Scrollinfo.nMax)
   else
    label1.caption:=inttostr(RichEdit1.ClientHeight);
end;

oder, für das letze Zeichen im richedit, gibt allerdings die linke, obere ecke zurück, also "fehlt" eine zeile, und gescrollt darf das richedit auch nicht sein.

Delphi-Quelltext
1:
2:
3:
4:
5:
Var pt: TPoint;
begin
  SendMessage(RichEdit1.Handle,EM_POSFROMCHAR, longint(@pt), maxint );
  label2.caption := inttostr(pt.y);
end;

wenn du beides kombinierst, kommst du vielleicht hin

Mfg Frank


UGrohne - Fr 27.08.04 14:12

Danke Keldorn, der erste Code hat mich weitergebracht. Leider habe ich das Problem mit dynamischen Zeilenumbrüchen. Sollte nämlich eine Zeile aufgrund ihrer Länge umgebrochen werden, wird sie irgendwie nicht mitgezählt, deswegen habe ich noch ein bisschen dazu addiert, bevor ich eine bessere Lösung gefunden hab.


UGrohne - Fr 27.08.04 14:27

Eben hab ich die optimale Variante gefunden, einfach und effizient:
RichEdit hat ein Ereignis OnResizeRequest. Dort wird ein Rechteck übergeben, das die neuen notwendigen Ausmaße für den Text angibt. Diese Daten in dem Rectangle kann man sehr gut für diese Sache nutzen.
Vor allem ist dann auch das Problem beim Vergrößern während der Laufzeit umgangen.