分享

Delphi中listview编辑列的实现

 貌似小白 2013-05-21

Delphi中listview编辑列的实现-实现多列编辑

做项目用到了编辑ListView的列,原来写过对StringGrid的单元格编辑,着了下代码,同时也在网上参考了代码写出来了。

大致意思:双击时找到当前选择的行,并通过列遍历找到具体的列,找到行列就可以定位单元格了,然后读出来数据到Edit,同时设置Edit显示,当离开Edit时把具体的值写回ListView。

不多说了上代码,请参考。

Edit的事件如下:

procedure TfrmYuanCaiLiaoIn.edtListviewChange(Sender: TObject);
begin
ListViewBookIn.Selected.SubItems[nCurIndex - 1] := edtListview.Text;
end;

procedure TfrmYuanCaiLiaoIn.edtListviewExit(Sender: TObject);
begin
if edtListview.Text <> '' then
begin
    ListViewBookIn.Selected.SubItems[nCurIndex-1] := edtListview.Text;
    edtListview.Visible := False;
end;
end;

procedure TfrmYuanCaiLiaoIn.FormCreate(Sender: TObject);
begin
nCurIndex := 0;
end;

ListView代码:


procedure TfrmYuanCaiLiaoIn.ListViewBookInDblClick(Sender: TObject);
var
W, X, nCount: Integer;
Rect: TRect;
Pos: TPoint;
nCol: Integer;
begin
if Assigned(ListViewBookIn.Selected) then//判断双击的区域是否为有效区域
begin
    Pos := ListViewBookIn.ScreenToClient(Mouse.CursorPos);
    nCount := ListViewBookIn.Columns.Count;
    X := -GetScrollPos(ListViewBookIn.Handle, SB_HORZ);

    for nCol := 0 to nCount - 1 do
    begin
      W := ListView_GetColumnWidth(ListViewBookIn.Handle, nCol);
      if Pos.X <= X + W then
      begin
        Break;
      end;
      X := X + W
    end;


    nCurIndex := nCol;   
    if nCol = nCount then
    begin
      Exit;
    end;


    if nCol = 1 then
    begin
      Exit; //第1列不允许编辑,nCol     就是选定哪一列
    end;

    if X < 0 then
    begin
      W := W + X;
      X := 0;
    end;

    Rect := ListViewBookIn.Selected.DisplayRect(drBounds);
    Pos.X := X;
    Pos.Y := Rect.Top;
   
    MapWindowPoints(ListViewBookIn.Handle, Handle, Pos, 1);
    
    edtListview.SetBounds(Pos.X, Pos.Y, W, Rect.Bottom- Rect.Top + 3);

    edtListview.Parent := ListViewBookIn;
    edtListview.Top := ListViewBookIn.Selected.Top;
    edtListview.Text := ListViewBookIn.Selected.SubItems[nCurIndex-1];
    edtListview.Visible := True;
    edtListview.SetFocus
end;
end;

ListView需要设定 HideSelection为FALSE、RowSelect为TRUE

注:如果您觉得ListView行间距小,可以放一个ImageList上去,把ImageList的Height修改为18,然后让ListView的Images选择ImageList即可。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多