TListView,读取行(列)

waterhill 2010-10-05 12:05:19
在vc环境下。
已获得一TListView类的句柄,想把其某行(列)的内容读取出来,应当如何实现啊?若能读出某行列焦点的数据则更好。具体步骤如下:

1) 获得句柄:HWND hwandTListView = FindWindowEx(hwndInboxList, NULL, "TListView", NULL);已成功;
2)获得hwandTListView 的长度,并读取某行(列):网上看了下代码,经过修改如下:
TListView ListView1 =(TListView)hwandTListView;//自己加的;error C2065: 'TListView' : undeclared identifier
int i;
For i:=0 to ListView1.Items.Count-1 Do
If ListView1.Items[i].Selected then //i=ListView1.Selected.index
begin
/读某行某列的操作:
Edit1.Text := listview1.Items[i].Caption; //读第i行第1列
Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列
Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列
//以次类推,可以用循环读出整列。
end;
//将焦点上移一行:
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移

问题如下:
查了下,TListView 是delphi的概念,但对delphi只是了解。在应用TListView 前应该导入一些头文件或类吧,具体应该是哪些啊?
或是可否转换成其他的List类型,然后再应用。现在只有这些思路,请高手指点,最好能写出关键代码,谢谢~

把所有的分都拿出来了啊~~~~,在线等~~~~
...全文
307 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2010-10-07
  • 打赏
  • 举报
回复
关注。。
亮剑_ 2010-10-06
  • 打赏
  • 举报
回复
查一下ListView API,特别是针对Item的消息,“(取消)选择”记得是有消息的
waterhill 2010-10-06
  • 打赏
  • 举报
回复
此外,单击选中某行后,应该如何取消该选中,以选中其他的行,应该如何设置lvitem?
waterhill 2010-10-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhaodog 的回复:]
CListCtrl 是vc的类,
你可以用FromHandle 从句柄来获取 CListCtrl*

static CWnd* PASCAL FromHandle(
HWND hWnd
);
CListCtrl 是CWnd的继承类,做一下向下类型转换ok
[/Quote]
非常感谢,现在已经实现了单击,但双击无法实现。代码如下:
LVITEM lvitem, *plvitem;
NMHDR nmhdr,*pnmhdr;

HANDLE hProcess;
DWORD PID;
WPARAM ListViewID = GetWindowLong(hwandTListView,GWL_ID);

// 获取窗口PID、打开进程
GetWindowThreadProcessId(hwandTListView, &PID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
if (!hProcess)
{
return;
}
else
{
DWORD dwOldProtect;
/***************************单击*********************************************/
// 申请内存空间
plvitem = (LVITEM*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
lvitem.state=LVIS_SELECTED|LVIS_FOCUSED|LVIS_ACTIVATING;
lvitem.stateMask=LVIS_SELECTED;

//设置进程属性,并写进程
VirtualProtectEx(hProcess, plvitem, sizeof(LVITEM), PAGE_READWRITE,&dwOldProtect);
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM),NULL);

//发送消息
::SendMessage(hwandTListView,LVM_SETITEMSTATE,(WPARAM)0,(LPARAM)plvitem);

/***************************双击*********************************************/
// 申请内存空间,双击
pnmhdr = (NMHDR*)VirtualAllocEx(hProcess,NULL,sizeof(NMHDR),MEM_COMMIT,PAGE_READWRITE);
nmhdr.code = NM_DBLCLK;
nmhdr.hwndFrom = hwandTListView;
nmhdr.idFrom = ListViewID;

//设置进程属性,并写进程
VirtualProtectEx(hProcess, pnmhdr, sizeof(NMHDR), PAGE_READWRITE,&dwOldProtect);
WriteProcessMemory(hProcess, pnmhdr, &nmhdr, sizeof(NMHDR), NULL);

//发送消息
::PostMessage(::GetParent(hwandTListView),WM_NOTIFY,(WPARAM)ListViewID,(LPARAM)pnmhdr);
/******************************************************************************/
// 释放内存空间
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);

