AGB  ·  Datenschutz  ·  Impressum  







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

Richedit Zeilenweise scrollen die zweite

Ein Thema von Memnarch · begonnen am 7. Feb 2011 · letzter Beitrag vom 2. Apr 2020
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Richedit Zeilenweise scrollen die zweite

  Alt 7. Feb 2011, 14:21
Tag allerseits.
Hab mal nen altes projekt von mir ausgegraben(das Trichedit projekt ).

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
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#2

AW: Richedit Zeilenweise scrollen die zweite

  Alt 16. Feb 2011, 11:12
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Richedit Zeilenweise scrollen die zweite

  Alt 16. Feb 2011, 12:27
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

AW: Richedit Zeilenweise scrollen die zweite

  Alt 16. Feb 2011, 12:31
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 )

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
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#5

AW: Richedit Zeilenweise scrollen die zweite

  Alt 18. Feb 2011, 00:07
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
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#6

AW: Richedit Zeilenweise scrollen die zweite

  Alt 21. Feb 2011, 09:23
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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Richedit Zeilenweise scrollen die zweite

  Alt 31. Mär 2020, 23:00
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
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Richedit Zeilenweise scrollen die zweite

  Alt 2. Apr 2020, 14:42
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 2. Apr 2020 um 14:46 Uhr)
  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 07:25 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