让反选隐藏的方法!(200分)

  • 主题发起人 主题发起人 luanym
  • 开始时间 开始时间
L

luanym

Unregistered / Unconfirmed
GUEST, unregistred user!
在RICHEDIT里, 能否让反选的字符,不反色显示!
 
>>反选的字符,不反色显示
再解释一下是什么意思
 
你好:Fyx,就是我们在richedit 中选中一些字符,
但选中的字符仍按原来的方式显示,没有变化!
 
怎么能看出被选的部分
 
你是不是用SelStart和SelLength选的?
那就再加一句PostMessage(RichEdit1.Handle, WM_SETFOUS, 0, 0);
或者更简单地,把RichEdit的HideSelection设为False试试。
因为你可能是在别的控件事件里选的(如Button的OnClick),那样RichEdit没有获得焦点。
 
RichEdit有个SelAttributes属性,你可以通过它来设置选择内容的属性,如颜色等
 
看来,你是想对TRichEdit中的部分字符改变其显示,但改变过程中出现了很明显的
选择现象了。其实根本没必要屏蔽选择颜色,如果你真的屏蔽了,一旦用户真的要
选择字符怎么办,一个解决办法是暂时屏蔽RichEdit的重画,程序如下:

with RichEdit1 do begin
Lines.BeginUpdate;
try
SelStart := ...;
SelLenght := ...;
with SetAttributes do begin
Color := ...;
Style := ...;
end;
finally
Lines.EndUpdate;
end;
end;
 
就是在关键字变色中,查找关键字时,由于关键字过多,屏幕有闪动!如何解决!
 
看我上面的解答。通过Lines.BeginUpdate和Lines.EndUpdate应该不会闪烁。
 
agree with JohnsonGuo
 
RichEdit.HideSelection:=True;
 
To hamsoft:
RichEdit.HideSelection是指当RichEdit失去输入焦点的时候,是否隐藏选择而已。
与本问题无关。
 
to::JohnsonGuo
procedure TForm1.RichEdit1Change(Sender: TObject);
var
temp: integer;
begin
with richEdit1 do
begin
lines.BeginUpdate; // ?here

temp := selstart;
selstart := 0;
selLength := temp;
selAttributes.color := clBlack;
selStart:= temp;
selLength := 0;

lines.EndUpdate; // ?here will have a dead loop
// can you have method to the problem?
end;
end;
 
出现死循环,是由于
SelAttributes.Color := ..;
改变了RichEdit。当运行到
Lines.EndUpdate;
的时候,开始更新RichEdit,从而发现上面的改变,于是重新激发OnChange事件,
形成死循环。
解决方法是设置标志使OnChange不会重复激发。
如:

procedure TForm1.RichEdit1Change(Sender: TObject);
var
Temp: Integer;
begin
with RichEdit1 do
if Tag = 0 then begin
Tag := 1;
Lines.BeginUpdate;
try
Temp := SelStart;
SelStart := 0;
SelLength := temp;
SelAttributes.Color := clRed;
SelLength := 0;
SelStart:= Temp;
finally
Lines.EndUpdate;
Tag := 0;
end;
end;
end;
 
to:JohnsonGuo
You method is OK! thanks very much!
another problem: there still have some blink on the RichEdit control when I
press some key. can you have some method? but this time I have no fen to you.
 
我也发现这个问题,我尝试设置RictEdit1.DoubleBuffered := True
但可惜失败。
 
后退
顶部