![]() |
2 TEdits synchron scrollen
Hallo.
Ich habe zwei TEdits, und das erste soll immer genausoweit gescrollt sein wie das zweite. Ich habe bereits jede Menge Lösungen für RichEdits gefunden, aber keine für TEdits. Auch mit SelStart geht es nicht wirklich. |
Re: 2 TEdits synchron scrollen
Frage missverstanden
|
Re: 2 TEdits synchron scrollen
Hallo,
Bei Edits kannst du zu seite scrollen, indem du Edit2.SelStart := Edit1.SelStart immer wirder aufrufst. Müsste eigentlich gehen ... Florian |
Re: 2 TEdits synchron scrollen
Soweit ich weiß geht das nur mit TRichEdit, denn nur das kennt EM_GETSCROLLPOS und EM_SETSCROLLPOS.
Kannst du keine TRichEdits als einfache TEdits "missbrauchen"? |
Re: 2 TEdits synchron scrollen
@Florian Bernd: Hab ich schon probiert. Die beiden Edits sind trotzdem unterschiedlich gescrollt.
Das Programm wird nämlich ein Tipptrainer, edtRead ist die Vorlage, in edtWrite gibt man den Text ein. Darum sollte die Vorlage so weit wie das Eingabefeld gescrollt sein. Also edtRead so weit wie edtWrite. @Flocke: Ja, kann ich. Ich habe allerdings auch noch keine Lösung für RichEdits gefunden. Die beiden Windows-Messages klingen interessant. Ich müsste praktisch von edtWrite die ScrollPos feststellen und edtRead um genau den gleichen Wert scrollen. Erklärst du mir noch, welche Parameter ich angeben muss? |
Re: 2 TEdits synchron scrollen
Zitat:
Zitat:
|
Re: 2 TEdits synchron scrollen
Sollte so aussehen (ungetestet):
Delphi-Quellcode:
Allerdings brauchst du für die Meldungen mindestens ein RichEdit in der Version 3.0.
const
// Braucht mindestens ein RichEdit 3.0! {$EXTERNALSYM EM_GETSCROLLPOS} EM_GETSCROLLPOS = WM_USER + 221; {$EXTERNALSYM EM_SETSCROLLPOS} EM_SETSCROLLPOS = WM_USER + 222; procedure GetRichEditScrollPos(Rich: TCustomRichEdit; var Pnt: TPoint); begin Rich.Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt)); end; procedure SetRichEditScrollPos(Rich: TCustomRichEdit; const Pnt: TPoint); begin Rich.Perform(EM_SETSCROLLPOS, 0, Integer(@Pnt)); end; Wenn du auch noch informiert werden willst, wann das Control gescrollt wird, dann musst du eine abgeleitete Klasse erstellen (das geht schon in allen 32-Bit-Versionen von RichEdit):
Delphi-Quellcode:
type
TScrollRichEdit = class(TRichEdit) private FOnVerticalScroll: TNotifyEvent; FOnHorizontalScroll: TNotifyEvent; protected procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; published property OnVerticalScroll: TNotifyEvent read FOnVerticalScroll write FOnVerticalScroll; property OnHorizontalScroll: TNotifyEvent read FOnHorizontalScroll write FOnHorizontalScroll; end; procedure TScrollRichEdit.CNNotify(var Message: TWMNotify); begin case Message.NMHdr^.code of EN_VSCROLL: if Assigned(FOnVerticalScroll) then FOnVerticalScroll(Self); EN_HSCROLL: if Assigned(FOnHorizontalScroll) then FOnHorizontalScroll(Self); else inherited; end; end; |
Re: 2 TEdits synchron scrollen
@urbanbruhin: :wall:
Dumm formuliert von mir, ich weiß. Also: Ich habe gefunden, wie man ein RichEdit scrollen kann, aber wie man das synchronisieren kann nicht. @Flocke: Danke, aber was ist pnt? Bzw. was muss ich dafür angeben? |
Re: 2 TEdits synchron scrollen
Pnt ist TPoint der die virtuellen Koordinaten der linken oberen Fensterecke des RichEdit in Relation zur linken oberen Ecke des Dokuments enthält. Stell dir dazu das Dokument z.B. als riesige Bitmap vor; dann ist der Punkt (Pnt.x, Pnt.y) der Punkt in der Bitmap, der in der linken oberen Fensterecke des RichEdit angezeigt wird.
Synchronisierung zweier RichEdits:
Delphi-Quellcode:
Dieser Code würde die links oben angezeigte Ecke (die Scrollposition) von RichEdit2 auf die Position von RichEdit1 setzen. In deinem Beispiel wäre RichEdit2 die Vorgabe und RichEdit1 wäre das Eingabefenster.
procedure Sync;
var x: TPoint; begin GetRichEditScrollPos(RichEdit1, x); SetRichEditScrollPos(RichEdit2, x); end; |
Re: 2 TEdits synchron scrollen
Danke. Muss man erstmal verstehen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz