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 runterscrollen (https://www.delphipraxis.net/6068-richedit-runterscrollen.html)

S - tefano 28. Jun 2003 12:46


RichEdit runterscrollen
 
Hi,

ich habe ein RichEdit auf meiner Form, in das ich ankommende Texte reinschreibe. Dabei wird zwar der Text eingefügt, aber danach steht der Cursor im RichEdit auf dem ersten Zeichen des Textes.
Hab dann mal zum Probieren Postmessage benutze, wobei ich zuerst ein VK_CONTROL mit WM_KEYDOWN, danach dasselbe mit VK_END und danach beides mit WM_KEYUP an das Handle des Richedits sende. Aber irgendwie springt der Cursor dann nur an das Ende der jeweiligen Zeile.
Als Übergangslösung hab ich mir ne Schleife gemacht, die dem RichEdit so oft ein VK_DOWN (Pfeil nach Unten) schickt wie es Zeilen hat, und danach ein VK_END schicke um ans Ende der letzten Zeile zu kommen.
Aber das muss doch auch irgendwie so gehen, dass ich einfach Strg + Ende simuliere, damit ich nur eine Message abschicken muss...
Weiß einer wie das geht?

Bis dann,

S - tefano

sakura 28. Jun 2003 12:52

Beim Memo geht es recht einfach mit
Delphi-Quellcode:
Memo1.ScrollBy(0, MaxInt);
...:cat:...

S - tefano 28. Jun 2003 13:28

Hm, ne, beim RichEdit klappts leider nicht.

Aber ich könnt ja mal die Überschrift ändern...

Christian Seehase 28. Jun 2003 13:59

Moin Stefano,

TRichEdit ist von TCustomMemo abgeleitet und kennt ScrollBy.
(zumindest bei mir).

Ansonsten könntest Du Dir ja auch mal EM_SCROLL bzw. WM_VSCROLL ansehen.

Das sinnvollste wäre aber wohl eigentlich, was Du beschrieben hast, also die Simulation von VK_CONTROL/VK_END.

Du musst nur daran denken die Reihenfolge einzuhalten, also
  1. WM_KEYDOWN mit VK_CONTROL
  2. WM_KEYDOWN mit VK_END
  3. WM_KEYUP mit VK_END
  4. WM_KEYUP mit VK_CONTROL

Daniel B 28. Jun 2003 14:09

Moin Christian,
Zitat:

Zitat von Christian Seehase
TRichEdit ist von TCustomMemo abgeleitet und kennt ScrollBy.
(zumindest bei mir).

ScrollBy gibt es schon beim Grid. Aber mit 0, MaxInt geht schonmal nichts. Jedenfalls beim Grid.

Grüsse, Daniel :hi:

Christian Seehase 28. Jun 2003 14:22

Moin Daniel,

ist schon lustig.
Ich hab's mal eben ausprobiert.
Bei einem Memo funktioniert es auch nicht ;-)
Das Caret wird verschoben, aber der angezeigte Ausschnitt des Controls nicht.

Aber so geht's (getestet)

Delphi-Quellcode:
  SendMessage(RichEdit1.Handle,WM_KEYDOWN,VK_CONTROL,0);
  SendMessage(RichEdit1.Handle,WM_KEYDOWN,VK_END,0);
  SendMessage(RichEdit1.Handle,WM_KEYUP,VK_END,0);
  SendMessage(RichEdit1.Handle,WM_KEYUP,VK_CONTROL,0);

S - tefano 28. Jun 2003 14:44

@Chris
Genau so hab ichs auch gemacht (nur mit Postmessage statt Sendmessage). Passiert das gleiche wie bei mir. Das Strg wird dann irgendwie nicht erkannt, das Richedit reagiert nur auf die Message für VK_END.

Christian Seehase 28. Jun 2003 14:46

Moin Stefano,

probier's mal mit SendMessage.

Postmessge wartet nicht bis die Message verarbeitet ist. Vielleicht geht dadurch etwas durcheinander.

S - tefano 28. Jun 2003 15:59

Hm, dann hab ich wohl vergessen das klar genug rauszustellen.
Hab mal stumpfer Weise deinen Code per Copy/Paste bei mir eingefügt.

Zitat:

Passiert das gleiche wie bei mir.
Damit meinte ich, dass ich es schon ausprobiert habe. Naja, läuft bei mir jedenfalls merkwürdigerweise nicht. :?

phXql 11. Mär 2004 21:33

Re: RichEdit runterscrollen
 
so nach langem suchen hab ichs endlich gefunden.

also erst die SelStart setzen:
Delphi-Quellcode:
RichEdit1.SelStart := RichEdit1.GetTextLen();
und dann das:
Delphi-Quellcode:
SendMessage(RichEdit1.handle, EM_SCROLLCARET,0,0);

toms 11. Mär 2004 21:35

Re: RichEdit runterscrollen
 
Zitat:

so nach langem suchen hab ichs endlich gefunden.
Warum lange suchen? Hier steht's doch auch:

S - tefano 11. Mär 2004 21:40

Re: RichEdit runterscrollen
 
Hi,

nett von euch dass ihr euch noch bemüht habt ;-)
Leider funktionieren diese ganzen Caret-Messages bei mir komischerweise nicht.
Habs ein paar Tage später so gelöst:

Delphi-Quellcode:
procedure runterscrollen(TR: TCustomMemo; before: TWinControl);
var
  i: integer;
begin
  TR.SetFocus;
  Application.ProcessMessages;
  for i:= 1 to TR.Lines.Count do
  begin
    PostMessage(TR.Handle, WM_KEYDOWN, VK_DOWN, 0);
    PostMessage(TR.Handle, WM_KEYUP, VK_DOWN, 0);
    Application.ProcessMessages;
  end;
  PostMessage(TR.Handle, WM_KEYDOWN, VK_END, 0);
  PostMessage(TR.Handle, WM_KEYUP, VK_END, 0);
  if before <> nil then before.SetFocus;
end;
Ich sende also den nachUnten-Cursor an das (fokussierte) RichEdit so oft wie das R.E. Zeilen hat, gehe dann vorsichtshalber noch manuell ans Ende der Zeile (wenn ich später Text einfüge soll der ja ans Ende kommen) und gebe dann dem vorherigen Control den FOkus zurück.
N bisl arg improvisiert, aber läuft. ;-)

Bis dann,

S - tefano

phXql 12. Mär 2004 15:14

Re: RichEdit runterscrollen
 
Zitat:

Zitat von toms
Zitat:

so nach langem suchen hab ichs endlich gefunden.
Warum lange suchen? Hier steht's doch auch:

das kannte ich vorher noch nicht ;)


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