![]() |
32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
Hallo,
wie komme ich nochmal schnell an die 32bit-ScrollPosWerte eines RichEdits? Per GetScrollInfo oder GetScrollPos geht's (im Moment) jedenfalls nicht, obgleich diese ApiFuncs das aber eigentlich können sollten. Ich habe ein RichEdit das u.U. auch mal ein paar tausend Zeilen aufnehmen und anzeigen kann. Bei kleinen Zeilennummern (die ich zum Gegencheck per em_GetFirstVisibleLine ermittle) stimmen diese ScrollPos-Werte ja noch. Aber wenn ich z.B. Zeile 8753 als erste Zeile des RichEdit-Clientbereiches angezeigt habe, dann bekomme ich als ScrollPosWert in allen Funktionen immer nur die 65155 als Wert. Bei 16 Pixel Gesamthöhe einer Zeile müssten der richtige Rückgabewert aber 140048 lauten. ? Thx im Voraus. |
AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
Zeig doch mal ein minimales Code-Beispiel. Dann müssen wir nicht raten.
|
AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
text entfernt,
war nicht für dein problem, sorry. |
AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
Zitat:
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; |
AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
Zitat:
|
AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
Ich hab mal ein wenig rumprobiert und das ist dabei rausgekommen.
Hier ein paar Schnippsel die dich im RichEdit hin und her springen lassen bzw an eine exakte position oder halt aktuelle Zeilen Position herausfinden (ohne auf ScrollPos angewiesen sein zu müßen)
Delphi-Quellcode:
Mit Änderungen aus diesen Schnippsel kannst Du evtl. deine benötigten Werte ermitteln.
procedure TForm1.Button1Click(Sender: TObject);
var x: Integer; begin with RichEdit1 do begin // Zur letzten Zeile scrollen: SelStart := Length(Text); Perform(EM_SCROLLCARET, 0, 0); // oder ohne SelStart direkt: Perform(WM_VSCROLL, SB_BOTTOM,0); // Zur ersten Zeile Scrollen: SelStart := Perform(EM_LINEINDEX, 0, 0); Perform(EM_SCROLLCARET, 0, 0); // oder ohne SelStart direkt: Perform(WM_VSCROLL, SB_TOP,0); // Cursor auf Zeile 5, Position 3 setzen: SelStart := Perform(EM_LINEINDEX, 5, 0) + 3; Perform(EM_SCROLLCARET, 0, 0); // Eine Zeile nach unten scrollen with RichEdit1 do begin x := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0); // <- hier ermittel ich die aktuelle Zeile, danke WinAPI :-) SelStart := Perform(EM_LINEINDEX, x + 1, 0); Perform(EM_SCROLLCARET, 0, 0); end; // Den Fokus aufs RichEdit setzen: SetFocus; end; end; Achtung: Es existiert absolut null Fehler-Behandlung in diesem Schnippsel! Der Code ist ab Windows 2000 nutzbar. Falls es generell nicht das ist was du suchst, entschulde bitte diesen Post. Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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