存在一个listview,rowselect属性为true,单击的时候整行选择一个item,问题是
如果我单击被选中的item会Edit Caption,我想要在这种情况下如果单击的位置
正好是该item的一个subitem,那么就产生相同的效果,只不过被编辑的对象是该subitem.小弟第一次提问,谢谢大家的关注

解决方案 »

  1.   

    使用listview1.Selected.EditCaption方法 ;
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        ListView1: TListView;
        Edit1: TEdit;
        procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Edit1Exit(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
      private
        Item: TListItem;
        Index: Integer;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      I, Temp: Integer;
      Arr: Array of Integer;  Rect: TRect;
    begin
      with ListView1 do
        begin
          Item := GetItemAt(X, Y);
          if Item = nil then
            begin
              Edit1.Hide;
              Index := -1;
              exit;
            end;      SetLength(Arr, Columns.Count);
          for I := Low(Arr) to High(Arr) do
            Arr[I] := Columns[I].Width;      Temp := 0;
          Index := -1;
          for I := Low(Arr) to High(Arr) do
            begin
              if (X > Temp + 1) and (X < Temp + Arr[I]) then
                begin
                  Index := I;
                  break;
                end;
              Temp := Temp + Arr[I];
            end;      if Index < 0 then
            begin
              Edit1.Hide;
              exit;
            end;      Rect := Item.DisplayRect(TDisplayCode(0));      Edit1.Font.Assign(Font);
          if Index = 0 then
            Edit1.Text := Item.Caption
          else
            Edit1.Text := Item.SubItems[Index - 1];
          Edit1.SetBounds(Temp + Left + 2, Rect.Top + Top + 2, Arr[I] + 1, Rect.Bottom - Rect.Top);
          if not Edit1.Showing then
            Edit1.Show;
        end;
    end;procedure TForm1.Edit1Exit(Sender: TObject);
    begin
      Edit1.Hide;
      Index := -1;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      with ListView1 do begin
        ReadOnly := True;
        HideSelection := False;
        RowSelect := True;
      end;  Edit1.Hide;
      Index := -1;
      Item := nil;
    end;procedure TForm1.Edit1Change(Sender: TObject);
    begin
      if (Item = nil) or (Index = -1 ) then exit;
      if Index = 0 then
        Item.Caption := Edit1.Text
      else
        Item.SubItems[Index - 1] := Edit1.Text
    end;end.
      

  3.   

    这是方式之一
    不完善
    自己再改改可能向TListView发消息跟简洁合理
    但是我不会 :(