Delphi-PRAXiS
Seite 1 von 2  1 2      

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 2 TEdits synchron scrollen (https://www.delphipraxis.net/47665-2-tedits-synchron-scrollen.html)

3_of_8 14. Jun 2005 17:11


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.

Khabarakh 14. Jun 2005 17:16

Re: 2 TEdits synchron scrollen
 
Frage missverstanden

Zacherl 14. Jun 2005 17:21

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

Flocke 14. Jun 2005 17:34

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"?

3_of_8 14. Jun 2005 20:21

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?

100nF 14. Jun 2005 20:39

Re: 2 TEdits synchron scrollen
 
Zitat:

Ich habe bereits jede Menge Lösungen für RichEdits gefunden, aber keine für TEdits.
Zitat:

Ich habe allerdings auch noch keine Lösung für RichEdits gefunden.
:gruebel: :gruebel: :gruebel:

Flocke 14. Jun 2005 22:47

Re: 2 TEdits synchron scrollen
 
Sollte so aussehen (ungetestet):
Delphi-Quellcode:
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;
Allerdings brauchst du für die Meldungen mindestens ein RichEdit in der Version 3.0.

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;

3_of_8 15. Jun 2005 16:54

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?

Flocke 15. Jun 2005 17:04

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:
procedure Sync;
var x: TPoint;
begin
  GetRichEditScrollPos(RichEdit1, x);
  SetRichEditScrollPos(RichEdit2, x);
end;
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.

3_of_8 15. Jun 2005 17:08

Re: 2 TEdits synchron scrollen
 
Danke. Muss man erstmal verstehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr.
Seite 1 von 2  1 2      

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