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/)
-   -   Delphi Richedit Zeilenweise scrollen die zweite (https://www.delphipraxis.net/158141-richedit-zeilenweise-scrollen-die-zweite.html)

Memnarch 7. Feb 2011 13:21

Richedit Zeilenweise scrollen die zweite
 
Tag allerseits.
Hab mal nen altes projekt von mir ausgegraben(das Trichedit projekt :P).

Soweit klapt inziwschen alles fehlerlos(doublebuffering, zusaätzliche gimmicks^^ etc).
Nun häng ich aber noch am scrollen fest. Da ich ja von einem richedit, den inhalt erst auf einer bitmap zusammensetze und dann die benötigten teile auf das richedit zeichne, muss ich die aktuelle scrollposition ermitteln können.(nur zeilenweise scrollen)

Bisher hatte ich es so gemacht, das ich mir per EM_GETFIRSTVISIBLELINE die erste sichtbare zeile geholt habe und mit der Zeilenhöhe multipliziert hatte.(Zeilenhöhe hatte ich am anfang manuel kalkuliert). Das klappte auch super. Durch das modigizieren der WMVScroll procedure ist es mir auch gelungen, dass nurnoch zeilenweise gescrolled wird, wen man den regler per maus zieht, und eben nichtmehr pixelweise bzw fein gescrolled wird.

Leider bleibt nochimmer ein Problem: Fettgedruckter Text oder Kursiver(Alles selber Font), verändern die zeilenhöhe für ihre jeweilige zeile, weshalb meine errechnete Zeilenhöhe nicht mehr übereinstimmt.(Sie variiert nun bei normalem/fettgedrucktem und kursivtext >.<).

Soetwas wie "Gib mir die PixelPosition der ersten sichtbaren zeile", wäre was ich gebrauchen könnte :|

Hat da jemand ne Idee?

MFG
Memnarch

Memnarch 16. Feb 2011 10:12

AW: Richedit Zeilenweise scrollen die zweite
 
Moinsen alle miteinander.
Habe noch ein Problem.

Undzwar möchte ich Horizontalen scrollen Buchstabenweise scrollen. Und hier bekomme ich ein problem:

Die richtige Position der Scrollbar rauszufindens cheint fast undmöglich >.<.

WM_HSCROLL Löst aus wenn ich die ThumbBar ziehe oder auf die Pfeile klicke, übermittelt aber NUR die Position(welche nur dan aktualisiert wird, wenn man mit dem ziehen fertig ist) und wird auch NICHT ausgelößt, wen das richedit automatisch nach rechts scrolled(wen der cursor dabei ist den Bildschirmrand zu verlassen).

GetScrollInfo liefert mir zwar nPos und nTrackPos, aber es ist "schwierig" herauszufinden, ob man gerade die Thumbbar zieht oder die Position genutzt werden soll. Außerdem müsste GetScrollInfo noch in einem sinnvollen MessageHandler gepackt werden(WM_HSCroll löst ja beim autoscrollen nicht aus o.O).

Ich möchte doch nur die verdaamte position der Scrollbar und es ist als ob ich dazu einmal um den Gesamten erdball laufen muss(rechtsrum), obwohl ein schrit nach Links mich zum selben ziehl führen würde >.<


MFG
Memnarch

p80286 16. Feb 2011 11:27

AW: Richedit Zeilenweise scrollen die zweite
 
Zitat:

Zitat von Memnarch (Beitrag 1082099)
Buchstabenweise scrollen

vergiss es, es sei denn du verwendest einen Font mit festen "Buchstabengrößen", z.B. Courier.
Wenn du mir nicht glaubst,
gib in der ersten Zeile einmal iiiii und in der zweiten WWWWW ein, und dann schnitz Dir aus in welcher Zeile deine "Buchstabenreferenz" ist.

Gruß
K-H

Memnarch 16. Feb 2011 11:31

AW: Richedit Zeilenweise scrollen die zweite
 
Whoops, Entschuldige:
Ich benutze nur Fonts mit Fester größe für das projekt^^.
Die info hatte ich komplett vergessen zu schreiben. Mein Fehler.
(Wird ne art mini IDE..und warum? Weil ich bock drauf habe :D)

PS: Wil halt soviel wie möglich selber machen, um erfahrungen zu sammeln(deswegen kommt auch kein synedit in Frage). Aber wie gesagt, scrollen ist das einzig letzte wirkliche problem.

MFG
Memnarch

David Martens 17. Feb 2011 23:07

AW: Richedit Zeilenweise scrollen die zweite
 
1. Beim Zeichnen auf die Bitmap mußt du doch auch wissen wo die einzelnen Zeilen hinkommen, kannst du nicht dir da die einzelnen Positionen speichern und dann dorthin scrollen?

2. Wenn du nur Buchstabenweise scrollen willst, reicht da nicht die Richtung. Du kannst auch von Thumbbar eine eigene Komponente ableiten die die benötigten Messages feuert. Dann kannst du auch gleich die richtige Position zurückgeben lassen.

Gruß David

Memnarch 21. Feb 2011 08:23

AW: Richedit Zeilenweise scrollen die zweite
 
Naja, das zeichnen auf der Bitmap klappt zwar, allerdings wegen des scrollens manchmal doch nicht so ganz. Vertikal klappts perfekt. Da kann ich mir ja imemr die erste sichtbare Zeile des Richedit geben lassen.

Sich ne eigene Thumbbar zu machen könnte eventuell die lösung sein. EVENTUEL. Den auch dort kann ich die position auslesen. Inziwschen klappt mein Horizontales scrollen per standart scrollbar ganz gut. NUR das klicken auf die Pfeile links u. Rechts wird nicht berücksichtigt. Da werden andere nachrichten geschick.(LINE_RIGHT/LINE_LEFT o.ä. ... nur wo kann ich DIE abfangen? in WMV/WMH_Scroll werden die nicht hingefeuert, die landen woanders).


MFG
Memnarch

stahli 31. Mär 2020 22:00

AW: Richedit Zeilenweise scrollen die zweite
 
Ich habe ein RichEdit mit einheitlichen Zeilenhöhen (14px) und möchte ein Smooth-Scrolling verhindern (also immer Zeilenweise scrollen).
Wie kann man das am einfachsten realisieren?

Mit
Delphi-Quellcode:
    oPos := (GetScrollPos(RichEdit1.Handle, sb_vert));
    oPosM := (oPos mod 14);
    if (oPosM > 0) then
    begin
//      (RichEdit1.Handle, sb_vert, oPos - oPosM, LONGBOOL(True));
//      RichEdit1.Perform(EM_LINESCROLL, 0, -1); //-oPosM);
//      SetScrollPos(RichEdit1.Handle, sb_vert, oPos - oPosM, LONGBOOL(True));
      Beep;
    end;
kann ich schon ermitteln, dass der Textbereich z.B. um 4 Pixel verschoben ist, aber ich kann das nicht vernünftig korrigieren.

Wie lässt sich das über WMVScroll regeln?

stahli 2. Apr 2020 13:42

AW: Richedit Zeilenweise scrollen die zweite
 
Ich habe es jetzt ganz brauchbar hin bekommen.
Falls es jemandem mal hilft:

Delphi-Quellcode:
unit uRichEdit;

interface

  uses

    Vcl.ComCtrls, System.Classes, Winapi.Messages;

  type

    TRichEdit = class(Vcl.ComCtrls.TRichEdit)
    protected
      procedure WMMouseWheel(var Msg: TWMMouseWheel); message WM_MOUSEWHEEL;
      procedure WMVScroll(var Msg: TWMScroll); message WM_VSCROLL;
    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
    end;

implementation

  uses

    Winapi.Windows, System.SysUtils;

{ TRichEdit }

  constructor TRichEdit.Create(AOwner: TComponent);
  begin
    inherited;
  end;

  destructor TRichEdit.Destroy;
  begin
    inherited;
  end;

  procedure TRichEdit.WMVScroll(var Msg: TWMScroll);
  var
    mPos : Integer;
    mPosM: Integer;
  begin
    mPos := Msg.Pos;
    mPosM := (mPos mod 14);
    if (mPosM > 0) then
      begin
        Msg.Pos := (mPos - mPosM);
      end;
    inherited;
//  OutputDebugString(PWideChar(IntToStr(mPos) + ' / ' + IntToStr(mPosM) + ' -> ' + IntToStr(Msg.Pos)));
  end;

  procedure TRichEdit.WMMouseWheel(var Msg: TWMMouseWheel);
  var
    mPos : Integer;
    mPosM: Integer;
  begin
    if (Msg.Keys = 1) then
      Msg.Keys := 0; //: Zoom-Bug der Logitec MX Master 3 unterdrücken
      mPos := Msg.WheelDelta;
    mPosM := (mPos mod 14);
    if (mPosM > 0) then
      begin
        Msg.WheelDelta := (mPos - mPosM);
      end;
    inherited;
//  OutputDebugString(PWideChar(IntToStr(mPos) + ' / ' + IntToStr(mPosM) + ' -> ' + IntToStr(Msg.WheelDelta)));
  end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 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