请问如何使用FindDialog查找ListView里的内容啊?

cathaya8 2009-06-16 02:05:42
本来用的一个Edit和一个Button实现查找,但是不知道怎么做“查找下一个”这种,于是想到了FindDialog,不过本人初学,没用过FindDialog,请教各位大大如何用FindDialog来实现查找呢?
如何使ListView定位到查找到的行呢?
...全文
261 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
志山之家 2011-04-04
  • 打赏
  • 举报
回复
看一下,如何更好
cathaya8 2009-06-18
  • 打赏
  • 举报
回复
已完美解决,感谢各位大大~~
ccrun.com 2009-06-17
  • 打赏
  • 举报
回复
TListView的Focused方法,只是判断Listview是否拥有焦点,返回值是一个bool值,其功能并不是使Listview获得焦点.
模拟鼠标点击更是下下策,使用LVM_SETITEMSTATE消息或ListView_SetItemState才是王道.

以下代码使ListView获得焦点,并使第三行Item为选中状态:
    ListView_SetItemState(ListView1->Handle, 2, LVIS_SELECTED, LVIS_SELECTED);
::SetFocus(ListView1->Handle);


验证的效果才是真正的力量!
ccrun.com 2009-06-17
  • 打赏
  • 举报
回复
默认情况下蓝色高亮必须是ListView处于焦点状态才显示.
fairchild811 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cathaya8 的回复:]
引用 15 楼 ccrun 的回复:
默认情况下蓝色高亮必须是ListView处于焦点状态才显示.

那我在写了ListView1->Focused()了,应该ListView已经处于焦点状态了啊?为什么还是不对呢?
[/Quote]

这个focused是不管用的
cathaya8 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ccrun 的回复:]
默认情况下蓝色高亮必须是ListView处于焦点状态才显示.
[/Quote]
那我在写了ListView1->Focused()了,应该ListView已经处于焦点状态了啊?为什么还是不对呢?
fairchild811 2009-06-16
  • 打赏
  • 举报
回复
先获得选中的坐标,然后MOUSE_EVENT或者SendInput都可以吧
cathaya8 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fairchild811 的回复:]
至于蓝色高亮的话可以试试模拟鼠标点击或者自画
[/Quote]
模拟鼠标点击?听起来很神奇...
请问要怎么实现呢?
自画这方法我大概倒是明白了~
fairchild811 2009-06-16
  • 打赏
  • 举报
回复
至于蓝色高亮的话可以试试模拟鼠标点击或者自画
fairchild811 2009-06-16
  • 打赏
  • 举报
回复
TListView的HideSelection属性设置为true; 错了,是设置为false

但是好像不能和鼠标点击一样是蓝色高亮,是灰色的高亮
fairchild811 2009-06-16
  • 打赏
  • 举报
回复
TListView的HideSelection属性设置为true;

然后在button的onclick内添加

TListItem* Item = ListView1->FindCaption(0,Edit1->Text,true,true,true); // 搜索和Edit的Text相同的单元。只能查找第一列,也就是item,不包括subitem

if (Item != NULL)
{
Item->MakeVisible(false); // 如果找到的不在屏幕内,滚动的那一行
Item->Focused = true;
Item->Selected = true;
}
cathaya8 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ccrun 的回复:]
引用 7 楼 cathaya8 的回复:
感谢妖哥。再请问如何能使listview自动滚动到我查到的这列呢?


在两个ListView1->Selected = ListView1->Items->Item[i];的后面分别加一句:

C/C++ codeListView_EnsureVisible(ListView1->Handle, i, true);
[/Quote]
很强大~感谢,想再问一下,为什么ListView那一行已经select了但是没有像鼠标选到某一行一样高亮显示呢?
本来我以为是ListView没有焦点,但是我尝试加上ListView1->Focused()也没有效果~~~
ccrun.com 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cathaya8 的回复:]
感谢妖哥。再请问如何能使listview自动滚动到我查到的这列呢?[/Quote]

在两个ListView1->Selected = ListView1->Items->Item[i];的后面分别加一句:
ListView_EnsureVisible(ListView1->Handle, i, true);
cathaya8 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ccrun 的回复:]
以下是我写的一个用结合FindDialog和ListView查找的简单例子, 已测试通过(CB6 + Vista):

C/C++ code//---------------------------------------------------------------------------

void __fastcall TfrmTest::Button2Click(TObject *Sender)
{
FindDialog1->FindText = Edit1->Text;
FindDialog1->Execute();
}
//---------------------------------------------------------------------------
void __…
[/Quote]

