vsReport 结构的listview,我想让caption列不能拖动宽度,而其他的列可以拖,怎么做呢?有什么办法可以实现?

解决方案 »

  1.   

    把columns[0]的width,maxwidth,minwidth都设为同一个数
      

  2.   

    那样还是可以调的,虽然会自动弹回去,但我不想让人看到caption这项
      

  3.   

    我就是想让它类似于enable:=false这种效果,但其他的列要可以调整宽度
      

  4.   

    下面的控件是监控列改变大小的,你自己改一下吧:
    unit PBExListview;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls;type
      TLVColumnResizeEvent = procedure(Sender: TCustomListview;
        columnindex: Integer;
        columnwidth: Integer) of object;
      TPBExListview = class(TListview)
      private
        FBeginColumnResizeEvent: TLVColumnResizeEvent;
        FEndColumnResizeEvent: TLVColumnResizeEvent;
        FColumnResizeEvent: TLVColumnResizeEvent;  protected
        procedure DoBeginColumnResize(columnindex, columnwidth: Integer);
          virtual;
        procedure DoEndColumnResize(columnindex, columnwidth: Integer);
          virtual;
        procedure DoColumnResize(columnindex, columnwidth: Integer);
          virtual;
        procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
        function FindColumnIndex(pHeader: pNMHdr): Integer;
        function FindColumnWidth(pHeader: pNMHdr): Integer;
        procedure CreateWnd; override;
      published
        property OnBeginColumnResize: TLVColumnResizeEvent
          read FBeginColumnResizeEvent write FBeginColumnResizeEvent;
        property OnEndColumnResize: TLVColumnResizeEvent
          read FEndColumnResizeEvent write FEndColumnResizeEvent;
        property OnColumnResize: TLVColumnResizeEvent
          read FColumnResizeEvent write FColumnResizeEvent;
      end;procedure Register;implementationuses CommCtrl;procedure Register;
    begin
      RegisterComponents('PBGoodies', [TPBExListview]);
    end;procedure TPBExListview.DoBeginColumnResize(columnindex, columnwidth: Integer);
    begin
      if Assigned(FBeginColumnResizeEvent) then
        FBeginColumnResizeEvent(Self, columnindex, columnwidth);
    end;procedure TPBExListview.DoEndColumnResize(columnindex, columnwidth: Integer);
    begin
      if Assigned(FEndColumnResizeEvent) then
        FEndColumnResizeEvent(Self, columnindex, columnwidth);
    end;procedure TPBExListview.DoColumnResize(columnindex, columnwidth: Integer);
    begin
      if Assigned(FColumnResizeEvent) then
        FColumnResizeEvent(Self, columnindex, columnwidth);
    end;function TPBExListview.FindColumnIndex(pHeader: pNMHdr): Integer;
    var
      hwndHeader        : HWND;
      iteminfo          : THdItem;
      ItemIndex         : Integer;
      buf               : array[0..128] of Char;
    begin
      Result := -1;
      hwndHeader := pHeader^.hwndFrom;
      ItemIndex := pHDNotify(pHeader)^.Item;
      FillChar(iteminfo, SizeOf(iteminfo), 0);
      iteminfo.Mask := HDI_TEXT;
      iteminfo.pszText := buf;
      iteminfo.cchTextMax := SizeOf(buf) - 1;
      Header_GetItem(hwndHeader, ItemIndex, iteminfo);
      if CompareStr(Columns[ItemIndex].Caption, iteminfo.pszText) = 0 then
        Result := ItemIndex
      else
      begin
        for ItemIndex := 0 to Columns.Count - 1 do
          if CompareStr(Columns[ItemIndex].Caption, iteminfo.pszText) = 0 then
          begin
            Result := ItemIndex;
            Break;
          end;
      end;
    end;procedure TPBExListview.WMNotify(var Msg: TWMNotify);
    begin
      inherited;
      case Msg.NMHdr^.code of
        HDN_ENDTRACK:
          DoEndColumnResize(FindColumnIndex(Msg.NMHdr),
            FindColumnWidth(Msg.NMHdr));
        HDN_BEGINTRACK:
          DoBeginColumnResize(FindColumnIndex(Msg.NMHdr),
            FindColumnWidth(Msg.NMHdr));
        HDN_TRACK:
          DoColumnResize(FindColumnIndex(Msg.NMHdr),
            FindColumnWidth(Msg.NMHdr));
      end;
    end;procedure TPBExListview.CreateWnd;
    var
      wnd               : HWND;
    begin
      inherited;
      wnd := GetWindow(Handle, GW_CHILD);
      SetWindowLong(wnd, GWL_STYLE,
        GetWindowLong(wnd, GWL_STYLE) and not HDS_FULLDRAG);
    end;function TPBExListview.FindColumnWidth(pHeader: pNMHdr): Integer;
    begin
      Result := -1;
      if Assigned(PHDNotify(pHeader)^.pItem) and
        ((PHDNotify(pHeader)^.pItem^.mask and HDI_WIDTH) <> 0) then
        Result := PHDNotify(pHeader)^.pItem^.cxy;
    end;end.
      

  5.   

    不想让人看到caption这项、就不要把値付給caption。
    利用TListItem.Data存不可見部分的数据...
      

  6.   

    TListItem.Data 是TPointer类型,我想存STRING
      

  7.   

    type TPointRecord=^PointRecord;
         PointRecord = record
           Hide_Code: String;
           Hide_Name: String;
           {...}
         end;var
      ListItem: TListItem;
      pr: TPointRecord;
    begin
      ListItem := ListView1.Items.Add;         //可見部分
      ListItem.Caption := 'Caption' + IntToStr(Line);
      for j := 1 to 4 do begin
        ListItem.SubItems.Add('Sub:'+IntToStr(Line)+IntToStr(j));
      end;  new(pr);                                 //Hide部分
      pr.Hide_Code := 'Hide_Code: ' + IntToStr(Line);
      pr.Hide_Name := 'Hide_Name: ' + IntToStr(Line);
      ListItem.Data := pr;
    end;procedure TForm1.ListView1Click(Sender: TObject);
    var
      pr: TPointRecord; 
    begin
      pr := ListView1.Selected.Data;
      showMessage(pr.Hide_Code + '  ' + pr.Hide_Name); //顕示不可視部分
    end;(注:此方法可存一些不顕示的数据)
      

  8.   

    columns[0].visible:=false這樣不就看不到了嗎