listView中如何知道我点中那一列?如何取得点中单元的内容?(100分)

  • 主题发起人 主题发起人 mhhaifeng
  • 开始时间 开始时间
M

mhhaifeng

Unregistered / Unconfirmed
GUEST, unregistred user!
listView中如何知道我点中那一列?如何取得点中单元的内容?
看了下帮助, listView report 风格中,并没能找到像DBGrid那样能轻易
知道当前选中了那一行那一列的功能。无法, 只好企图利用MouseDown事件来取得
列如, 再与DBClick结合来达到要求。 可是MouseDown事件有个问题, 就是当列数
较多而出现滚动条时, 我得到的列号就是错误的了。
我想实现的功能是,双击单元格, 便能知道当前选中的单元格内容,知道选中那第几列?
请各位大大帮个忙,无论用什么方法,帮小弟实现功能好吗?
感激不尽, 高分相送

以下是我利用MouseDown得到列数的代码:

procedure TMainForm.ListView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
intTotal:integer;
intI:integer;
begin
intTotal:=0;
for intI:=0 to ListView1.Columns.count-1 do begin
intTotal:=intTotal+ListView1.Columns.Items[intI].Width;
if x<intTotal then begin
intCoumn:=IntI; //得到列号
//break;
exit;
end;
end;

end;
procedure TMainForm.ListView1DblClick(Sender: TObject);
var
intRow:integer;
begin
intRow:=TreeView1.Selected.index; //得到行号
//intCoumn 是全局变量 于是也知道了列号
TreeView1.Items.Item[intRow].SubItems[intCoumn-1];
//得到选中的单元内容

end;

 
没看懂,是listview 还是treeview?
 
listview不能选中一列(column),只能选中一行(row)
如果不允许多选,则listview1.ItemIndex即是选中的行号。
如果允许多选,listview1.itemfocused是当前有焦点的ListItem
也可以用循环根据listview1.Items.Selected判断是否选中
 
是listview 还是treeview?
当然是listView啦
listview不能选中一列(column),只能选中一行(row)
这正是我头痛的问题所在!
我现在就是要解决这个问题呀
有什么变通的方法吗

 
在OnMouseDown事件中写下:
GetItemAt(x,y).
 
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
p:tpoint;
iRow,iRowHeight,Ytmp:integer;
iSubLeft,iSubRight,iCol:integer;
begin
//iRow是得到的行,iCol是得到的列
iRow:=listview1.TopItem.Index;
//iRowHeihgt是行的高度,跟Font,ImageList等有关,你可能要修改IRowHeight的赋值
iRowHeight:=abs(listview1.Font.Height)+2;
yTmp:=Y-listview1.TopItem.Position.Y;
while yTmp > 0 do
begin
yTmp:=yTmp - iRowHeight;
if yTmp > 0 then irow:=iRow + 1;
end;
////如果listview1.rowselect= true;则可以直接用iRow:= listview1.ItemIndex就可以了.

if (iRow >= 0) and (iRow < listview1.Items.Count) then
begin
p:=listview1.Items[iRow].Position;
if listview1.Checkboxes then
isubleft:=p.X - 18
else
iSubLeft:=p.X;
iSubRight:=listview1.Columns[0].Width+isubleft;
iCol := 0;
while (iCol < listview1.Columns.Count-1) and ((x < iSubleft) or (x > iSubright)) do
begin
icol:=icol+1;
iSubleft:=iSubright;
isubright:=isubright + listview1.Columns[icol].Width;
end;
if (x < iSubleft) or (x > iSubright) then
showmessage('没找到位置,可能在滚动条上')
else
showmessage('你选的是第'+inttostr(iRow+1)+'行,第'+inttostr(iCol+1)+'列');
end;
end;
 
方法有点繁
有没有好的点子
 
建议换string grid
 
没有好办法,只能判断鼠标的位置
 
接受答案了.
 

Similar threads

D
回复
0
查看
885
DelphiTeacher的专栏
D
D
回复
0
查看
948
DelphiTeacher的专栏
D
D
回复
0
查看
963
DelphiTeacher的专栏
D
D
回复
0
查看
791
DelphiTeacher的专栏
D
后退
顶部