感谢妖哥。再请问如何能使listview自动滚动到我查到的这列呢?
yangangs 2009-06-16
  • 打赏
  • 举报
回复
学习了
宝龙哥 2009-06-16
  • 打赏
  • 举报
回复
查找下一个和FindDialog没有什么直接关系,代码要自己写,可以先用一个按钮和edit实现,之后放到FindDialog里面
ccrun.com 2009-06-16
  • 打赏
  • 举报
回复
以下是我写的一个用结合FindDialog和ListView查找的简单例子, 已测试通过(CB6 + Vista):
//---------------------------------------------------------------------------

void __fastcall TfrmTest::Button2Click(TObject *Sender)
{
FindDialog1->FindText = Edit1->Text;
FindDialog1->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TfrmTest::FindDialog1Find(TObject *Sender)
{
int nRow(-1), nCol(-1);
bool bFound(false);

for (int i = 0; i < ListView1->Items->Count; i++)
{
if (ListView1->Items->Item[i]->Caption != FindDialog1->FindText)
{
for (int j = 0; j < ListView1->Items->Item[i]->SubItems->Count; j++)
{
if (ListView1->Items->Item[i]->SubItems->Strings[j] == FindDialog1->FindText)
{
// 如果在某一行的Caption符合查找内容,就记录该行和列的索引
bFound = true;
nRow = i;
nCol = j + 1;

ListView1->Selected = ListView1->Items->Item[i];
}
}
if (bFound)
break;
}
else
{
// 如果在某一行的Caption符合查找内容,就记录该行和列的索引
bFound = true;
nRow = i;
nCol = 0;

ListView1->Selected = ListView1->Items->Item[i];

break;
}
}

if (bFound)
ShowMessage(String().sprintf("找到了! 位置在第%d行第%d列", nRow + 1, nCol + 1));
else
ShowMessage("没找到");
}
ccrun.com 2009-06-16
  • 打赏
  • 举报
回复
汗,这是什么跟什么呢.
ListView的查找,只需遍历每个Item,从Caption再到SubItem的Strings,依次遍历,看有没有符合查找的内容.
这个和RichEdit,Memo的查找是完全不同的两个概念.
我不懂电脑 2009-06-16
  • 打赏
  • 举报
回复
BCB6本身就带了这个控件的使用例子。
肆水東澤 2009-06-16
  • 打赏
  • 举报
回复
我这有个TFindDialog和TReplaceDialog的例子,你可以参考下
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 设置要查找的字符串为选中的字符串
FindDialog1->FindText = RichEdit1->SelText;
FindDialog1->Execute();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{
int start,end,pos;
//如果RichEdit上有被选中的字符串,就将起始位置设在被选中的字符串之后
if(RichEdit1->SelLength)
start=RichEdit1->SelStart + RichEdit1->SelLength;
else
start=0;
//终止位置设为RichEdit内容的末尾
end = RichEdit1->Text.Length()-start;

//调用RichEdit的FindText方法查找字符串,返回-1表示找不到,否则表示找到了;
pos = RichEdit1->FindText( FindDialog1->FindText,
start,end,
TSearchTypes()<<stMatchCase);
// ShowMessage(pos);
if(pos!=-1)//找到则把RichEdit上被查找的字符串选中;
{
RichEdit1->SetFocus();
RichEdit1->SelStart=pos;
RichEdit1->SelLength=FindDialog1->FindText.Length();
}
else
ShowMessage("没有找到");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ReplaceDialog1->FindText = RichEdit1->SelText;
ReplaceDialog1->Execute();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)
{
if(ReplaceDialog1->Options.Contains(frReplaceAll))
{
RichEdit1->Text = StringReplace(RichEdit1->Text,
ReplaceDialog1->FindText,
ReplaceDialog1->ReplaceText,
TReplaceFlags() << rfReplaceAll );
return;
}

int pos=RichEdit1->Lines->Text.Pos(ReplaceDialog1->FindText);
if(pos>0)//如果找到,则把找到的字符串取代掉;
{
RichEdit1->SelStart = pos-1;
RichEdit1->SelLength = ReplaceDialog1->FindText.Length();
RichEdit1->SelText = ReplaceDialog1->ReplaceText;
}
else
ShowMessage("没有找到");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ReplaceDialog1Find(TObject *Sender)
{
FindDialog1->FindText = ReplaceDialog1->FindTextA;
this->FindDialog1Find(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RichEdit1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if( Key==70 && Shift.Contains(ssCtrl) )
FindDialog1->Execute();
}
//---------------------------------------------------------------------------

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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