Einzelnen Beitrag anzeigen

r29d43

Registriert seit: 18. Jan 2007
287 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?

  Alt 20. Jan 2018, 18:55
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;
  Mit Zitat antworten Zitat