Язык программирования Delphi. Эффективная работа с меню:
Сегодня я покажу тебе, как создавать симпотичные менюшки и как работать с ними. А самое главное, ты научишся создавать пункты меню в рантайме, что просто необходимо при создании и использовании закладок в твоих прогах. Короче говоря, сегодняшний примерчик будет просто супер.
Давай создадим новый проект. Брось на форму ControlBar из закладки Additional. Установи его свойство Align в alTop .
Теперь брось на ControlBar1 два компонента ToolBar из закладки Win32, они появятся у тебя с именами ToolBar1 и ToolBar2. Установи у обоих такие свойства:
AutoSize=true
Дважды щёлкни по EdgeBorders и откроется список параметров оборки. Выставь ebTop в false.
Flat=true
List=true (только для ToolBar1)
ShowCaptions=true (только для ToolBar1)
Рис 1. Окно настройки ImageList
Теперь брось на форму один компонент ImageList из закладки Win32. Дважды щёлкни по немуи добавь туда 4-е картинки (какие добавил я, смотри на рис 1). Картинки должны быть размером 16х16.
Едем далее. Брось на форму менюшку MainMenu из палитры Standart. Дважды щёлкни по ней, появится редактор меню с одним пустым элементом. Укажи его имя Caption равным, например, File и свойство Vasible=false. Появится два пустых элемента (справа, чтобы создать ещё одино выпадающее меню, и снизу, чтобы создать элемент выподающего меню). Поставб курсор на элемента снизу. Установи ему имя Caption=Файл и Name=FileMenu. Ещё ниже создай элемент с Caption=Правка и Name=EditMenu.
Рис 2. Окно настройки меню
Теперь создадим дополнительные менюшки меню. Выдели созданное тобой меню Файл , щёлкни по нему правой кнопкой мыши и выбери в появившемся меню пункт Create Submenu . Создай там несколько пунктов (можешь как я, см рис 2). Главное, чтобы у тебя там был пункт с именем История и с именем Name=HistoryMenu.
У ToolBar1 создай две кнопки с параметрами Caption равными Файл и Правка . У первой кнопки свойство MenuItem выставь в FileMenu, чтобы связать кнопку с пунктом Файл . У второй кнопки установи это же свойство в EditMenu.
Теперь у ToolBar2 установи свойство Images в ImageList1 и создай на этой панели четыре кнопки (для этого щёлкни правой кнопкой по ToolBar2 и выбери пункт New Button . У тебя должно получится нечто похожее на рис 2.
Всё, косметический ремонт закончен, теперь приступаем к программированию. Чуть не забыл. Брось ешё на форму OpenDialog из закладки Dialogs.
Создадим обработчик события для пункта меню "Открыть":
procedure TForm1.OpenMenuClick(Sender: TObject);
begin
// Выводим стандартное окно открытия файла
if not OpenDialog1.Execute then exit;
// Если файл выбран, то добавить его в меню "История"
AddLastFile(OpenDialog1.FileName);
end;
Когда пользователь щёлкнул по менюшке "Открыть". Функция AddLastFile добавляет новый элемент в список "История". Она объявлена в разделе private и выглядит как:
procedure TForm1.AddLastFile(Str: String);
var
NewItem: TMenuItem;
i:Integer;
begin
//Проверяем, есть ли уже такой элемент в меню "История"
//Если да, то выходим
for i:=0 to HistoryMenu.Count-1 do
if HistoryMenu.Items[i].Caption=Str then exit;
//Создаём новый элемент
NewItem := TMenuItem.Create(Self);
//Устанавливаем для него заголовок
NewItem.Caption:=Str;
//Устанавливаю событие OnClick
NewItem.OnClick:=LoadLastFile;
//Добавляю в меню "История"
HistoryMenu.Add(NewItem);
//Если список в меню "История" уже больше 7, то удаляю первый элемент
if HistoryMenu.Count>7 then
HistoryMenu.Delete(0);
end;
По событию OnClick я устанавливаю обработчик создаваемого элемента LoadLastFile. Он объявлен в разделе private:
private
{ Private declarations }
procedure AddLastFile(Str:String);
procedure LoadLastFile(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.LoadLastFile(Sender: TObject);
begin
end;
Эту функцию я оставлю пустой. Ты сам придумай, что в ней делать. Если у тебя это текстовый редактор, то прога должна уметь загрузить файлиз истории. Вот именно в этом обработчике это и надо делать. Это может выглядить так:
procedure TGiffer.LoadLastFile(Sender: TObject);
begin
//Если файл существует, то открыть его
if FileExists(TMenuItem(Sender).Caption) then
DoOpenFile(TMenuItem(Sender).Caption)
else
//Иначе сообщение об ошибке
Application.MessageBox('Файл уже удалён.','Error!',
MB_OK + MB_ICONINFORMATION);
end;
Хочу тебя предупредить, что путь будет немного искорёжен. В параметре TMenuItem(Sender).Caption может содержатся, например, "E:\&Projects\Temp\VR\Project1.dof". Как видишь, в этой строке содержится ненужный знак &. Я с ним уже намучился очень много и автоматом он убирается не всегда. Лучше удаляй его в ручную:
//Ищем, символ & в строке TMenuItem(Sender).Caption
index:=pos('&', TMenuItem(Sender).Caption);
//Удаляем один символ в строке TMenuItem(Sender).Caption
//начиная с позиции index и всего 1 символ.
Delete(TMenuItem(Sender).Caption,index,1);
По событию формы OnClose я сохраняю состояние истории:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
FileList:TStrings;
i:Integer;
begin
//Создаю строковый список элементов
FileList:=TStringList.Create;
//Заполняю его
for i:=0 to HistoryMenu.Count-1 do
FileList.Add(HistoryMenu.Items[i].Caption);
//Сохраняю в файл
FileList.SaveToFile(ExtractFilePath(Application.ExeName)+'File.dat');
//Удаляю список
FileList.Free;
end;
По событию OnShow я загружаю элементы
procedure TForm1.FormShow(Sender: TObject);
var
FileList:TStrings;
i:Integer;
begin
//Если файл существует, то вперёд!!!
if FileExists(ExtractFilePath(Application.ExeName)+'File.dat') then
begin
//Создаю список элементов
FileList:=TStringList.Create;
//Загружаю историю
FileList.LoadFromFile(ExtractFilePath(Application.ExeName)+'File.dat');
//Добавляю элементы
for i:=0 to FileList.Count-1 do
AddLastFile(FileList.Strings[i]);
//Очищаю список
FileList.Free;
end;
end;
Напоследок, хочу посоветовать у всех кнопок, с которыми связаны меню установить свойство Grouped в true. Тогда кнопки будут выглядить как настоящие меню.