![]() |
RichEdit: Mitscrollen bei Änderung verhindern
Hallo,
ich bräuchte mal einen Tip. Ich habe ein RichEdit, dass ich mittels einem Code durchlaufe und bestimmte Wörter z. B. farbig darstellen lasse. Das funktioniert auch bestens - nur sieht man leider währenddessen, dass sich das RichEdit mitscrollt und man die markierten Wörter kurzzeitig sieht. Ich habe in der Procedure, die das erledigt, am Anfang ein "RichEdit.Lines.BeginUpdate" und ein RichEdit.Lines.EndUpdate" drin. Nur bringen diese zwei Anweisungen nicht den gewünschten Erfolg. Wie könnt ich verhindern, dass ich die Änderungen im RichEdit trotzdem sehe? Ich hätt mir das so vorgestellt, dass ich nur das Endergebnis im RichEdit sehe und nicht die Arbeitsschritte zwischendurch. |
Re: RichEdit: Mitscrollen bei Änderung verhindern
Das sollte helfen:
Delphi-Quellcode:
uses Windows,ComCtrls,Messages
var FUpdatingCounter : Integer; FOldEventMask : LongInt; procedure BeginUpdate(RE:TRichedit); begin inc(FUpdatingCounter); // handle nested calls if FUpdatingCounter=1 then begin // lock FOldEventMask:=SendMessage(RE.Handle,EM_SETEVENTMASK,0,0); // raising events and SendMessage(RE.Handle,WM_SETREDRAW,0,0) // redrawing itself end end; procedure EndUpdate(RE:TRichedit); begin dec(FUpdatingCounter); // handle nested calls if FUpdatingCounter=0 then begin // unlock SendMessage(RE.Handle,WM_SETREDRAW,1,0); // redrawing itself SendMessage(RE.Handle,EM_SETEVENTMASK,0,FOldEventMask ) // and raising events end end; |
Re: RichEdit: Mitscrollen bei Änderung verhindern
Hallo,
danke für den Code - nur leider hat sich nichts verändert. Es wird weiterhin gescrollt und man sieht auch noch die markierten Stellen. |
Re: RichEdit: Mitscrollen bei Änderung verhindern
Zitat:
und die soll niemand sehen. Warum dann markieren? Du könntest Dir eine Kopie des Richedit Textes anlegen diese Kopie bearbeiten und am Ende wieder in das Richedit zurückkopieren. Grüße Klaus |
Re: RichEdit: Mitscrollen bei Änderung verhindern
Zitat:
das ganze mit vielen Wörtern, das dauert und flattert |
Re: RichEdit: Mitscrollen bei Änderung verhindern
Hmmm, seltsam, bei mir funktioniert mein Code zufriedenstellend. Auf welche Art und Weise setzt du denn die Zeichenfarbe?
|
Re: RichEdit: Mitscrollen bei Änderung verhindern
Zitat:
|
Re: RichEdit: Mitscrollen bei Änderung verhindern
Hmm, dann versuche es vielleicht mal hiermit:
Delphi-Quellcode:
SetTextColor() ist die für dich entscheidende Methode, die übrigen werden nur intern verwendet.procedure TreBase.InitCF2(var CF2:TCharFormat2;Mask:DWord); begin FillChar(CF2,SizeOf(CF2),0); CF2.cbSize:=SizeOf(CF2); CF2.dwMask:=Mask end; function TreBase.GetVerScrollbarPos(RE:TRichEdit):Integer; begin Result:=GetScrollPos(RE.Handle,SB_Vert); end; procedure TreBase.SetVerScrollbarPos(RE:TRichEdit;Position:Integer); begin SetScrollPos(RE.Handle,SB_Vert,Position,true); RE.Perform(WM_VScroll,Position shl 16+SB_ThumbTrack,0) end; procedure TreBase.SetCharFormat(RE:TRichEdit;var CF2:TCharFormat2;Start,Length:Integer); var OrgRange,SelRange : TCharRange; TmpPos : Integer; begin TmpPos:=GetVerScrollbarPos(RE); // setcharformat modifies topline ?!?! SelRange.cpMin:=Start; SelRange.cpMax:=Start+Length; SendMessage(RE.Handle,EM_ExGetSel,0,LParam(@OrgRange)); SendMessage(RE.Handle,EM_ExSetSel,0,LParam(@SelRange)); SendMessage(RE.Handle,EM_SetCharFormat,SCF_Selection,LParam(@CF2)); SendMessage(RE.Handle,EM_ExSetSel,0,LParam(@OrgRange)); SetVerScrollbarPos(RE,TmpPos) // so we have to restore topline and scrollbar end; procedure TreBase.SetTextColor(RE:TRichEdit;Start,Length:Integer;Color:TColor); var CF2 : TCharFormat2; begin InitCF2(CF2,CFM_Color); CF2.crTextColor:=Color; SetCharFormat(RE,CF2,Start,Length) end; |
Re: RichEdit: Mitscrollen bei Änderung verhindern
ich setz aber nicht nur eine Farbe, sondern ich ersetze auch Wörter durch andere.
Und dabei passiert es auch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 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