TRichEdit如何高亮显示某行全行?

daydayup234 2006-05-17 04:03:01
比如第二行
...全文
410 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
daydayup234 2006-05-19
  • 打赏
  • 举报
回复
^o^……
那么,
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
明白了,理解上的错误,但是这不怨我。是你说“高亮显示”误导我了。^o^……
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
但是这是一个过渡步骤,为的是从这一行的第一个字开始,到本行尾。
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
对!
daydayup234 2006-05-19
  • 打赏
  • 举报
回复
请教:
RichEdit1->Lines->Strings[i].Pos(RichEdit1->Lines->Strings[i].SubString(1,1));
好象永远=1
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
而你说的是“高亮显示”,在RichEdit中的“高亮显示”就是HideSelection属性,而与该属性相关的就是FindText。既然如此,我就是通过确定你要高亮显示的行的内容实现这一结果的。不对吗?
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
我这个可以解决的。
if (i == 2)//上面程序段的第4行,你可以通过ComboBox获得真个RichEdit的行数,之后-1就是索引号,将上面的改为if (i == ComboBox1->ItemIndex)即可确定选中行,进行全部选中了。
daydayup234 2006-05-19
  • 打赏
  • 举报
回复
如果有兴趣看看
daydayup234 2006-05-19
  • 打赏
  • 举报
回复
我不是要 查找
我是要定位某个“整”行

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString InputString = InputBox("Input Box", "Prompt", "Default string");
int theLine=InputString.ToIntDef(1);
//theLine是选定的行
RichEdit1->SelStart=?//问
RichEdit1->SelLength=?//问
RichEdit1->SetFocus();
}
不考虑容错
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
之后
ShowMessage(AnsiString("Start:" + IntToStr(RichEdit1->SelStart) + "\n" +
"Length:" + IntToStr(RichEdit1->SelLength)));
可以显示出来。
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
援引:

我不是要 查找
我是要定位某个“整”行

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString InputString = InputBox("Input Box", "Prompt", "Default string");
int theLine=InputString.ToIntDef(1);
//theLine是选定的行
RichEdit1->SelStart=?//问
RichEdit1->SelLength=?//问
RichEdit1->SetFocus();
}
不考虑容错
=============================================================================
说明:

如果君就想得到SelStart和SelLength的话,上面的代码改为:
int st,sl,t = 0;
for (int i = 0;i < RichEdit1->Lines->Count;i ++)
{
st = t;
sl = RichEdit1->Lines->Strings[i].Length() + 1;
t = t + sl + 1;
if (i == Edit1->Text.Trim().ToInt() - 1)
{
RichEdit1->SelStart = st;
RichEdit1->SelLength = RichEdit1->Lines->Strings[i].Length();
}
}
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
谢谢,我还差者远呢……

改过了,你看看是不是吧,如果还不是,那我就太笨了。(下面代码的缺陷是:当你输入的内容超出一行时,RichEdit将自动折行。而此时,如果在Edit中指定该新行号的话,将选择不完整。估计这是和折行有关。除此之外,凭我的感觉,应当是完全符合您的需求的。)

int st,sl,t = 0;
for (int i = 0;i < RichEdit1->Lines->Count;i ++)
{
st = t; //开始位置随着行数增加而增加
sl = RichEdit1->Lines->Strings[i].Length() + 1; //长度
t = t + sl + 1; //获得经过文本的总长度
if (i == Edit1->Text.Trim().ToInt() - 1) //比如Edit输入的是RichEdit的真实的行号,而非行的索引号
{
RichEdit1->HideSelection = false;
RichEdit1->SetFocus();
RichEdit1->SelStart = st;
RichEdit1->SelLength = RichEdit1->Lines->Strings[i].Length();
}
}
daydayup234 2006-05-19
  • 打赏
  • 举报
回复
再谢谢 深蓝
祝愿你早日升星
BlueDeepOcean 2006-05-19
  • 打赏
  • 举报
回复
我就解决看看呗。
BlueDeepOcean 2006-05-18
  • 打赏
  • 举报
回复
上面的那个的确有些缺陷,昨天我也发现了。今天修改了。你看看吧,怎样都能选中。

int st,sl,FindAt,w = 0;
for (int i = 0;i < RichEdit1->Lines->Count;i ++)
{
if (i == 2)
{
for (int j = 0;j < i;j ++)
w = w + RichEdit1->Lines->Strings[j].Length();
st = w + RichEdit1->Lines->Strings[i].Pos(RichEdit1->Lines->Strings[i].SubString(1,1));
StatusBar1->Panels->Items[0]->Text = IntToStr(st);
sl = w + RichEdit1->Lines->Strings[i].Length();
StatusBar1->Panels->Items[1]->Text = IntToStr(sl);
StatusBar1->Panels->Items[2]->Text = RichEdit1->Lines->Strings[i].SubString(1,1);
StatusBar1->Panels->Items[3]->Text = RichEdit1->Lines->Strings[i];
FindAt = RichEdit1->FindTextA(RichEdit1->Lines->Strings[i],st,sl,TSearchTypes() << stMatchCase);
if (FindAt + 1 != 0)
{
RichEdit1->HideSelection = false;
RichEdit1->SetFocus();
RichEdit1->SelStart = FindAt;
RichEdit1->SelLength = RichEdit1->Lines->Strings[i].Length();
StatusBar1->Panels->Items[4]->Text = "Found!";
}
else
{
StatusBar1->Panels->Items[4]->Text = "Bad!";
break;
}
}
}
daydayup234 2006-05-17
  • 打赏
  • 举报
回复
谢谢
你往RichEdit放几个汉字,tab之类试过没
BlueDeepOcean 2006-05-17
  • 打赏
  • 举报
回复
比如说有5行,分别为RichEdit1,RichEidt2,RichEdit3,RichEdit4和RichEdit5;
代码如下:


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
RichEdit1->HideSelection = false;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormActivate(TObject *Sender)
{
int FoundAt;
int st,ed,mm;
st = RichEdit1->Lines->Strings[1].Pos(RichEdit1->Lines->Strings[1].SubString(1,RichEdit1->Lines->Strings[1].Length()));
ed = RichEdit1->Lines->Strings[1].Length();
mm = st + ed;
for (int i = 0;i < RichEdit1->Lines->Count;i ++)
if (i == 1)
{
FoundAt = RichEdit1->FindTextA(RichEdit1->Lines->Strings[i],mm + 1,ed,TSearchTypes()<< stWholeWord); // 此处的mm+1是由于RichEidt每一行后面会自动添加一个空格
if (FoundAt != -1)
{
RichEdit1->SetFocus();
RichEdit1->SelStart = FoundAt;
RichEdit1->SelLength = RichEdit1->Lines->Strings[i].Length();
}
}
}
//---------------------------------------------------------------------------

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