Zdarzenie przy przewijaniu RichEdit.

0

Witam. Chce zrobic program ktory bedzie reagowal natychmiast kiedy przewija sie komponent TRichEdit. Ale nie ma takiego zdarzenia w tym komponencie, wiec wpadlem na pomysl zeby uzyc timera i co chwile sprawdzac polozenie suwaków RichEdit ale jest jedno ale, timer nie wywoluje funkcji podczas przewijania, po prostu zamiera wszystko, tak jakby komponent Richedit mial wtedy procesor na wylacznosc. Jak to obejsc?

0

Może zdarzenie MouseWheelDown/Up ??

0
  1. Obawiam się, że aby wykryć przewijanie za pomocą scrollbarów musisz przechwycić komunikaty WM_VSCROLL i WM_HSCROLL.

  2. Na wykrycie przewijania kółkiem myszy masz trzy sposoby:
    a. przechwytujesz komunikat WM_MOUSEWHEEL
    b. piszesz własną funkcję MouseWheelHandler
    c. obsługujesz zdarzenie OnMouseWheel (ale to za łatwe ;) )

  3. Musisz jeszcze wykryć przewijanie spowodowane przesuwaniem kursora tekstowego i/lub modyfikacją tekstu:
    a. przechwytujesz komunikat [nie pamiętam jaki] ;)
    b. piszesz własną funkcję SelectionChange
    c. obsługujesz zdarzenie OnSelectionChange

Aby sprawdzić, czy podczas punktów 2. i 3. naprawdę przewinięto tekst, na początku programu (ew. w konstruktorze komponentu) zerujesz dwie zmienne :

OldPosition: = 0;
NewPosition := 0;

Następnie podczas odpowiedniego zdarzenia wywołujesz kod:

NewPosition := SendMessage(RichEdit.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
if NewPosition<>OldPosition then begin
   // nastąpiło scrollowanie, tu dodaj jeszcze swój kod
   OldPosition:=NewPosition ;
   end;

Aha, przechwytywać komunikaty można na dwa sposoby: albo pisząc nowy komponent, albo podmieniając dynamicznie procedurę obsługi komunikatów: WndProc. Napisanie komponentu, w którym będziesz niemalże wszystko dziedziczył powinno być łatwe. Dynamiczna podmiana jest jeszcze łatwiejsza, ale ja za cholerę nie wiem, jak ją w Delphi wykonać, bo się na Delphi nie znam, więc musisz się zwrócić jeszcze do kogoś innego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0