Delphi-PRAXiS

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/)
-   -   32bit-ScrollPosWerte gibt's gerade irgendwie nicht? (https://www.delphipraxis.net/194933-32bit-scrollposwerte-gibts-gerade-irgendwie-nicht.html)

r29d43 20. Jan 2018 16:04

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.

Uwe Raabe 20. Jan 2018 16:49

AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
 
Zeig doch mal ein minimales Code-Beispiel. Dann müssen wir nicht raten.

Fukiszo 20. Jan 2018 16:54

AW: 32bit-ScrollPosWerte gibt's gerade irgendwie nicht?
 
text entfernt,
war nicht für dein problem, sorry.

r29d43 20. Jan 2018 18:55

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

Zitat von Uwe Raabe (Beitrag 1391471)
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;

jbg 20. Jan 2018 19:45

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

Zitat von r29d43 (Beitrag 1391466)
die 32bit-ScrollPosWerte eines RichEdits?

Die gibt es nicht. Das RichEdit wurde so programmiert, dass es die obsoleten 16-Bit Scroll-Funktionen unterstützt. In dem Moment wo Max-Scroll größer als 65335 wird, fängt das RichEdit an, die Scroll-Daten auf 16bit Werte abzubilden und die ScrollInfo entsprechend einzuschränken. Somit fallen mehrere Pixel auf einer einzelnen Scroll-Position zusammen.

Fukiszo 20. Jan 2018 20:09

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:
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;
Mit Änderungen aus diesen Schnippsel kannst Du evtl. deine benötigten Werte ermitteln.
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 17:50 Uhr.

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