В TListView со стилем vsReport вызывает нарушение прав доступа когда вы запустите свой проект с ХР манифеста ресурса.

Фантик в VCL есть ошибка и вы должны источник пропатчить.

Просто скопируйте comctrls.pas в папку с вашим собственным проектом и измените метод UpdateColumn.

После компиляции проекта, comctrls.dcu и вы можете заменить оригинальный comctrls.dcu с

пропатчил один.

В Delphi5/Demos есть пример Virtual ListView. программка чем-то напоминает explorer, но без контекстного меню. контекстное меню приделывается так:

// Call FindCaption Method to search for a list view item labeled by the

// string specified as the Value parameter

Function ListviewBinarySearch

|

| Parameters :

| listview: listview to search, assumed to be sorted, must

| be <> nil.

| Item : item caption to search for, cannot be empty

| index : returns the index of the found item, or the

| index where the item should be inserted if it is not

| already in the list.

| Returns : True if there is an item with the passed caption

| in the list, false otherwise.

| Description:

| Uses a binary search and assumes that the listview is sorted

| ascending on the caption of the listitems. The search is

| case-sensitive, like the default alpha-sort routine used by

| the TListview class.

| Note:

| We use the lstrcmp function for string comparison since it

| is the function used by the default alpha sort routine. If

| the listview is sorted by another means (e.g. OnCompare event)

| this needs to be changed, the comparison method used must

| always be the same one used to sort the listview, or the

| search will not work!

| Error Conditions: none

Code:

procedure TForm1.ListView1KeyDown(Sender: TObject;

var Key: Word; Shift: TShiftState);

begin

if Ord(Key) = VK_F2 then

   ListView1.Selected.EditCaption;

end;

 

Сегодня поговорим о том, как при помощи TreeView сделать дерево каталогов, то есть нечто, вроде левой части Проводника. Самый простой способ - это при запуске программы найти все каталоги на диске и засунуть их в TreeView. Но у этого способа есть несколько недостатков. Во-первых, он долгий, особенно, если включен zif. Во-вторых, даже если закрыть и открыть какую-то папку, она не обновится. Поэтому лучше всего вначале сделать в TreeView список дисков со значком "+", то есть указать, что на диске есть каталоги. Это не всегда верно, но проверять, правда ли это, долго из-за дисковода. При попытке раскрыть каталог или диск программа ищет подкаталоги и добавляет их в ListView. В каждом подкаталоге программа пытается найти хотя бы один подкаталог. В зависимости от результатов поиска "+" появляется или нет.

В этой программе используются иконки из файла FileCtrl.res, находящемся в каталоге "Delphi5\lib".

  

Code:

procedure TForm1.FormCreate(Sender: TObject);

var

SysIL   : THandle;

SysSIL  : THandle;

SFI     : TSHFileInfo;

begin

SysImageList1 := TImageList.Create(self);

with SysImageList1 do begin

     Width  := 16;

     Height := 16;

     SysSIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),

       SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

     if SysSIL <> 0 then begin

       SysImageList1.Handle := SysSIL;

       ShareImages := True;

     end;

   end;

SysImageList2 := TImageList.Create(self);

with SysImageList2 do begin

     Width := 32;

     Height := 32;

     SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),

       SHGFI_SYSICONINDEX or SHGFI_LARGEICON);

     if SysIL <> 0 then begin

       SysImageList2.Handle := SysIL;

       ShareImages := True;

     end;

   end;

end;

 

function GetIconIndex(const AFile: string; Attrs: DWORD): integer;

var

SFI: TSHFileInfo;

begin

SHGetFileInfo(PChar(AFile), Attrs, SFI, SizeOf(TSHFileInfo),

   SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);

Result := SFI.iIcon;

end;

....

with ListView.Items.Add do begin

Caption := FName;

ImageIndex := GetIconIndex(Caption, FILE_ATTRIBUTE_NORMAL);

SubItems.Add(FSize); 

SubItems.Add(FType);

SubItems.Add(FDateTime);

end;

 

MS did not see fit to send a notification to the listview when the user  Double - clicks on the header. But the header control class does have the

 CS_DBLCLKS Style, so it does get WM_LBUTTONDBLCLK messages, it just does  not do anything with them. To get at these messages requires API - Style

 subclassing of the header control.

 

Для этого нужно в оконной процедуре ListView обработать сообщение WM_NOTIFY с кодом NM_CUSTOMDRAW. И в обработчике этого сообщения назначить цвета фона и текста (можно назначить и шрифт). Но при этом правая часть header'а (область заголовка ListView, находящаяся справа от колонок) закрашиваться не будет. Чтобы закрасить и её, надо в оконной процедуре header'а обработать сообщение WM_ERASEBKGND, в котором и залить нужным цветом эту область. Ниже - небольшой примерчик с сабклассингом.

 

Code:

const

TVS_NOTOOLTIPS = $80;

begin

with treeview1 do

   SetWindowLong(Handle, GWL_STYLE,

                 GetWindowLong(Handle, GWL_STYLE)

                 or TVS_NOTOOLTIPS);

end;

 

 

Иногда бывает полезно в заголовке колонки показывать стрелочку, чтобы информировать пользователя, по какой колонке идёт сортировка. Добавьте следующий код в форму: