TListView
В 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; |
Иногда бывает полезно в заголовке колонки показывать стрелочку, чтобы информировать пользователя, по какой колонке идёт сортировка. Добавьте следующий код в форму:
Страница 1 из 3