■■ 如何通过鼠标位置获得ListView数据 如上图所示,当鼠标移动到某行与某列交汇区域时,窗口标题显示其内容,此图鼠标在B2处,那么窗口标题应该显示为:B2这个功能如何实现??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Delphi7+ListView procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);var vItem : TListItem;begin vItem := nil; vItem := ListView1.GetItemAt(x,y); if vItem<>nil then begin vItem.Caption; vItem.Data; end;end; 哥们,如果仅仅显示vItem.Caption,我就不发此帖了,问题的关键在于如何获得鼠标所在列 procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);var vItem : TListItem; str :string;begin vItem := nil; vItem := ListView1.GetItemAt(x,y); if vItem<>nil then begin str := vItem.Caption;//第一列 str := vItem.SubItems[0];//第二列 str := vItem.SubItems[1];//第三列... end;end; 首先需要判断ListView的显示模式是否为Report,如果是,再通过DisplayRect(drBounds)取得占位,再根据Columns的width计算出是哪一列。 ListView1.GetItemAt(x,y);不用判断显示模式 GetItemAt是不需要判断显示模式,但是如果要根据鼠标位置取得SubItem,如果不是Report模式的话是毫无意义的。 僵哥,我试了其它模式,只要你添加了subitem,任何模式都可以访问到 procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);var iRow, iCol, it : Integer; li : TListItem; sText : string;begin if(not(Sender is TListView))then Exit; sText := '(Empty)'; with TListView(Sender)do try if(ViewStyle <> vsReport)then begin sText := 'ViewStyle is not vsReport'; Exit; end; li := GetItemAt(5, Y); if(not Assigned(li))then Exit; iRow := Items.IndexOf(li); for iCol:=0 to Columns.Count-1 do begin it := Columns[iCol].Width; if(X<it)then Break; Dec(X, it); end; if(iCol<Columns.Count)then sText := Format('[%d, %d] %s', [iRow, iCol, li.Caption]); finally Caption := sText; end;end; 那就再测试一下有横向滚动条的时候是否会有什么问题。其实类似的问题,在一些支持SubItem编辑的ListView控件当中就已经有现成的东西了。 To Seamour,如果没错的话,估计还需要考虑一下Columns的排列顺序。 REPORT下也只僵哥的辦法了。 请问delphi中有没有这样一种控件 线程的稳定性 一个计算机电子书狂多的站点!!!(免费) (散分)项目计划管理,一直怎么都想不通。请明白的给解释,谢谢! 怎么样随机获取一种颜色? 有谁知道TControl的BiDiMode属性是如何使用的?谢谢! 有没有好的电子书? 有关打印的问题 用Indy组件接收邮件问题 将数组显示成图象 请问 TIdTCPClient 的基础问题? 关于 sql模糊查询多个返回值的问题
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
vItem : TListItem;
begin
vItem := nil;
vItem := ListView1.GetItemAt(x,y);
if vItem<>nil then
begin
vItem.Caption;
vItem.Data;
end;
end;
哥们,如果仅仅显示vItem.Caption,我就不发此帖了,问题的关键在于如何获得鼠标所在列
Y: Integer);
var
vItem : TListItem;
str :string;
begin
vItem := nil;
vItem := ListView1.GetItemAt(x,y);
if vItem<>nil then
begin
str := vItem.Caption;//第一列
str := vItem.SubItems[0];//第二列
str := vItem.SubItems[1];//第三列
.
.
.
end;
end;
僵哥,我试了其它模式,只要你添加了subitem,任何模式都可以访问到
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
iRow, iCol, it : Integer;
li : TListItem;
sText : string;
begin
if(not(Sender is TListView))then Exit;
sText := '(Empty)';
with TListView(Sender)do
try
if(ViewStyle <> vsReport)then
begin
sText := 'ViewStyle is not vsReport';
Exit;
end; li := GetItemAt(5, Y);
if(not Assigned(li))then Exit;
iRow := Items.IndexOf(li);
for iCol:=0 to Columns.Count-1 do
begin
it := Columns[iCol].Width;
if(X<it)then Break;
Dec(X, it);
end;
if(iCol<Columns.Count)then
sText := Format('[%d, %d] %s', [iRow, iCol, li.Caption]);
finally
Caption := sText;
end;
end;