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: Mitscrollen bei Änderung verhindern (https://www.delphipraxis.net/133416-richedit-mitscrollen-bei-aenderung-verhindern.html)

Helmi 1. Mai 2009 15:49


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.

taaktaak 1. Mai 2009 17:05

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;

Helmi 1. Mai 2009 17:25

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.

Klaus01 1. Mai 2009 17:40

Re: RichEdit: Mitscrollen bei Änderung verhindern
 
Zitat:

Zitat von Helmi
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.

...
Wie könnt ich verhindern, dass ich die Änderungen im RichEdit trotzdem sehe?

Ich verstehe Dein Problem nicht so ganz, die markierst bestimmte Worte
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

Helmi 1. Mai 2009 17:49

Re: RichEdit: Mitscrollen bei Änderung verhindern
 
Zitat:

Zitat von Klaus01
Ich verstehe Dein Problem nicht so ganz, die markierst bestimmte Worte
und die soll niemand sehen. Warum dann markieren?

Ich markiere bestimmte Wörter, mach sie z. B. farbig, oder ersetz sie gegen ein anderes Wort
das ganze mit vielen Wörtern, das dauert und flattert

taaktaak 1. Mai 2009 18:02

Re: RichEdit: Mitscrollen bei Änderung verhindern
 
Hmmm, seltsam, bei mir funktioniert mein Code zufriedenstellend. Auf welche Art und Weise setzt du denn die Zeichenfarbe?

Helmi 1. Mai 2009 18:11

Re: RichEdit: Mitscrollen bei Änderung verhindern
 
Zitat:

Zitat von taaktaak
Hmmm, seltsam, bei mir funktioniert mein Code zufriedenstellend. Auf welche Art und Weise setzt du denn die Zeichenfarbe?

SelAttributes.Color

taaktaak 1. Mai 2009 18:24

Re: RichEdit: Mitscrollen bei Änderung verhindern
 
Hmm, dann versuche es vielleicht mal hiermit:

Delphi-Quellcode:

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;
SetTextColor() ist die für dich entscheidende Methode, die übrigen werden nur intern verwendet.

Helmi 1. Mai 2009 18:32

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 06:24 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