vsReport 结构的listview,我想让caption列不能拖动宽度,而其他的列可以拖,怎么做呢?有什么办法可以实现?
解决方案 »
- 如何准确的得到已安装程序的列表?
- 如何实现一个控件继承另一个控件的方法
- 设置只读后退出报错?
- 谁有InstallShield Express的相关教程,谢谢
- DBGRIDEH显示格式设置问题
- 放分拉!这样的sql语句怎么解决???
- 怎么样让button不凸出来?
- 这段代码为什么出错???在线等待?
- 紧急求救!!! 关于 DbGridEh 打印序号的问题
- 这条SQL语句错在哪里:insert into systempdbf select * from 200201
- 为什么动态产生的TWebBrowser调用Navigate方法后 确得不到文本?
- Delphi中Foreach语句怎么写啊,能不能举个例子先
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.
利用TListItem.Data存不可見部分的数据...
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;(注:此方法可存一些不顕示的数据)