Эффективная работа с меню

Сегодня я покажу тебе, как создавать симпотичные менюшки и как работать с ними. А самое главное, ты научишся создавать пункты меню в рантайме, что просто необходимо при создании и использовании закладок в твоих прогах. Короче говоря, сегодняшний примерчик будет просто супер.

Давай создадим новый проект. Брось на форму ControlBar из закладки Additional. Установи его свойство Align в alTop .

Теперь брось на ControlBar1 два компонента ToolBar из закладки Win32, они появятся у тебя с именами ToolBar1 и ToolBar2. Установи у обоих такие свойства:

AutoSize=true

Дважды щёлкни по EdgeBorders и откроется список параметров оборки. Выставь ebTop в false.
Flat=true
List=true (только для ToolBar1)

ShowCaptions=true (только для ToolBar1)
Теперь брось на форму один компонент ImageList из закладки Win32. Дважды щёлкни по немуи добавь туда 4-е картинки (какие добавил я, смотри на рис 1). Картинки должны быть размером 16х16.

Едем далее. Брось на форму менюшку MainMenu из палитры Standart. Дважды щёлкни по ней, появится редактор меню с одним пустым элементом. Укажи его имя Caption равным, например, File и свойство Vasible=false. Появится два пустых элемента (справа, чтобы создать ещё одино выпадающее меню, и снизу, чтобы создать элемент выподающего меню). Поставб курсор на элемента снизу. Установи ему имя Caption=Файл и Name=FileMenu. Ещё ниже создай элемент с Caption=Правка и Name=EditMenu.

Теперь создадим дополнительные менюшки меню. Выдели созданное тобой меню Файл , щёлкни по нему правой кнопкой мыши и выбери в появившемся меню пункт 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. Тогда кнопки будут выглядить как настоящие меню.

Вот и всё!!! Наша крутая менюшка готова.
Теги:
меню
Добавлено: 30 Июля 2018 19:49:07 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...