ListView1.ViewStyle:=vsReport;

解决方案 »

  1.   

    不能,除非自己放个edit假装一下
      

  2.   

    没有,只有用edit,我封装过,不过不好用,你要我可以发代码给你,
      

  3.   

    算了,我直接写上来unit DbListView;interfaceuses
      SysUtils, Classes, Controls, ComCtrls,StdCtrls,Messages,
       QDialogs,commctrl,windows;type
      LISTVIEW_CUSTATE=(FTINSERT,FTEDIT,FTNONE);
      TOnClickNewEvent=
      procedure (Sender:TObject;
      EditText:string;
      Index,SubItem:Integer) of object;
      TOnClickEditEvent=
      procedure (Sender:TObject;
      EditText:string;
      Index,SubItem:Integer) of object;
      TOnDbclkNewEvent=procedure (Sender:TObject) of object;
      TOnDbclkEditEvent=procedure (Sender:TObject;Index:Integer) of object;  TIntList=class
      private
        m_IntList:array of Integer;
      public
        constructor Create;
        function Add(Item:Integer):Integer;
        function IndexOf(Item:Integer):Integer;
        
        procedure Delete(Item:Integer);
        procedure Clear;
      end;  TDbListView = class(TCustomListView)
      private
        m_Edit:TEdit;
        m_IndexList:TIntList;
        CuEditIndex,CuEditSubIndex:Integer;
        FOnClickNewEvent:TOnClickNewEvent;
        FOnClickEditEvent:TOnClickEditEvent;
        FOnDbclkEditNpEditEvent,FOnDbclkNewEvent:TOnDbclkNewEvent;
        FOnDbclkEditEvent:TOnDbclkEditEvent;  protected
        FEditState:LISTVIEW_CUSTATE;    procedure OnBLClickUp(var msg :TMessage);message WM_LBUTTONUP;
        procedure OnBLClickDown(var msg :TMessage);message WM_LBUTTONDOWN;
        procedure OnDblClick(var msg:TMessage);message WM_LBUTTONDBLCLK;
        procedure OnEditExit(Sender:TObject);
        procedure DBEditKeyPress(Sender: TObject;
        var Key: Char);
        procedure ListViewCustomDraw(
        Sender: TCustomListView;
        const ARect: TRect; var DefaultDraw: Boolean);
      public
        constructor Create(Owner: TComponent);override;
        destructor Destroy; override;
        procedure AddEditIndex(index:Integer);
        procedure DeleteEditIndex(index:Integer);
        procedure CleareEditIndex;
        function GetSubItemIndex(x:Integer;var xPos:Integer):Integer;
      published
        property Action;
        property Align;
        property AllocBy;
        property Anchors;
        property BevelEdges;
        property BevelInner;
        property BevelOuter;
        property BevelKind default bkNone;
        property BevelWidth;
        property BiDiMode;
        property BorderStyle;
        property BorderWidth;
        property Checkboxes;
        property Color;
        property Columns;
        property ColumnClick;
        property Constraints;
        property Ctl3D;
        property DragCursor;
        property DragKind;
        property DragMode;
        property Enabled;
        property Font;
        property FlatScrollBars;
        property FullDrag;
        property HideSelection;
        property HotTrack;
        property HotTrackStyles;
        property HoverTime;
        property IconOptions;
        property Items;
        property LargeImages;
        property OwnerData;
        property OwnerDraw;
        property ParentBiDiMode;
        property ParentColor default False;
        property ParentFont;
        property ParentShowHint;
        property PopupMenu;
        property ShowColumnHeaders;
        property ShowWorkAreas;
        property ShowHint;
        property SmallImages;
        property SortType;
        property StateImages;
        property TabOrder;
        property TabStop default True;
        property Visible;
        property OnAdvancedCustomDraw;
        property OnAdvancedCustomDrawItem;
        property OnAdvancedCustomDrawSubItem;
        property OnChange;
        property OnChanging;
        property OnClick;
        property OnClickNewEvent: TOnClickNewEvent read FOnClickNewEvent write FOnClickNewEvent;
        property OnClickEditEvent: TOnClickEditEvent read FOnClickEditEvent write FOnClickEditEvent;
        property OnDbclkNewEvent: TOnDbclkNewEvent read FOnDbclkNewEvent write FOnDbclkNewEvent;
        property OnDbclkEditEvent: TOnDbclkEditEvent read FOnDbclkEditEvent write FOnDbclkEditEvent;
        property OnDbclkEditNpEditEvent:TOnDbclkNewEvent read FOnDbclkEditNpEditEvent   write FOnDbclkEditNpEditEvent;
        property OnColumnClick;    property OnColumnDragged;
        property OnColumnRightClick;
        property OnCompare;
        property OnContextPopup;
        property OnCustomDrawItem;
        property OnCustomDrawSubItem;
        property OnData;
        property OnDataFind;
        property OnDataHint;
        property OnDataStateChange;
        property OnDeletion;
        property OnDrawItem;
        property OnEdited;
        property OnEditing;
        property OnEndDock;
        property OnEndDrag;    property OnEnter;
        property OnExit;
        property OnGetImageIndex;
        property OnGetSubItemImage;
        property OnDragDrop;
        property OnDragOver;
        property OnInfoTip;
        property OnInsert;
        property OnKeyUp;
        property OnMouseDown;
        property OnMouseMove;
        property OnMouseUp;
        property OnResize;
        property OnSelectItem;
        property OnStartDock;
        property OnStartDrag;
      end;
      

  4.   

    procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Data Controls', [TDbListView]);
    end;constructor TIntList.Create;
    begin
      SetLength(m_IntList,0);
    end;procedure TIntList.Delete(Item:Integer);
    var
      I:Integer;
    begin
      for I:=0 to Length(m_IntList)-1 do
      begin
        if Item=m_IntList[I] then break;
      end;
      for I:=I to Length(m_IntList)-2 do
      begin
        m_IntList[I]:=m_IntList[I+1];
      end;
      SetLength(m_IntList,Length(m_IntList)-1);
    end;procedure TIntList.Clear;begin
      SetLength(m_IntList,0);
    end;function TIntList.Add(Item:Integer):Integer;
    begin
      SetLength(m_IntList,Length(m_IntList)+1);
      m_IntList[Length(m_IntList)-1]:=Item;
      Result:=Length(m_IntList)-1;
    end;function TIntList.IndexOf(Item:Integer):Integer;
    var
      I:Integer;
    begin
      Result:=-1;
      for I:=0 to Length(m_IntList)-1 do
      begin
        if Item=m_IntList[I] then
        begin
          Result:=I;
          exit;
        end;
      end;
    end;constructor TDbListView.Create(Owner: TComponent);
    begin
      inherited Create(Owner);
      ViewStyle:=vsReport;
      GridLines:=true;
      RowSelect:=true;
      OnCustomDraw:=ListViewCustomDraw;
      m_Edit:=TEdit.Create(self);
      m_Edit.OnExit:=OnEditExit;
      m_Edit.OnKeyPress:=DBEditKeyPress;
      m_Edit.Visible:=false;
      m_IndexList:=TIntList.Create;
      ReadOnly:=true;
      Left:=0;
      Top:=0;
      m_Edit.Width:=0;
      FEditState:=FTNONE;
    end;destructor TDbListView.Destroy;
    begin
      m_Edit.Free;
      m_IndexList.Free;
      Inherited Destroy;
    end;procedure TDbListView.AddEditIndex(index:Integer);
    begin
      m_IndexList.Add(index);
    end;procedure TDbListView.DeleteEditIndex(index:Integer);
    begin
      m_IndexList.Delete(m_IndexList.IndexOf(Index));
    end;procedure TDbListView.OnBLClickUp(var msg :TMessage);
    var
      pinfo:tagLVHITTESTINFO;
      iSubIndex,Index:Integer;
      rc:TRECT;
      pI:TListItem;
      z:Integer;
      edittext:array [0..200] of AnsiChar;
    begin
      inherited;
      if Columns.Count<1 then exit;
      pInfo.pt.X:=msg.LParamLo;
      pInfo.pt.Y:=msg.LParamHi;
      Index:=SendMessage(Handle,
      LVM_SUBITEMHITTEST,0,LPARAM(@pinfo));
      iSubIndex:=pinfo.iSubItem;
      if (m_Edit.Visible) and
      (CuEditIndex=Index)
       and (CuEditSubIndex=pInfo.iSubItem) then exit;  m_Edit.ParentWindow:=ParentWindow;
      if Index>-1 then
      begin
        z:=m_IndexList.IndexOf(
        iSubIndex);
        if z>-1 then
        begin
          ListView_GetSubItemRect(Handle,
          Index,pinfo.iSubItem,LVIR_LABEL,@rc);
          m_Edit.Left:=rc.Left;
          m_Edit.Top:=rc.Top;
          m_Edit.Width:=rc.Right-rc.Left;
          m_Edit.Height:=rc.Bottom-rc.Top;      ListView_GetItemText(Handle,
          Index,pInfo.iSubItem,@edittext[0],200);
          m_Edit.Text:=edittext;      m_Edit.Parent:=self;
          m_Edit.Visible:=true;
          m_Edit.SelectAll;
          m_Edit.SetFocus;
          CuEditIndex:=Index;
          CuEditSubIndex:=pinfo.iSubItem;
          if FEditState<> FTINSERT then
            FEditState:=FTEDIT;
        end;
      end
      else
      begin
        if m_IndexList.IndexOf(
        iSubIndex)>-1 then
        begin
          self.Items.BeginUpdate;
          pI:=Items.Add;
          pI.Caption:='';
          self.Items.EndUpdate;
          FEditState:=FTINSERT;    end;
      end;
    end;procedure TDbListView.CleareEditIndex;
    begin
      m_IndexList.Clear;
    end;function TDbListView.GetSubItemIndex(x:Integer;var xPos:Integer):Integer;
    var
      I:Integer;
      PreStartX,StartX:Integer;
    begin
      StartX:=0;
      PreStartX:=0;
      for I:=0 to Columns.Count-1 do
      begin
        if StartX>X then break;
        PreStartX:=StartX;
        StartX:=StartX+Columns.Items[I].Width;
      end;
      if StartX<x then Result:=-1 else Result:=I;
      xPos:=PreStartX;
    end;procedure TDbListView.OnDblClick(var msg:TMessage);
    var
      Index,iSubIndex:Integer;
      pinfo:tagLVHITTESTINFO;
    begin
      inherited;
      if Columns.Count<1 then exit;
      pInfo.pt.X:=msg.LParamLo;
      pInfo.pt.Y:=msg.LParamHi;
      Index:=SendMessage(Handle,
      LVM_SUBITEMHITTEST ,0,LPARAM(@pinfo));
      iSubIndex:=pInfo.iSubItem;
      if m_IndexList.IndexOf(
        iSubIndex)>0 then exit;  if (Index>-1)
      then
      begin
        if Assigned(FOnDbclkEditEvent) then
          FOnDbclkEditEvent(self,Index)
        else if Assigned(FOnDbclkEditNpEditEvent) then
        FOnDbclkEditNpEditEvent(self);
      end
      else
      begin
        if Assigned(FOnDbclkNewEvent) then FOnDbclkNewEvent(self);
      end;
    end;procedure  TDbListView.OnEditExit(Sender:TObject);
    var
      pCustomEdit:TCustomEdit;
    begin  pCustomEdit:=TCustomEdit(Sender);
      pCustomEdit.Visible:=false;
      m_Edit.Visible:=false;
      if FEditState=FTINSERT then
      begin
        if Assigned(FOnClickNewEvent) then
        begin
          FOnClickNewEvent(self,pCustomEdit.Text,CuEditIndex,CuEditSubIndex);
        end
        else
          Items.Delete(CuEditIndex);
      end
      else
      begin
        if Assigned(FOnClickEditEvent) then
        begin
          FOnClickEditEvent(self,pCustomEdit.Text,CuEditIndex,CuEditSubIndex);
        end;
      end;
      FEditState:=FTNONE;end;procedure TDbListView.DBEditKeyPress(Sender: TObject;
     var Key: Char);
    begin
      if Key=Char(VK_ESCAPE) then
      begin
        m_Edit.Visible:=false;
        if FEditState=FTINSERT then
        begin
          Items.Delete(CuEditIndex);
        end;
      end;
      if Key=Char(VK_RETURN) then
      begin
        m_Edit.Visible:=false;
        OnEditExit(m_Edit);
      end;
    end;procedure TDbListView.OnBLClickDown(var msg :TMessage);
    var
      pinfo:tagLVHITTESTINFO;
    begin  if m_Edit.Visible then
      begin
        OnEditExit(m_Edit);
      end;
      GetCursorPos(pInfo.pt);
      SendMessage(Handle,
      LVM_SUBITEMHITTEST,0,LPARAM(@pinfo));
      if m_IndexList.IndexOf(pInfo.iSubItem)<0 then
        inherited;
    end;procedure TDbListView.ListViewCustomDraw(
    Sender: TCustomListView;
    const ARect: TRect; var DefaultDraw: Boolean);
    var
      rc:TRect;
    begin
      DefaultDraw:=true;
      if m_Edit.Visible then
      begin
        ListView_GetSubItemRect(
        Handle,CuEditIndex,CuEditSubIndex,LVIR_LABEL,@rc);
        m_Edit.Left:=rc.Left;
        m_Edit.Top:=rc.Top;
        m_Edit.Width:=rc.Right-rc.Left;
        m_Edit.Height:=rc.Bottom-rc.Top;
      end;
    end;
    end.