![](/user_photo/_userpic.png)
Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
SysUtils.FindClose(srNode);
end;
end;
TreeView1.EndUpdate;
// установка свойств ListView1 with ListView1 do
begin
Align:= alClient;
ViewStyle:= vsReport;
Columns.Add;
Columns.Items[0].Width:= 425;
ScrollBars:= ssAutoBoth;
SmallImages:= ImageList1;
end;
end;
procedure TForm1.ShowExpandNode(ParentNode: TTreeNode; DirName: string; ShowMode: integer;
IsinTListView: boolean);
var
srNode, srChild: TSearchRec; Node: TTreeNode; SearchMode: LongInt; ListItem: TListItem; searchMask: string;
begin
if not IsinTListView then path:= GetPath(ParentNode)
else
711
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
begin
if ShowMode = 1 then begin
oldpath:= path; ListView1.Clear;
end;
path:= GetPath_1(DirName, oldpath); end;
if ShowMode = 2 then SearchMode:= faAnyFile
else
SearchMode:= faDirectory;
if FindFirst(path + '*', SearchMode, srNode) = 0 then repeat
if ((srNode.Attr and faDirectory <> 0) and Real_Directory(srNode.Name)) or ((srNode.Attr and faDirectory = 0) and (ShowMode = 2)) then
begin
if ShowMode <> 2 then
if not IsinTListView then
Node:= TreeView1.Items.AddChild(ParentNode,
SysToUTF8(srNode.Name));
case ShowMode of 0: begin
Node.ImageIndex:= 0;
Node.SelectedIndex:= 0;
end; 1: begin
712
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
ListItem:= ListView1.Items.Add;
ListItem.Caption:= SysToUTF8(srNode.Name);
ListItem.ImageIndex:= 0
end;
2:if srNode.Attr and faDirectory = 0 then begin
if srNode.Attr and faHidden = 0 then begin
ListItem:= ListView1.Items.Add; ListItem.Caption:= SysToUTF8(srNode.Name);; ListItem.ImageIndex:= 1;
end;
end;
end;
if not IsinTListView then begin
{$IFDEF WINDOWS}
searchMask:= path + srNode.Name + '\*'; {$ELSE}
searchMask:= path + srNode.Name + '/*'; {$ENDIF}
if FindFirst(searchMask, faDirectory, srChild) = 0 then
repeat
if (srChild.Attr and faDirectory <> 0) and Real_Directory(srChild.Name)
then Node.HasChildren:= true;
until (FindNext(srChild) <> 0) or Node.HasChildren; SysUtils.FindClose(srChild);
713
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
end;
end;
until FindNext(srNode) <> 0; SysUtils.FindClose(srNode);
end;
procedure TForm1.ListView1DblClick(Sender: TObject); var
s: string; AProcess: TProcess; srNode: TSearchRec; DirName: string;
IsinTListView: boolean; begin
if ListView1.Selected = nil then exit; {$IFDEF WINDOWS}
s:= path + UTF8ToSys(ListView1.Selected.Caption); {$ELSE}
s:= path + ListView1.Selected.Caption; {$ENDIF}
if FindFirst(s, faAnyFile, srNode) = 0 then if (srNode.Attr and faDirectory) <> 0 then begin
DirName:= ListView1.Selected.Caption;
IsinTListView:= true;
ShowExpandNode(nil, DirName, 1, IsinTListView);
ShowExpandNode(nil, DirName, 2, IsinTListView);
SysUtils.FindClose(srNode);
exit;
714
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
end;
if (srNode.Attr and faHidden) = 0 then begin
AProcess:= TProcess.Create(nil);
{$IFDEF UNIX}
if MessageDlg('Открывать в терминале?', mtCustom, [mbYes, mbNO], 0) = mrYes then
s:= 'xterm -T ''Lazarus Run Output''' + ' -e $(TargetCmdLine)' + s;
{$ENDIF} AProcess.CommandLine:= s; AProcess.Execute; AProcess.Free;
end;
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
IsinTListView: boolean; begin
if Node = nil then exit; TreeView1.BeginUpdate; ListView1.BeginUpdate; ListView1.Clear; Node.DeleteChildren; IsinTListView:= false;
ShowExpandNode(Node, '', 1, IsinTListView); ShowExpandNode(Node, '', 2, IsinTListView); Node.Expanded:= true;
715
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
ListView1.EndUpdate;
TreeView1.EndUpdate;
end;
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
var
IsinTListView: boolean; begin
TreeView1.Items.BeginUpdate;
Node.DeleteChildren;
IsinTListView:= false;
ShowExpandNode(Node, '', 0, IsinTListView);
TreeView1.Items.EndUpdate;
end; initialization
{$I unit1.lrs} end.
Дальнейшее наполнение функциональностью нашего Проводника предос-
тавляю вам, уважаемый читатель. В частности, попробуйте сделать следующее
– при двойном клике на какой-нибудь файл необходимо запустить связанное с этим файлом приложение. Например, при двойном щелчке на файл *.doc дол-
жен запускаться текстовый редактор Word и в нем открываться этот файл.
Ну и все те функции, которыми должен обладать любой файловый менед-
жер, т.е. реализовать операции копирования, перемещения и удаления файлов и каталогов и пр.
Можете "замахнуться" на создание файлового менеджера типа
TotalCommander, Krusader или Double Commander (который, кстати, раз-
716
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F717x1.jpg)
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
рабатывается на Lazarus). Дело не в том, что вы будете "изобретать велосипед".
Это будет отличнейшей тренировкой для вас!
А я, с вашего позволения, перейду к рассмотрению других вопросов.
6.3.11 Организация меню. Механизм действий - Actions
6.3.11.1. Компонент TMainMenu
Рассмотрим способы создания и организации меню. В меню пользователь выбирает не данные, а возможные действия. Таким образом, меню это специ-
альный механизм, позволяющий пользователю внутри вашего приложения вы-
брать какие-то действия, например, открыть файл, сохранить файл, установить какие-то параметры и т.д.
Для создания главного меню используется компонент TMainMenu (вклад-
ка Standard). Компонент не визуальный. Пункты меню содержатся в свойст-
ве Items. Чтобы начать формирование пунктов меню достаточно дважды щелкнуть по компоненту на форме или нажать на кнопку с многоточием в свойстве Items компонента в инспекторе объектов. Откроется специальный редактор меню, рис. 6.82.
Рис. 6.82. Редактор меню
717
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F718x1.jpg)
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
В инспекторе объектов в свойство Caption введите имя пункта меню.
Чтобы создать следующий пункт меню или подменю, установите курсор на те-
кущий элемент меню и нажмите на правую клавишу мыши, рис. 6.83. Выберите нужное действие, например, для создания подменю нажмите "Создать подме-
ню", рис. 6.84.
Рис. 6.83. Контекстное меню редактора
Рис. 6.84. Пример создания подменю
Lazarus предоставляет возможность при создании меню применить шабло-
ны меню. Имеется три стандартных шаблона для меню "Файл", "Правка" и "Справка", рис. 6.85.
718
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F719x1.jpg)
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Рис. 6.85. Шаблоны меню
При создании меню имеется возможность вставки рядом с текстом пункта меню пиктограммы. Для этого поместите на форму компонент
TImageList, заполните его соответствующими рисунками. Затем в
TMainMenu в свойстве Images укажите имя TImageList в программе. А
при создании подпункта меню в свойстве ImageIndex укажите индекс соот-
ветствующего изображения.
Также вы можете добавить горячие клавиши для данного пункта меню.
Для этого служит свойство Shortcut. Вы можете прямо ввести нужное соче-
тание клавиш в поле ввода этого свойства или нажав на кнопку с многоточием,
выбрать нужное сочетание из появившегося редактора выбора сочетаний кла-
виш, рис. 6.86.
Рис. 6.86. Установка сочетаний клавиш
Для создания разделительной линии между пунктами меню достаточно
719
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F720x1.jpg)
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
создать новый элемент и в свойство Caption ввести знак "-".
Попробуйте реализовать пункт меню "Файл" Lazarus. Рисунки вы можете найти в папке установки Lazarus (подпапка Images), рис. 6.87.
Рис. 6.87. Пример создания меню
При этом вместо безликих имен пунктов меню (в программе) типа MenuItem1, MenuItem2 и т.д. желательно присваивать им осмысленные имена, на-
пример MCreateModule, MCreateForm.
Для того чтобы реализовать действие пункта меню необходимо написать соответствующий обработчик события OnClick. Находясь в редакторе меню,
достаточно просто дважды щелкнуть по этому пункту.
Еще с первой главы за мной тянется один должок. В 1.3.3. мы с вами рас-
сматривали метод наименьших квадратов, а программу мы так и не написали.
Но, как говорится, всему свое время. И вот это время наступило. Приступим к
720