(Внимание!!! Пример написанный в Kylix прекрасно работает в Delphi)
Многие говорят, что в Linux нет хорошего файл менеджера типа Windows Commander под Windows. Это не так. Менеджеры есть, может они не совсем удобны и не на столько функциональны, но они есть. А если ты все же хочешь получить супер файл-менеджер, то все в твоих руках. Попробуй написать его сам. Для этого нужно не так уж и много сил, особенно с Kylix.
Предыстория:
В этой статье я хочу тебе показать, как самому написать подобие файлового менеджера. Хотя он будет пустой не красивый и не очень функционален, но все же он будет. Нам главное понять основы работы с файлами. А сс временем ты сможешь улучшить и приукрасить свое творение. А я буду тебе помогать.
И так. Даю установку на сегодняшние две полосы. Наша задача написать прогу, с помощью которой можно будет прогуливаться по каталогам. Установка дана. Вперед!!!
На старт:
Рисунок 1
Запускай Kylix, мы начинаем с чистого листа. Брось на форму два компонента: ListView с палитры компонентов Common Controls и ControlBar с палитры Additional. У тебя получится два компонента с именами ListView1 и ControlBar1. У ControlBar1 свойство Align нужно установить в alTop, а у ControlBar1в alTop.
Теперь на ControlBar1 брось Combobox с палитры Standard. После этого у ControlBar1 измени свойство AutoSize в true. Все. Больше никаких компонентов нам не понадобится. Графический интерфейс нашего файлового менеджера пока готов. Надеюсь, что у тебя получилось нечто похожее на рисунок 1. Если получилось лучше, то это твои проблемы.
Рисунок 2
Теперь нам нужно выловить событие OnShow (когда показывается форма) главной формы. По этому событию мы всегда будем производить инициализацию различных примочек. Итак, выдели форму. Как это сделать, если на нашей форме нет чистого места? Везде сплошные компоненты. Для этого вверху окна объектного инспектора есть выпадающий список. В этом списке перечислены все компоненты на форме. Найди в этом списке имя формы (по умолчанию это Form1, если ты не менял). Так ты сможешь выделить форму.
Теперь перейди на закладку Events и создай обработчик для события OnShow. Там нужно написать содержимое листинга 1. Тут всего лишь один вызов процедуры ListDir. Эта процедура читает содержимое директории, указанной в качестве единственного параметра. Но такой процедуры в Kylix нет, я ее выдумал :), поэтому нам придется написать ее самим.
Найди раздел private в объявлении формы. Где искать я писал в введении в программирование пару номеров назад. Если ты пролетал в облаках, то просто ищи слово privste и после него пиши следующее:
Path – это переменная, в которой всегда будет хранится текущей путь на диске. ListDir – это наша процедура. Теперь нажми Ctrl+Alt+C и Kylix сам создаст необходимую заготовку для новой процедуры. В нее напиши все, что написано в листинге 2. Комментарии помогут тебе разобраться с происходящим, а я рассмотрю самые интересные моменты.
Во первых, это очень интересная конструкция if … then. Она читается как «Если Какое-то Условие верно, то выполнить действие». Если после этого стоят begin и end, то выполняются все действия между ними иначе, только одно следующее действие. В нашем случае запускается поиск с помощью функции FindFirst. Если она вернула какое-то значение, то выполнится все, что идет после, между begin и end. Между begin и end выполняется цикл:
repeat
Действие
until Условие;
Этот цикл последовательно выполняет «Действие», пока «Условие» верно. В качестве условия у нас стоит функция возвращающая следующий найденный файл. Пока файлы находятся сами собой, будет выполнятся действие, которое заполняет ListView1 именами найденных файлов.
Рисунок 3
Все. Все остальное можно понять по комментариям. Так что теперь давай еще немного поШкодим. Для этого вернись к форме. Выдели компонент ListView1 и создай для него обработчик события OnDblClick. В этом обработчике напиши все, что есть в листинге 3.
Этим мы поймали событие двойного клика по элементу из ListView и перешли в новое место на диске.
Заключение:
Конечно же, в проге еще полно недостатков, но она работает. Нам главное понять принцип, а дальше уже полетим как на коньках. Для общего развития можешь еще создать обработчик события OnChange у ComboBox1 и написать туда одну лишь строку: ListDir(Combobox1.Text);. Так ты сможешь переходить в любую папку сохраненную в Combobox1.
Со временем мы будем улучшать пример, а улучшать есть что. Например, нужно по разному отображать и обрабатывать файлы и папки. А в данном варианте, если ты дважды кликнешь по файлу, то прога будет пытаться его открыть как папку. Ну в общем, работы еще полно. Так что, встретимся через месяц на том же месте.
Листинг 1:
procedure TForm1.FormShow(Sender: TObject);
begin
ListDir('/');
end;
Листинг 2:
procedure TForm1.ListDir(dir: String);
var
sr: TSearchRec;
begin
//Очистить содержимое ListView1
ListView1.Items.Clear;
//Начать поиск и найти первый файл.
if FindFirst(dir+'*', faAnyFile, sr) = 0 then
begin
repeat
// Добавить в ListView1 имя найденного файла
ListView1.Items.Add.Caption:=sr.Name;
//Найти следующий файл и перейти на repeat.
until FindNext(sr) <> 0;
//Закрыть поиск
FindClose(sr);
end;
//Запомнить текущее положение пути
Path:=dir;
//Если этого пути нет в выпадающем списке ComboBox1
//То добавить его
if ComboBox1.Items.IndexOf(Path)=-1 then
ComboBox1.Items.Add(Path);
//Если количество элементов в ComboBox1 больше
//20 то удалить первый
if ComboBox1.Items.count>20 then
ComboBox1.Items.Delete(0);
//Показать путь в строке ComboBox1.Text
ComboBox1.Text:=Path;
end;
Листинг 3:
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
//Если ты дважды щелкнул по элементу «точка», то path:=’/’
if ListView1.Selected.Caption='.' then Path:='/'
else
//Если по двум точкам, то подняться на один уровень
if ListView1.Selected.Caption='..' then
begin
path:=copy(Path,1,Length(Path)-1);
Path:=ExtractFilePath(Path);
еnd
еlse
//Если ни то и не другое, то значит ты щелкнул по папке.
//Значит надо прибавить к текущему пути имя папки
Path:=Path+ListView1.Selected.Caption+'/';
//Перечитываем содержимое нового пути.
ListDir(Path);
end;