AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

32bit-ScrollPosWerte gibt's gerade irgendwie nicht?

Ein Thema von r29d43 · begonnen am 20. Jan 2018 · letzter Beitrag vom 20. Jan 2018
Antwort Antwort
r29d43

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

32bit-ScrollPosWerte gibt's gerade irgendwie nicht?

  Alt 20. Jan 2018, 16:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 20. Jan 2018, 16:49
Zeig doch mal ein minimales Code-Beispiel. Dann müssen wir nicht raten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#3

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

  Alt 20. Jan 2018, 16:54
text entfernt,
war nicht für dein problem, sorry.

Geändert von Fukiszo (20. Jan 2018 um 17:29 Uhr) Grund: meine antwort war doof
  Mit Zitat antworten Zitat
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
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

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

  Alt 20. Jan 2018, 19:45
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.
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#6

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

  Alt 20. Jan 2018, 20:09
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

Geändert von Fukiszo (20. Jan 2018 um 21:15 Uhr) Grund: Verfeinerung des Textes
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 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