AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi RichEdit: Mitscrollen bei Änderung verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

RichEdit: Mitscrollen bei Änderung verhindern

Ein Thema von Helmi · begonnen am 1. Mai 2009 · letzter Beitrag vom 1. Mai 2009
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#1

RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 16:49
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.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#2

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 18:05
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;
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#3

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 18:25
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.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 18:40
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#5

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 18:49
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#6

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 19:02
Hmmm, seltsam, bei mir funktioniert mein Code zufriedenstellend. Auf welche Art und Weise setzt du denn die Zeichenfarbe?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#7

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 19:11
Zitat von taaktaak:
Hmmm, seltsam, bei mir funktioniert mein Code zufriedenstellend. Auf welche Art und Weise setzt du denn die Zeichenfarbe?
SelAttributes.Color
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#8

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 19:24
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#9

Re: RichEdit: Mitscrollen bei Änderung verhindern

  Alt 1. Mai 2009, 19:32
ich setz aber nicht nur eine Farbe, sondern ich ersetze auch Wörter durch andere.
Und dabei passiert es auch
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  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 15:15 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