Zeig doch mal ein minimales Code-Beispiel. Dann müssen wir nicht raten.
Die Proc wird aus der WndProc des RichEdits heraus gecallt (noch vorm "inherited"), wenn dort gerade eine wm_VScroll-Message durchläuft. Dann möchte ich noch bevor dieser Scroll-Akt ausgeführt wird, an bestimmten Stellen des Textes der jetzt gleich zu sehen sein wird spezielle Formatierung vornehmen usw. usf...
Delphi-Quellcode:
procedure TTextViewForm.spcFormatter(AMessage : TMessage);
var I, I9 : integer;
RE1SelStart, RE1SelLength : integer;
RE1TextAttributes : TTextAttributes;
RE1ScrollInfo : ScrollInfo;
begin
// Speicherung gewisser RE1-Werte zwecks späterer Wiederherstellung
RE1SelStart := RichEdit1.SelStart;
RE1SelLength := RichEdit1.SelLength;
RE1TextAttributes := RichEdit1.SelAttributes;
firstVisibleRE1Line := RichEdit1.Perform(EM_GETFIRSTVISIBLELINE,0,0); // aktuelles firstVisibleRE1Line zum Zeitpunkt der Message in der RE1-WndProc - dh.: aus der muss jetzt erst das zukünftige neue firstVisibleRE1Line errechnet werden ..um diese eine Zeile dann vorab hier schnell zu formattieren
// alternative firstVisibleRE1Line-Berechnung aufbauend auf dem ScrollPosWert
DWordVar := GetScrollPos(RichEdit1.Handle,SB_VERT); <================== hier kommt dann leider der NUR 16bit-Wert
firstVisibleRE1Line := DWordVar;
firstVisibleRE1Line := firstVisibleRE1Line div realTextHeight;
// zum Gegencheck im Debugger: kriege ich hiermit vielleicht 32bit-Werte?
RE1ScrollInfo.cbSize := SizeOf(RE1ScrollInfo);
RE1ScrollInfo.fMask := SIF_PAGE or SIF_POS or SIF_RANGE or SIF_TRACKPOS;
getScrollInfo(RichEdit1.Handle,SB_VERT,RE1ScrollInfo); <============== im Debugger sehe ich dann in RE1ScrollInfo auch den leider NUR 16bit-Wert
if (AMessage.WParamLo = SB_PAGEUP) then firstVisibleRE1Line := firstVisibleRE1Line - ceil(Richedit1.ClientHeight / realTextHeight)
else
.
.
.
else
exit;
RichEdit1.HideSelection := true;
if firstVisibleRE1Line < 0 then firstVisibleRE1Line := 0;
for I := 1 to 2 do begin
if firstVisibleRE1Line > RichEdit1.Lines.Count-1 then break;
if FIDs[firstVisibleRE1Line] and b30 = 0 then begin
spcPraeOnIdleFormatterFlag := true;
ONsOFFsText_Formatter(RichEdit1,@FIDs,FUNIDs,Pointer(momClDim_OnOffs),@FColorDim,true, firstVisibleRE1Line);
spcPraeOnIdleFormatterFlag := false;
end;
inc(firstVisibleRE1Line);
end;
RichEdit1.SelStart := RE1SelStart;
RichEdit1.SelLength := RE1SelLength;
RichEdit1.SelAttributes := RE1TextAttributes;
RichEdit1.HideSelection := false;
end;