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/)
-   -   Delphi RichEdit-Höhe automatisch setzen (https://www.delphipraxis.net/28546-richedit-hoehe-automatisch-setzen.html)

UGrohne 26. Aug 2004 08:18


RichEdit-Höhe automatisch setzen
 
Hallo Leute,
ich suche eine Möglichkeit, wie ich dafür sorgen kann, dass ein RichEdit genau die Höhe hat, die es braucht, um den Text ohne Scorllbalken anzuzeigen. Das Problem sind dabei vor allem eben unterschiedliche Schriftarten. Ich will eigentlich nicht jede einzelne Zeile durchgehen, nach der größten Schrift suchen und die Höhe bestimmen.
Das würde die Laufzeit der Routine ziemlich erhöhen, zumal ich mehrere RichEdits erzeugen muss (die kommen alle in eine Scrollbox).

Gibt es eine einfache Möglichkeit dafür oder gibt es wenigstens eine Möglichkeit abzufragen, ob Scrollbalken im Moment angezeigt werden?

TStringlist 26. Aug 2004 23:33

Re: RichEdit-Höhe automatisch setzen
 
Hallo,

Also diesbezüglich würde ich den Cursor/SelSart zuerst mal auf die letzte (event. +1te) Zeile des Textes setzen. Dann diesen mit EM_ScrollCaret ins Bild scrollen (die Form o. das RichEdit braucht dazu noch nicht sichtbar zu sein). Anschließend ermittelst du im RichEdit1.Client-Bereich den danach obersten "sichtbaren" Text-Pixel. ...Um welchen gleichzeitig also auch der Betrag von RichEdit1.Height zu gering ist, um den gesamten Text eben auf einmal anzeigen zu können. ...Und welcher gegen Ende dann also auf dieses RichEdit1.Height draufzuaddieren wäre. Zum Schluss erfolgt dann ein nochmaliges EM-Scrollen, um den sichtbaren Text auch tatsächlich immer mit Zeile 0 beginnen zu lassen.

Also lange Rede kurzer Code, alles ungefähr so:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var XY : TPoint;
begin
  RichEdit1.SelStart := RichEdit1.Perform(EM_LineIndex,RichEdit1.Lines.Count,0);
  RichEdit1.Perform(EM_ScrollCaret,0,0);
  RichEdit1.Perform(EM_PosFromChar,integer(@XY),0);
  RichEdit1.Height := RichEdit1.Height + XY.Y*-1; // +/- einer Feineinstellung...
  //...die aber unnötig wird, wenn du die vertikale ScrollBar ausschaltest

  // Abschließende Kosmetik
  RichEdit1.SelStart := 0;
  RichEdit1.Perform(EM_ScrollCaret,0,0);
end;

UGrohne 27. Aug 2004 13:15

Re: RichEdit-Höhe automatisch setzen
 
Naja, die Lösung ist glaub ich absolut nicht optimal, das muss ich teilweise mit mind. 10 RichEdits machen und das auch noch beim Resizen.
Der Code, der mir gestern mitgeteilt wurde, ist da glaub ich etwas perfomanter, wenn auch noch nicht optimal:+
Delphi-Quellcode:
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;
Danke trotzdem

UGrohne 27. Aug 2004 13:27

Re: RichEdit-Höhe automatisch setzen
 
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.


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