注,调试双击时我把单击部分全部屏蔽了还是不行
zgplyl 2010-10-06
  • 打赏
  • 举报
回复
这个挺简单的。
zhaodog 2010-10-06
  • 打赏
  • 举报
回复
CListCtrl 是vc的类,
你可以用FromHandle 从句柄来获取 CListCtrl*

static CWnd* PASCAL FromHandle(
HWND hWnd
);
CListCtrl 是CWnd的继承类,做一下向下类型转换ok
waterhill 2010-10-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 waterhill 的回复:]
在vc环境下。
已获得一TListView类的句柄,想把其某行(列)的内容读取出来,应当如何实现啊?若能读出某行列焦点的数据则更好。具体步骤如下:

1) 获得句柄:HWND hwandTListView = FindWindowEx(hwndInboxList, NULL, "TListView", NULL);已成功;
2)获得hwandTListView 的长度,并读取某行(列):网……
[/Quote]

补充下:
主要想实现以下几步:
1)获得句柄:HWND hwandTListView = FindWindowEx(hwndInboxList, NULL, "TListView", NULL);已成功;
2)对应ListView表,自动选择某行(如第一行)
3)选中某行后,点击“阅读”按钮,可实现: ::SendMessage(hwndRead,BM_CLICK,0,0);
问题关键是第二步,网上查了下,有以下两中方法:

方法1:(经测试不可行)
::SendMessage(hSelectBox,LB_SETCURSEL,i,0); //单选
::SendMessage(hSelectBox,LB_SETSEL,1,i); //多选

方法2:(原帖说是可行)
//自动选中第一行m_UserList.SetItemState( 0,LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
m_UserList.EnsureVisible( 0,FALSE); LVIS_FOCUSED);
方法2中,m_UserList应该为CListCtrl类实例,但这个实例如何与句柄hwandTListView 关联起来?
若能解决了这步,基本就解决了,望高手帮助~

方法2原帖具体见:
http://topic.csdn.net/u/20091117/10/e9714ead-d9ec-4698-a489-d1a603db8201.html
waterhill 2010-10-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 coding_hello 的回复:]
GUI的不懂,帮顶~
[/Quote]
谢谢~~
waterhill 2010-10-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhaodog 的回复:]
不能把句柄转换成delphi的类的
可以对句柄发送消息LVM_GETITEMTEXT 来获得
[/Quote]
int iItem=SendMessage(hwandTListView,LVM_GETNEXTITEM,-1,LVNI_SELECTED);
if(iItem != -1) //找到句柄
SendMessage(hwandTListView, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);

是这样吗?此时plvitem得到的内容是什么?
可否给出具体的代码?
zhaodog 2010-10-05
  • 打赏
  • 举报
回复
不能把句柄转换成delphi的类的
可以对句柄发送消息LVM_GETITEMTEXT 来获得
野男孩 2010-10-05
  • 打赏
  • 举报
回复
GUI的不懂,帮顶~
waterhill 2010-10-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 waterhill 的回复:]
在vc环境下。
已获得一TListView类的句柄,想把其某行(列)的内容读取出来,应当如何实现啊?若能读出某行列焦点的数据则更好。具体步骤如下:

1) 获得句柄:HWND hwandTListView = FindWindowEx(hwndInboxList, NULL, "TListView", NULL);已成功;
2)获得hwandTListView 的长度,并读取某行(列):网……
[/Quote]
代码不见得对,大家不要拘泥于该代码,只要能实现功能就可以了。
没有解决办法童鞋们也可以帮顶下帖子啊,不甚感谢~~~
waterhill 2010-10-05
  • 打赏
  • 举报
回复
没人会吗,还是问题描述的不准确,请高手帮助啊~~~

5,388

社区成员

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

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