收录日期:2019/03/21 00:21:58 时间:2016/05/29 00:48:57 标签:VCL组件开发及应用
vsReport 结构的listview,我想让caption列不能拖动宽度,而其他的列可以拖,怎么做呢?有什么办法可以实现?
把columns[0]的width,maxwidth,minwidth都设为同一个数
那样还是可以调的,虽然会自动弹回去,但我不想让人看到caption这项
?
我就是想让它类似于enable:=false这种效果,但其他的列要可以调整宽度
下面的控件是监控列改变大小的,你自己改一下吧:
unit PBExListview;

interface

uses
  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;

implementation

uses 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.
不想让人看到caption这项、就不要把値付給caption。
利用TListItem.Data存不可見部分的数据...
厉害,不过改起来太麻烦了,有没有更简单的方法?
TListItem.Data 是TPointer类型,我想存STRING
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;

(注:此方法可存一些不顕示的数据)
不能运行呀
厉害!
自己再顶一下
楼主:是哪個不能运行呀?怎麼不能运行了? 現象是什麼?
帮你顶
columns[0].visible:=false這樣不就看不到了嗎
楼上,没Visible属性呢

无法将文件“Yingnet.YingnetOA.DB.dll”复制到运行目录。----在线等,各位这是个什么问题啊 请求帮助,关于js问题!!!!!!!!!!!1 ftp定时获取文件的问题(文件名称随日期的不同而不同) 怎么恢复 .Net 的断点调试功能? 大家帮忙 ,我要搞个JSP论坛 ,请问在哪里申请JSP空间比较好 ,和便宜 , 一年大概多少钱? 神啊,救救我啊,救命啊,有关于进程隐藏的技术 关于水晶报表连接问题 怎么实现系统托盘?谁有系统托盘的实例子? 靠,为什么我们必须要捐款? 神啊,救救我啊,救命啊,有关于进程隐藏的技术 ??求救 ,请问如果在asp.net+c#中清除Cookies 局域网机器通过网上邻居不能访问,而机器之间可以PING通 弱问,数据字典是什么?在哪里?和tquery什么关系?在哪里能学到这方面知识? 为什么在.cs中无法引用ascx控件 神啊,救救我啊,救命啊,有关于进程隐藏的技术 大家帮忙推荐几本数据库设计的书吧,thanks! 排序问题 sql语句优化求教。 神啊,救救我啊,救命啊,有关于进程隐藏的技术 请高手指点:想把socket做成dll,而实际调用的是c开发环境(其实是CVI),不知是否可行? 再弱问,fastreport中,怎么获得dateset的字段名? 我想动态设置titlebond上memo的字段名 局域網中不同平台間互訪的問題 控件的动态定位 神啊,救救我啊,救命啊,有关于进程隐藏的技术 MID函数+REN函数。。如何查看输入文字两边是否带空格?^^^^^^^^^^^ delphi2005的帮助阿,让人看了直想骂。 我这么做算不算程序员? 今日无事,过来给思归大哥和孟子大哥上柱香! 关于如何验证15位的身份证格式的问题 从哪儿能下载GdiPlus.h,GdiPlus.lib等文件啊?帮帮