Применение компонента TListView. Простой проводник по файловой системе.
Внешний вид приложения.
Что может делать программа?
Краткое описание компонента TListView
1. Окно TListView может работать в одном из 4-х стилей:
- крупные значки,
- мелкие значки,
- список,
- таблица.
Вы знаете, что такие же стили есть у проводника Windows. Стили можно переключать, присваивая значения свойству ViewStyle объекта TListView .
Пусть в Вашей программе описан ListView1: TListView. Тогда оператор
ListView1.ViewStyle := vsIcon ; переведет ListView1 в стиль крупных значков. ( vsIcon - крупные значки, vsSmallIcon - мелкие значки, vsList - список, vsReport – таблица )
Что показывает окно TListView ?
Оно показывает данные - структуру, состоящие из строк.
Верхний и самый главный уровень этой структуры – Items. Это индексированный список элементов, отображаемых компонентом.
Заполнять этот список можно на этапе разработки, а можно – во время работы приложения. В последнем случае для добавления нового элемента к списку Items используется метод (например) ListView1.Items.Add
function Add: TListItem;
Доступ к отдельному элементу списка: ListView1.Items.Item[ii]: TListItem;, где ii – порядковый номер элемента (отсчет от нуля)
Например: Свойства и методы элемента с индексом 3:
- ListView1.Items.Item[3].Caption – заголовок. Он размещается в самой левой колонке строки.
- ListView1.Items.Item[3].ImageIndex – свойство типа Integer; Определяет номер картинки (в списке картинок), которая появляется в этой строке (закрепляется за этим элементом при любом стиле показа).
- ListView1.Items.Item[3].Data: Pointer; - указатель на данные, связанные с этим элементом. (В этой программе не задействован)
- ListView1.Items.Item[3].Selected: Boolean – является ли выбранным ? (при помощи мышиного щелчка)
property SubItems: TStrings; - это список подчиненных элементов. В простейшем случае используются просто как список строк.
Пример обращения к содержимому (надписи) 3-го столбца окошка:
ListView1.Items.Item[3].SubItems.Strings[1]
(потому что в первом столбце - ListView1.Items.Item[3].Caption, во 2-м - ListView1.Items.Item[3].SubItems.Strings[0])
Описание компонента TListView из Русской справки по Делфи (RusHelp - http://www.alex-co.com.ru/ А.Я.Архангельский)
Позволяет отображать в стиле проводника Windows данные в виде списков, таблиц, крупных и мелких пиктограмм
Описание
Компонент TListView позволяет отображать в стиле проводника Windows данные в виде списков, таблиц, крупных и мелких пиктограмм. С подобным отображением все вы сталкиваетесь, раскрывая папки Windows.
Стиль отображения информации определяется свойством ViewStyle, которое может устанавливаться в процессе проектирования или программно во время выполнения. Основное свойство компонента, описывающее состав отображаемой информации - Items. Во время проектирования оно может быть установлено специальным редактором, вызываемым щелчком на кнопке с многоточием рядом с этим свойством в окне Инспектора Объектов. В нем можно вводить новые узлы и дочерние узлы. Смысл дочерних узлов - это информация, которая появляется только в режиме vsReport (в виде таблицы). Для каждого нового узла можно указать ряд свойств. Свойство Caption - это надпись, появляющаяся около пиктограммы. Для дочерних узлов это свойство соответствует надписи, появляющейся в с ячейках таблицы в режиме vsReport. Свойство ImageIndex определяет индекс пиктограммы. Индексы соответствуют спискам изображений, хранящихся в отдельных компонентах TImageList, на которые указывают свойства LargeImages (для режима vsIcon) и SmallImages (для режимов vsSmallIcon, vsList и vsReport) компонента TListView. Свойство узла StateIndex позволяет добавить вторую пиктограмму в данный объект для его дополнительной характеристики. Индекс соответствует списку изображений, хранящихся в отдельном компоненте TImageList, указанном в свойстве StateImages компонента TListView.
Свойство Columns определяет список заголовков таблицы в режиме vsReport
при свойстве ShowColumnHeaders (показать заголовки), установленном в true. Свойство Checkboxes определяет отображение индикатора с флажком около каждого элемента списка. Индикаторы можно устанавливать программно или их может изменять пользователь во время выполнения. Тогда узнать программно, установлен ли индикатор в некотором элементе Items[i], можно проверкой его свойства Checked.
Свойства HotTrack и HotTrackStyles определяют появление выделения при перемещении курсора над элементом списка и стиль этого выделения. Свойство HoverTime задает в миллисекундах задержку появления такого выделения.
Свойство списка Selected определяет выделенный пользователем элемент списка. Свойство DragMode определяет режим перетаскивания элементов списка.
Метод Arrange позволяет упорядочить пиктограммы в режимах vslcon и vsSmallIcon.
Свойство WorkAreas определяет рабочую область (прямоугольную рамку), в которой осуществляется выравнивание пиктограмм в режимах vsIcon и vsSmallIcon. Свойство WorkAreas представляет собой индексированный список, аналогичный Items, но совершенно независимый от него. Если WorkAreas - пустой список (ни одна область в него не добавлена), то упорядочивание пиктограмм производится в пределах всей клиентской области ListView. Добавление новой рабочей области осуществляется методом Add. Свойство рабочей области Rect типа TRect определяет границы области. Свойство Color определяет цвет рамки, обрамляющей область. Свойство DisplayName определяет подпись под рамкой. И рамка, и подпись отображаются только в случае, если свойство списка ShowWorkAreas установлено в true.
Упорядочивание пиктограмм происходит в пределах той области, в которой они находятся. Способ упорядочивания определяется соответствующим заданием свойства SortType, определяющего характер сортировки.
Содержание задания
Создать приложение для просмотра файловой системы и запуска документов-файлов, т е упрощенную модель проводника. Приложение должно иметь кнопки для быстрого переключения дисков, возможность перехода к другой папке при помощи двойного или одинарного мышиного щелчка, возможность сортировки элементов списка по имени, дате, размеру файла.
Порядок выполнения (по шагам)
- Запускаем среду Делфи. Появляются, как обычно – форма1, редактор текста и инспектор объектов.
- Ставим на форму объект ListView1 (Иванов переименовывает его, например, в lstIvan1 ). В окне этого объекта будет список файлов.
- ставим углубленный прямоугольник StaticText1 (чтобы углубить, BorderStyle = bsSunken ). В нем будут отображаться команды, передаваемые оперативной системе при открытии файлов-документов. Так что этот объект вспомогательный, для контроля.
- Ставим кнопку для выхода из приложения. В данном примере берем кнопку TBitBtn – с панели Additional. Настраиваем ее свойство Kind = bkClose, Caption = Выход и кнопка готова.
- Ставим кнопки для быстрого перехода к дискам A: C: D: ... Z:. Это кнопки – Button1 - Button8. Что происходит при щелчке по одной из этих кнопок, Вы увидите в распечатке (найдите Button3Click - например). Если Вам не ясно, что такое OpDir – найдите текст этой процедуры, почитайте комментарии
- Ставим CheckBox1 – чтобы указывать, что одинарный щелчок по списку заменяет двойной щелчок. Часто это удобно. Вписываем CheckBox1.Caption = “Одинарный щелчок” (при помощи инспектора объектов, хотя можно и программно, в процедуре FormCreate написать: CheckBox1.Caption := ‘Одинарный щелчок’);
- Вроде бы все компоненты установлены. Займемся настройкой:
- Заголовок формы. (при помощи инспектора объектов установим Caption равным 'Наш проводник' ) . В процессе работы здесь будет имя текущей открытой папки.
- Если Вы хотите сделать компоненты цветными, установите свойства Color тех компонентов, где оно есть, в требуемый цвет (в инспекторе объектов).
- Проверьте, чтобы свойство ListView1.SortType = stNone. Тип сортировки задается в Runtime, в процедуре TForm1.FormCreate (см распечатку).
- Создайте пустой шаблон для FormCreate. Для этого выделите форму и в инспекторе перейдите на закладку Events (события). Отыщите строку OnCreate и сделайте двойной щелчок в правой клетке этой строки. В редакторе появится шаблон (процедура с пустым телом). Теперь можно заполнить её копированием из текста моего исходника. Можно, конечно, просто компилировать файлы проекта, которые Вы скачали, но тогда возможно Вы не научитесь создавать программы.
- Какие действия выполняются при запуске приложения (т е в FormCreate)? (по тексту: сверху – вниз )
- Задается устройство, открываемое при запуске программы (edFindText := 'C:';)
- создается объект SmallIm для хранения коллекции иконок
- Настраиваются свойства этого объекта
- создается объект Ic1 – для чтения иконок из файлов,
- Определяется имя папки (Dira) из которой запущено приложение (Dira:= ExtractFileDir(paramstr(0));),
- задается для каждой колонки списка ListVew1 ширина и тип выравнивания,
- читаются с диска 2 иконки: одна будет обозначать папки, другая – любой файл.
- Создается объект TSL класса TStringList. – для чтения с диска текстового файла Exten.txt. Этот файл содержит строки такой структуры: <точка><расширение файла (заглавными)>=<имя программы – обработчика для файлов с этим расширением – включая путь><пробел>.
Например:.DOC=C:\Program Files\Microsoft Office\OFFICE10\WINWORD.EXE
Как известно, обработчиком файлов *.doc является приложение WINWORD.EXE, которое хранится в папке C:\Program Files\Microsoft Office\OFFICE10
Текстовый файл Exten.txt готовится вручную. Его начинка зависит от расположения файлов на конкретной машине.
- Если Вы хотите, чтобы окно приложения вело себя хорошо при изменении размеров, Вы должны программно изменять размеры и положение некоторых компонентов на форме при изменении ее размеров.
Для этого нужно настроить свойство Anchors (якоря) тех компонентов формы, которые должны менять положение или размеры при изменении размеров формы. У каждого компонента есть 4 якоря:
akLeft, akTop, akRight, akBottom (левый, верхний, правый, нижний), каждый из которых имеет значение истина или ложь. Если, например, правый якорь = true, то при изменении ширины формы правый край этого компонента остается на неизменном расстоянии от правого края формы (как бы прикреплен к нему). Аналогично - другие якоря. Это удобно устанавливать и просматривать в инспекторе объектов.
- Полезно налаживать приложение постепенно, т е начинать с неполным набором процедур. Если Вы хотите иметь с самого начала все процедуры, то постепенность может заключаться в том, что в процедуры вписывается простой наладочный текст ("заглушка"),
например: Beep – короткий звук, или
Caption := ‘Это процедура proc 1 ’; или showmessage(‘процедура1’); (Однако showmessage останавливают программу). Пустые процедуры Делфи удаляет автоматически при сохранении файла, нужно поставить хотя бы комментарий, чтобы не было удаления.
- На этой стадии можно заменить заглушками все подпрограммы (если они есть), кроме FormCreate. И приложение должно работать, делая все, что описано в FormCreate. Кроме того, работает кнопка Выход.
Какие именно подпрограммы есть в программе, Вы видите, т к текст модуля у Вас есть. Не забудьте только, что обработчики событий создаются не копированием и вставкой текста, а как описано здесь - для FormCreate.
- Если программа компилируется и работает с заглушками, то нужно подключать (добавлять) постепенно возможности программы небольшими шагами (порциями), так, чтобы после каждого добавления мы видели что-то новое в работе программы. Добавляя каждую подпрограмму постарайтесь разобраться в её работе. Пояснения находятся в тексте подпрограммы (в комментариях).
- Целесообразно начать с «оживления» процедуры OpDir, потому что она вызывается в конце процедуры FormCreate. Почитаем текст OpDir и прикинем, что появится при ее подключении.
Вроде бы, должно заполнится окошко списком файлов, можно будет «нырять» в поддиректорию (но возврата не будет, т к пока отключена функция Old_Dira – старая директория ). Т к OpDir - не является обработчиком события, ее добавляем простым копированием текста. Но не забудьте также вставить её заголовок в раздел private описания класса form1. Пробуем.
Ничего не получилось. Однако, потому, что пока отключена AddNewFile – это одна из причин. (могут быть и еще). Пробую начинить AddNewFile. Вставляем ее аналогично, т е полное описание - в раздел implementation, а заголовок - в раздел private описания класса form1.
- Получилось, прекрасно, список есть. Какие в нем дефекты:?
- Папки и файлы показаны вперемешку (т к пока отключена сортировка)
- Нельзя нырять в папку (двойным щелчком). (естественно, т к процедура ListView1DblClick пустая)
- С чего начать ? – Пусть начнем с сортировки. У нас не заполнена основная процедура сортировки: ListView1Compare. Заполним ее. Все работает – сортировка есть, причем вначале идут папки, затем – файлы. Все они – в алфавитном порядке, причем заглавные буквы – перед обычными.
- Теперь пробуем «нырять» в папку, т е открывать папку. Технически это заключается в составлении списка файлов, находящихся в папке (при этом вложенные папки рассматриваются как файлы, отличаясь атрибутами). Процедуру OpDir мы вроде заполнили, она работает. Нужно заполнить обработчик двойного щелчка по списку - ListView1DblClick т к именно там определяется: по иконке папки или файла мы щелкнули и вызывается OpDir – в первом случае и OpDoc – во втором.
- ныряние получилось.
- всплытие получается сразу через все ступеньки – в корневой каталог С: Вероятно это потому, что пуста функция Old_Dira. Пробуем наполнить ее текстом.
- Вроде бы, теперь всплываем нормально. Подключим к работе кнопки А С D и т д (заполним сразу все процедуры и опробуем ). Все работает.
(H и Z - у меня виртуальные, так что они должны быть созданы)
- Подключаю (заполняю) процедуру OpDoc которая открывает документы, используя файл – список программ – обработчиков. – Работает, все прекрасно. Вам придется заполнить текстовый файл Exten.txt – ввести туда несколько нужных Вам обработчиков. Что дальше ?
- Сделаем, чтобы вместо двойного щелчка иногда можно было использовать одинарный щелчок.
Для этого у нас подготовлена процедура ListView1Click. Заполним ее ( тексты всех заполнений находятся в распечатке )
Заполнил. Работает. Работать одним щелчком гораздо удобнее (проверьте). Функцию «Один щелчок» можно отключить на форме (флажок CheckBox1). Что дальше ?
- Заметил, что не работает сортировка при щелчке по заголовкам столбцов. За это отвечает ( естественно ) процедура ListView1ColumnClick. Заполним ее. Выделим на форме ListView1, перйдем в инспекторе на закладку Events и создадим шаблон для ListView1ColumnClick двойным щелчком по правой клетке строки OnColumnClick.
Все работает, но после сортировки (по дате) имеются нарушения в работе.
Это было связано с тем, что свойство SortType было установлено в stText. Исправил на stNone.
- Какие процедуры остались не заполнены ? Заполним их. Это FormDestroy, заполняем.
На этом работа закончена.
Скачать RAR-архив исходников (компилируется в Д6,7) (16 Кб)
Скачать RAR-архив исходников + .exe(226 Кб)