此菜单按键是一行一行改变RICHEDIT中字体的颜色和背景色的。
原先我只改变字体颜色时用了REFile.SelAttributes.Color来做,那时快捷键还是有效的。
但再要改变背景色时我采用了“S.F.(吃青春饭的) ”的代码(通过发送消息),快捷键就不能改变任何颜色,但直接按菜单按键却又可以。
代码如下:
uses
UAbout,UFileName,richedit;procedure TFMainC.ColorChange(k:integer;FontColor,BackColor:TColor);
var
Start,Startback,j:integer;
Fmt :TCharFormat2;
begin
Startback:=REFile.SelStart;
Start:=0;
for j:=0 to REFile.Lines.Count-1 do
begin
if j=k then
begin
REFile.SelStart:=Start;
REFile.SelLength:=Length(REFile.Lines.Strings[j]);
Fmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2
Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效
Fmt.crTextColor:= FontColor;//设置字体颜色
Fmt.crBackColor:= BackColor;//设置字体背景色
REFile.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt));//发EM_SETCHARFORMAT消息给RichEdit,表示只有选择部分加背景颜色
REFile.SelLength:=0;
break;
end;
Start:=Start+Length(REFile.Lines.Strings[j])+2;
end;
REFile.SelStart:=Startback;
end;procedure TFMainC.Broswer1;
begin
while REFile.Lines.Strings[i]='' do
i:=i+1;
ColorChange(last,clBlack,clWhite);
ColorChange(i,clRed,clBlue);
last:=i; i:=i+1;
if i=REFile.Lines.Count then
begin
i:=0;
FFileName.MDialog.Caption:='提示';
FFileName.MDialog.Text:='全文扫描完毕!';
end;
end;procedure TFMainC.NBroswer1Click(Sender: TObject);
begin
NBroswer1.Checked:=true;
Broswer1;
end;
大虾帮忙!
原先我只改变字体颜色时用了REFile.SelAttributes.Color来做,那时快捷键还是有效的。
但再要改变背景色时我采用了“S.F.(吃青春饭的) ”的代码(通过发送消息),快捷键就不能改变任何颜色,但直接按菜单按键却又可以。
代码如下:
uses
UAbout,UFileName,richedit;procedure TFMainC.ColorChange(k:integer;FontColor,BackColor:TColor);
var
Start,Startback,j:integer;
Fmt :TCharFormat2;
begin
Startback:=REFile.SelStart;
Start:=0;
for j:=0 to REFile.Lines.Count-1 do
begin
if j=k then
begin
REFile.SelStart:=Start;
REFile.SelLength:=Length(REFile.Lines.Strings[j]);
Fmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2
Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效
Fmt.crTextColor:= FontColor;//设置字体颜色
Fmt.crBackColor:= BackColor;//设置字体背景色
REFile.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt));//发EM_SETCHARFORMAT消息给RichEdit,表示只有选择部分加背景颜色
REFile.SelLength:=0;
break;
end;
Start:=Start+Length(REFile.Lines.Strings[j])+2;
end;
REFile.SelStart:=Startback;
end;procedure TFMainC.Broswer1;
begin
while REFile.Lines.Strings[i]='' do
i:=i+1;
ColorChange(last,clBlack,clWhite);
ColorChange(i,clRed,clBlue);
last:=i; i:=i+1;
if i=REFile.Lines.Count then
begin
i:=0;
FFileName.MDialog.Caption:='提示';
FFileName.MDialog.Text:='全文扫描完毕!';
end;
end;procedure TFMainC.NBroswer1Click(Sender: TObject);
begin
NBroswer1.Checked:=true;
Broswer1;
end;
大虾帮忙!
解决方案 »
- 咨询两个控件的来源
- 要做短信增值服务的用delphi的哪个方面都,有什么好书吗
- 请问一个关于SpeedButton和ImageList的问题
- 还是那个限制输入数字的问题!
- 用dataset.Locate()在一个表中查询,可是查询结果却不正确,请高手帮忙!!!!!!
- fastreport大问题,请教怎么对fasteport里面的报表组件进行遍历!
- 各位帮忙看看我的存储过程定义那里有错!
- 一个DELPHI的难题,请各位帮忙解决,我将万分感谢!!!
- 一天一夜了这个问题我仍然没有解决...
- 如何在一个query的查询中同时获得查到的记录数啊?
- 如何实现批量打印?
- access数据库的写入...高手请进...
怎么用了EM_SETCHARFORMAT消息就跟快捷键有冲突呢?
refile.SetFocus; //聚焦
另外,关于不同大小的字体导致行的计算不准确的问题;你可以修改代码为这样
procedure TForm1.ChangeLineColor(row:integer;FontColor,BackColor:TColor);var
Start,Startback,j:integer;
Fmt :TCharFormat2;
begin
REFile.WordWrap :=false; //让组件自动换行机制停止掉
Startback:=REFile.SelStart;
Start:=0;
for j:=0 to REFile.Lines.Count-1 do
begin
if j=row then
begin
REFile.SelStart:=Start;
REFile.SelLength:=Length(REFile.Lines.Strings[j]);
Fmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2
Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效
Fmt.crTextColor:= FontColor;//设置字体颜色
Fmt.crBackColor:= BackColor;//设置字体背景色
REFile.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt));//发EM_SETCHARFORMAT消息给RichEdit,表示只有选择部分加背景颜色
REFile.SelLength:=0;
break;
end;
Start:=Start+Length(REFile.Lines.Strings[j])+2;
end;
REFile.SelStart:=Startback;
REFile.WordWrap :=true; //重新启动自动换行
end;
//改变RICHEDIT其中一行字体颜色
procedure TFMainC.ColorChange(k:integer;FontColor,BackColor:TColor);
var
Start,Startback,j:integer;
//Fmt :TCharFormat2;
begin
Startback:=REFile.SelStart;
Start:=0;
for j:=0 to REFile.Lines.Count-1 do
begin
if j=k then
begin
REFile.SelStart:=Start;
REFile.SelLength:=Length(REFile.Lines.Strings[j]);
{Fmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2
Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效
Fmt.crTextColor:= FontColor;//设置字体颜色
Fmt.crBackColor:= BackColor;//设置字体背景色
REFile.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt)); //发EM_SETCHARFORMAT消息给RichEdit,表示只有选择部分加背景颜色}
REFile.SelAttributes.Color:=FontColor;
REFile.SelLength:=0;
break;
end;
Start:=Start+Length(REFile.Lines.Strings[j])+2;
end;
REFile.SelStart:=Startback;
end;//逐行扫描时改变颜色
procedure TFMainC.Broswer1;
//var
//vScrollInfo: TScrollInfo;
begin
while REFile.Lines.Strings[i]='' do
i:=i+1;
ColorChange(last,clBlack,clWhite);
ColorChange(i,clRed,clBlue);
last:=i;
//滚动条下移
if i>10 then
begin
//两种发送消息的方法都行。
{vScrollInfo.cbSize := SizeOf(vScrollInfo);
vScrollInfo.fMask := SIF_POS;
GetScrollInfo(REFile.Handle, SB_VERT, vScrollInfo);
REFile.Perform(WM_VSCROLL,
MakeLong(SB_THUMBPOSITION,vScrollInfo.nPos+Abs(REFile.Font.Height)),0);} SendMessage(REFile.Handle,EM_SCROLL,SB_LINEDOWN,0); end; i:=i+1;
if i=REFile.Lines.Count then
begin
i:=0;
FFileName.MDialog.Caption:='提示';
FFileName.MDialog.Text:='全文扫描完毕!';
FFileName.MDialog.ShowModal;
end;
end;
procedure TFMainC.NBroswer1Click(Sender: TObject);
begin
NBroswer1.Checked:=true;
Broswer1;
end;
我的字体大小一样的,你加上那两句有什么用呢?不自动换行,对RICHEDIT有什么影响吗?