пятница, 31 мая 2013 г.

Работа с файлами в Delphi

Работа с файлами важная вещь в любом языке программирования. Работа с файлами в Delphi позволяет считывать, сохранять информацию, и выполнять другие действия с файлами. В Delphi поддерживаются все операции с файлами - создание, поиск, чтение и запись, переименование как файлов, так и к директорий. В Delphi существует несколько способов работы с файлами.

Для "лирического" вступления нужно упомянуть компоненты Delphi, которые умеют работать с файлами. Они читают и сохраняют своё содержимое, строки типа String, в файл текстового формата. Это компоненты ListBox, ComboBox и Memo, расположенные на первой же вкладке палитры компонентов.

Каждая строка компонентов ListBox и ComboBox является объектом Items[i], а Memo - Lines[i], где i- номер строки, который отсчитывается от нуля. Добавление строк в компоненты выполняется методами Add и Insert:

begin
Memo1.Lines.Add('Первая строка');
ComboBox1.Items.Add('Первая строка');
ComboBox1.Items.Add('Вторая строка');
ListBox1.Items.Add('Первая строка');
ListBox1.Items.Add('Вторая строка');
end;

Метод Add добавляет новую строку в конец. Метод Insert имеет дополнительный параметр, указывающий, после какой строки разместить новую строку. Доступ к строкам осуществляется так:

ComboBox1.Items[0] := 'Первая строка изменилась' ;
ListBox1.Items[1] := 'Вторая строка изменилась' ;

У компонента ComboBox дополнительно есть свойство Text, где (как и у компонента Edit) находится вводимый текст:
ComboBox1.Text := ' Вводимый текст ';

На выделенную в данный момент строку компонента ComboBox указывает свойство ItemIndex типаInteger, то есть это номер выделенной строки. Следовательно, получить саму выделенную строку компонента ComboBox можно следующей конструкцией:

S:=ComboBox1.Items[ComboBox1.ItemIndex];

или, пользуясь оператором присоединения

With ComboBox1 do
S:=Items[ItemIndex];

Вот как по нажатию клавиши Enter можно заносить в этот компонент вводимую в строку информацию и удалять нажатием Escape:
Выделите на Форме ComboBox и перейдите в Инспектор объектов, на вкладку Events. Щёлкните дважды по обработчику OnKeyPress. Система Delphi создаст заготовку обработчика. Напишите:

begin
if Key=#13 then
ComboBox1.Items.Add(ComboBox1.Text);
if Key=#27 then
ComboBox1.Items.Delete(ComboBox1.Items.Count-1);
end;

Key - определённая в этом обработчике переменная, содержащая код нажатой клавиши, #13 и #27 - коды клавиш Enter и Escape соответственно. Items.Count - количество содержащихся в компоненте строк. Так как отсчёт строк идёт от нуля, мы отнимаем единицу. После очередного удаления количество строк меняется, таким образом, Items.Count-1 всегда указывает на последнюю строку. Последовательно нажимая Escape, мы можем удалить все строки. Командой
   ComboBox1.Items.Delete(0);
можно добиться того же эффекта, только удаляться будут первые строки. Впрочем, чтобы стереть всё сразу, есть метод Clear!

Ну а теперь собственно о сохранении содержимого в файл. Для этого выполните команду

   ListBox1.Items.SaveToFile(' Имя_файла.txt ') ;

Впрочем, расширение можно поставить любое по желанию, не обязательно .txt, как и вообще без него обойтись. Но расширение .txt позволит легко открыть файл стандартным виндовским Блокнотом, что бывает очень удобно на этапе написания программы!
Для загрузки служит метод LoadFromFile:

   ListBox1.Items.LoadFromFile(' Имя_файла.txt ') ;

Что делать, если в своей программе мы не работаем с компонентами Combobox, ListBox или Memo, а сохранять информацию нужно? Берём один из компонентов и делаем его невидимым, для этого в Инспекторе Объектов ставим в свойство Visible значение False. Функциональность его от этого не изменится!

Последний штрих - создадим программу, сохраняющую своё положение на экране в момент закрытия и там же открывающуюся. Нам нужно сохранить два параметра - значения свойств Формы Left и Top, это расстояние от левого и верхнего краёв экрана соответственно. Значения эти выражаются в пикселах и имеют тип Integer. Необходимо перевести эти числа в строку (тип String) с помощью оператора IntToStr. Итак, разместите на Форме невидимый ListBox, щёлкните по пустому местуФормы, чтобы её свйства появились в Инспекторе объектов, и перейдите на вкладку Events. Щёлкните по обработчику OnClose и в созданной заготовке напишите:

  begin
   ListBox1.Items.Clear;
   ListBox1.Items.Add(IntToStr(Form1.Left));
   ListBox1.Items.Add(IntToStr(Form1.Top));
   ListBox1.Items.SaveToFile('MyFormPos.txt');
  end ;

Этот обработчик сохраняет положение Формы на экране. Теперь напишем обработчик, помещающийФорму на прежнее место при старте программы. Создайте заготовку обработчика события OnCreate. Это событие происходит в момент "создания" Формы операционной системой. В этот момент и нужно присваивать ей необходимые свойства. Пишите:

  begin
   if FileExists('MyFormPos.txt') then
    begin
     ListBox1.Items.LoadFromFile('MyFormPos.txt');
     Form1.Left:=StrToInt(ListBox1.Items[0]);
     Form1.Top:=StrToInt(ListBox1.Items[1]);
    end ;
  end ;

   В первой строке происходит проверка на существование файла, ведь если его не будет, произойдёт ошибка. Впрочем, программа после выдачи предупреждения откроется в том месте, где была на этапе проектирования, а при закрытии нужный файл будет воссоздан!
   Затем в логических скобках begin / end содержится сам код, который будет выполнен только приналичии файла MyFormPos.txt в папке с программой, так как используется относительный путь. Можно указать конкретное местоположение, например, C:\Program Files\MyProg\MyFormPos.txt.

понедельник, 19 ноября 2012 г.

Отправка email из Delphi


Диалоги открытия и сохранения файлов


Рассмотрим компоненты, позволяющие в работающей программе осуществлять выбор файлов. Delphi диалоги выбора файла позволяют указать программе, с каким файлом мы хотим работать.
На вкладке палитры компонентов Dialogs находятся компонент Delphi OpenDialog и компонент Delphi SaveDialog. Все Delphi диалоги, находящиеся на этой вкладке, в том числе и Delphi диалоги выбора файла, невизуальные, т.е. при переносе их на Форму в работающей программе их не видно, они видны только на этапе конструирования. Компонент Delphi OpenDialog позволяет открыть в нашей программе стандартное Windows-окно диалога открытия файла, компонент Delphi SaveDialog - окно диалога сохранения.
Delphi диалоги выбора файла сами по себе ничего не делают, а только предоставляют настройки, сделанные пользователем при выборе файла. Самый важный метод Delphi диалогов - Execute. Он срабатывает в момент нажатия кнопки "открыть" или "сохранить" в окне выбора файла. Для примера давайте введём в программу возможность выбора файла для загрузки в редактор Memo, и сохранения после редактирования.
Итак, кидаем на Форму оба Delphi диалога, текстовый редактор Memo, и тчетыре кнопки Button. В свойство Caption одной из них записываем "Открыть...", другой - "Сохранить", третьей - "Сохранить как...и “Закрыть”.



среда, 28 декабря 2011 г.

Экспорт базы данных в Excel


Просмотрим процесс выгрузки данных в MS Excel из базы данных.
Для этого создадим новый проект.
На форму помещаем следующие объекты управления:
- TabbedNotebook - является как бы соединением двух компонентов: пачки панелей (страниц) NoteBook и набора закладок TabSet. Эти два компонента могут использоваться и раздельно. Компонент TabSet во многом аналогичен рассмотренному ранее 32-разрядному компоненту TabControl. Это многопозиционный управляющий элемент, который сам по себе не имеет никакой панели. Его основное свойство — Tabs типа TStrings. Задавая строки этого свойства вы тем самым определяете число закладок и их надписи. Свойства StartMargin и EndMargin определяют поля — расстояния крайних закладок от краев компонента. Сами закладки всегда направлены вниз. Поэтому компонентTabSet надо располагать внизу управляемого им компонента. Свойство AutoScroll определяет появление кнопок при большом количестве закладок, которые позволяют пользователю прокручивать полосу закладок, как это делается в компонентах PageControl и TabControl при MultiLine = false. Индекс выбранной закладки определяется свойствомTabIndex, значение которого можно устанавливать и можно читать в обработчике события OnChange, происходящего при смене пользователем закладки и идентичного такому событию в компоненте TabbedNoteBook.
Компонент NoteBook является пачкой панелей, имена и количество которых определяются свойством Pages, как в компоненте TabbedNoteBook. Индекс выбранной страницы определяется свойством PageIndex. В этом компоненте отсутствует управляющий элемент — закладки. Так что страницы можно переключать какими-то кнопками, переключать их в зависимости от действий пользователя, в зависимости от отображаемых данных и т.п. Компоненты NoteBook и TabSet могут быть, конечно, объединены программно в компонент, аналогичный TabbedNoteBook. Для этого достаточно в обработчик события OnChange компонента TabSet вставить оператор
Notebook1.PageIndex := NewTab;
- на объект TabbedNotebook  помещаем объект DBGrid с вкладки Data Controls
- два объекта Button (кнопка) с вкладки Standard и присваиваем им новые имена, соответственно: Button1 – BtnDB с заголовком «Выбрать базу данных», Button2 – BtnExport с заголовком «Экспорт базы данных в Excel»;
- OpenDialog с вкладки Dialog;
- TableDB, являющийся объектом Table с вкладки BDE;
- DataSource с вкладки Data Access.



В объект DBGrid будет переноситься база выбранная база данных при нажатии кнопки BtnDB.
На кнопку BtnDB назначаем выполнение процедуры:

procedure TForm1.BtnDBClick(Sender: TObject);
begin
 if OpenDialog.Execute
 then
  begin
   TableDB.Active:=false;
   TableDB.TableName:=OpenDialog.FileName;
   TableDB.Active:=true;
  end;
end;

На открытие формы определяем выполнение следующей процедуры:

procedure TForm1.FormCreate(Sender: TObject);
begin
 OpenDialog.InitialDir:=ExtractFilePath(Application.ExeName);
end;

А на кнопку BtnExport:

procedure TForm1.BtnExportClick(Sender: TObject);
var
 XL, XArr: Variant;
 i: Integer;
 j: Integer;
begin
 {не забудьте включить ComObj в список используемых модулей}
 // Создаем массив элементов, полученных в результате запроса
 XArr:=VarArrayCreate([1,TableDB.FieldCount],varVariant);
 XL:=CreateOLEObject('Excel.Application');     // Создание OLE объекта
 XL.WorkBooks.add;
 XL.visible:=true;

 j := 1;
 TableDB.First;
 while not TableDB.Eof do
  begin
   i:=1;
   while i<=TableDB.FieldCount do
    begin
     XArr[i] := TableDB.Fields[i-1].Value;
     i := i+1;
    end;
   XL.Range['A'+IntToStr(j),
   CHR(64+TableDB.FieldCount)+IntToStr(j)].Value := XArr;
   TableDB.Next;
   j:=j+1;
  end;
 XL.Range['A1',CHR(64+TableDB.FieldCount)+IntToStr(j)].select;
 // XL.cells.select;                     // Выбираем все
 XL.Selection.Font.Name:='Arial cur';
 XL.Selection.Font.Size:=10;
 XL.selection.Columns.AutoFit;
 XL.Range['A1','A1'].select;
end;


воскресенье, 25 декабря 2011 г.

Фильтрация записей-Фильтрация данных


Фильтрация - задание ограничений для записей, которые должны войти в набор данных. Состав записей в наборе данных в определенный момент времени зависит от устанавливаемых ограничений, в том  числе и фильтрации. Delphi представляет возможность выполнения двух следующих вариантов фильтрации записей наборов данных:
- по выражению;
- по диапазону.

Фильтрация по выражению

При фильтрации по выражению набор данных ограничивается записями, удовлетворяющими фильтру, задающему условия отбора записей. Поскольку в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна пр небольшом количестве записей.
Для определения выражения фильтра используется свойство Filter типа String. выражение фильтра представляет собой конструкцию, в состав которой могут входить следующие элементы:
- имена полей таблиц;
- литералы;
- операции сравнения;
- арифметические операции;
- логические операции;
- круглые и квадратные скобки.
Если имя поля содержит пробелы, то его заключают в квадратные скобки, в противном случае квадратные скобки не нужны.
Литерал представляет собой значение, заданное явно (например, число, строка или символ).
Операции сравнения представляют собой  обычные для языка Pascal отношения <,>,=,<=,>= и <>.
Арифметическими являются операции +, -, * и / (сложение, вычитание, умножение, деление).
В качестве логических операций можно использовать AND, OR и NOT (логическое умножение, сложение и отрицание соответственно).
Круглые скобки применяются для изменения порядка выполнения арифметических и логических операций.
Для активации и деактивации фильтра используется свойство Filtered типа Boolean. По умолчанию это свойство имеет значение False (фильтрация не подходит). При установке свойстве Filtered значения True фильтрация включается, и в набор данных отбираются те данные, которые удовлетворяют фильтру, записанному в свойстве Filter. Если выражение фильтра не задано, то в набор данных попадают все записи.
Параметры фильтрации можно задать с помощью свойств FilterOptions типа TFilterOptions. Это свойство принадлежит к множественному типу и может принимать комбинации двух значений:
- foCaseIntensitive - регистр букв не учитывается. Например, при наличии этого значения для выражения фильтра Avtor='Автомат' в поле Avtor, например, могут содержаться слова Автомат, АВТОМАТ или автомат, которые будут восприниматься как одинаковые.
- foNoPartialCompare - выполняется проверка на полное соответствие содержимого поля и значение, заданного для поиска. Обычно применяется для строк. Если известны только первые символы или символ строки, то нужно указать их в выражении фильтра, заменив остальные символы символом "*" и выключив значение FoNoPartialCompare.
По умолчанию все фильтры выключены и свойство FilterOptions имеет значение [].
Рассмотрим в качестве примера обработки событий формы, использующей фильтрацию записей набора данных по выражению. Вид формы представлен на рисунке 1.

Для создания выражений фильтра используются редакторы Edit. Компонент Edit1 и Edit2 предназначены для задания выражения при фильтрации.
На форму помещаются две кнопки Button. При нажатии кнопки Button3 с заголовком "Фильтровать" фильтр активируется путем присваивания значения True свойству Filtered набора данных. При активизации фильтра происходит отбор записей, которые удовлетворяют заданному в выражениях условию. При нажатии на кнопку Button4 с заголовком "Отменить" показываются все записи, фильтр при этом отключается.
Ниже представлены программные коды (обработчики событий) модуля формы, предназначенные для фильтрации:

procedure TForm3.Button3Click(Sender: TObject);
begin
if RadioButton1.Checked then
begin
DataModule2.TTovar.FilterOptions:=[];
DataModule2.TTovar.Filter:='Naim='''+Edit1.Text+'*''';
DataModule2.TTovar.Filtered:=True;
beep;
end;
if RadioButton2.Checked then
begin
DataModule2.TTovar.FilterOptions:=[];
DataModule2.TTovar.Filter:='Uhet_zena='''+Edit2.Text+'''';
DataModule2.TTovar.Filtered:=True;
beep;
end;
end;
procedure TForm3.Button4Click(Sender: TObject);
begin
DataModule2.TTovar.Filtered:=false;
end;

Фильтрация по диапазону

При фильтрации по диапазону в набор данных данных будут включены те записи, значение полей которых соответствуют заданному диапазону. Таким образом, условием фильтрации является выражение вида:
значение > нижней границы AND значение < верхней границы

в которой вместо операций сравнения <и> могут указываться операции <= и >=. Такая фильтрация применяется к набору данных Table.
Достоинством фильтрации по диапазону является высокая скорость обработки записей. В отличи от фильтрации по выражению, когда последовательно просматриваются все записи таблицы, фильтрация по диапазону ведется индексно-последовательным методом, поэтому этот способ фильтрации применим только для индексных полей. Индекс поля, диапазон которого задан в качестве критерия для отбора записей, должен быть установлен как текущий с помощью свойства IndexName или IndexFieldNames.

Рассмотрим в качестве примера обработчики событий формы, использующей фильтрацию записей набора данных по выражению. Вид формы приведён на рисунке 2.

Для задания выражений фильтра используются редакторы Edit. Компонент Edit2 предназначен для задания выражения при фильтрации по подгруппе станка, компоненты Edit3 и Edit4 задают соответственно минимальную и максимальную границу значения поля D_max.
На форму помещаются две кнопки Button. При нажатии кнопки Button11 с заголовком “Фильтровать” фильтр активизируется путём присваивания значения True свойству Filtered набора данных. При активизации фильтра происходит отбор записей, которые удовлетворяют заданному в выражениях условию. При нажатии кнопки Button12 с заголовком “Отменить” показываются все записи, фильтр при этом отключается.
Ниже приведены программные коды (обработчики событий) модуля формы Form3, предназначенные для фильтрации:
Procedure TForm3.Button11Click(Sender:TObject);
begin
if RadioButton1.Checked then
begin
Table1.FilterOptions:=[foCaseInsensitive];
Table1.Filter:=’Podgrup=’”+edit2.text+’*’”;
Table1.Filtered:=True;
beep;
end;
if RadioButton2.Checked then
begin
Table1.Filter:=’max_d>=’+edit3.text+’AND max_d<=’+edit4.text;
Table1.Filtered:=True;
beep;
end;
            end;

Кнопки для управление данными на форме

При реализации системы в Delphi, необходимо предусмотреть управление данными в форме, то есть осуществление добавление, удаление и редактирование данных, так же перемещение по записям.
при создании формы с помощью Мастер формы баз данных вверху формы автоматически размещается навигатор, который представляет собой небольшую группу кнопок, связанных с одним набором данных. Навигатор DBNavigator является визуальным компонентом, расположенным на странице Data Controls. Каждая кнопка навигатора выполняет определенную функцию базы данных.
Состав видимых кнопок определяет свойство VisibleButtons. Устанавливая для каждой из кнопок значение True или False в свойстве VisibleButtons, программист может формировать внешний вид навигатора.
Подсказку для каждой из кнопок можно установить с помощью свойства Hint типа TString. Для отображения подсказок необходимо установить значение True для свойства ShowHint. Вызвав строковый редактор String List Editor (нажав на кнопку ... в свойстве Hint), можно вести русские названия соответствующих кнопок.
Для связи навигатора с набором данных для свойства DataSource указывается соответствующие значение компонента DataSource.
реализация функции, выполняемых кнопками навигатора, возможна с помощью кнопок Button. В качестве примера рассмотрим создание групп кнопок на форме представленной ниже.
Для этого поместим на форму восемь компонентов Button (кнопка), находящаяся на странице Standard. Поскольку нажатие на каждую из кнопок должно приводить к стандартным процедурам навигатора базы данных, то в программном коде необходимо вызвать процедуры, присвоенные каждой кнопке формы. программные коды для кнопок управления имеют следующий вид:
Кнопка "Добавить":

procedure TForm5.Button1Click(Sender: TObject);
begin
DataModule2.TKlient.Insert;
end;
Кнопка "Сохранить":
procedure TForm5.Button2Click(Sender: TObject);
begin
DataModule2.TKlient.Post;
end;
Кнопка "Удалить":
procedure TForm5.Button3Click(Sender: TObject);
begin
DataModule2.TKlient.Delete;
end;
Кнопка "Обновить":
procedure TForm5.Button4Click(Sender: TObject);
begin
DataModule2.TKlient.Refresh;
end;
Кнопки, осуществляющие перемещение по записям формы:
Кнопка "Первая":
procedure TForm5.Button5Click(Sender: TObject);
begin
DataModule2.TKlient.First;
end;
Кнопка "Следующая":
procedure TForm5.Button6Click(Sender: TObject);
begin
DataModule2.TKlient.Next;
end;
Кнопка "Предыдущая":
procedure TForm5.Button7Click(Sender: TObject);
begin
DataModule2.TKlient.Prior;
end;
Кнопка "Последняя":
procedure TForm5.Button8Click(Sender: TObject);
begin
DataModule2.TKlient.Last;
end;
Так же на форме определим кнопку, осуществляющую переход на  указанный номер строки, для этого справа от кнопки "Перейти на" необходимо поместить визуальный компонент Edit (однострочный редактор), взяты со страницы DataControls. Этот компонент используется для ввода и отображения текста. В Инструкторе свойства объекта задать значение по умолчанию "1" свойству Text. И назначаем на нее выполнение следующей процедуры:
procedure TForm5.Button9Click(Sender: TObject);
begin
DataModule2.TKlient.RecNo=StrToInt(Edit1.Text);
end;
Для каждого компонента Button необходимо задать соответствующие значения в свойстве Caption.

среда, 23 ноября 2011 г.

Создание меню в Delphi


Система визуального программирования Delphi относится к RAD – системам (Rapid Application Development, быстрая разработка приложений), позволяющая быстро и эффективно разрабатывать приложения, включая и приложения для работы с базами данных. Кроме того, обладает практически всеми возможностями современных СУБД, таких как, например, Microsoft Access или Visual Fox Pro. Она имеет развитые возможности по созданию пользовательского интерфейса с помощью широкого набора инструментальных программных средств, позволяет визуально подготавливать запросы к
базам данных, а также непосредственно писать запросы на языке SQL.
Разработка приложения осуществляется в окне Конструктора формы Form1, которое наряду с главным окном Delphi – Project1 и окном инспектора объектов появляется после загрузки Delphi командой Пуск | Программы | Borland Delphi | Delphi.
При первой загрузке Delphi по умолчанию создает «пустой» файл проекта. Для создания собственного проекта необходимо выполнить команду File | New | Application. В результате создания нового проекта на экране появится окно Форм с заголовком Form1 и окно редактора кода с модулем Unit1.pas и файлом проекта Project1.dpr, эти окна можно размещать так, как удобно пользователю. В одно и то же время может быть открыт только один проект, поэтому перед сохранением нового проекта Delphi спрашивает нужно ли сохранить текущее приложение.
Форма является основой, на которой размещаются необходимые компоненты, используемые приложением для выполнения возложенных на него функций и задач. Создание приложений в Delphi включает следующие этапы:
а) создание визуального интерфейса приложения, для этого выбираются необходимые компоненты из Палитры компонентов и размещаются на форме;
б) установка при помощи окна Object Inspector свойств формы и элементов управления, что необходимо для придания объектам определенного вида и законов их поведения;
в) связывание с компонентами кода на языке Object Pascal для обработки событий, возникающих при использовании мыши, клавиатуры, системных событий и тому подобное.
Создание приложений при помощи визуальных компонентов следует широко применяемому в различных программных продуктах принципу WYSIWYG (What You See Is What You Get – что видишь, то и получишь) и поэтому то, что появляется на экране во время разработки, будет соответствовать тому, что наблюдаться во время выполнения приложения.
Простейшим компонентом для обработки текста является Label (Метка), доступным на странице Standard ( ). Компонент представляет собой статический текст и применяется для идентификации других объектов приложения, он может помочь пользователю сориентироваться и обеспечит его необходимой информацией.
Пусть необходимо создать форму в виде, представленном на рисунке  1 Для создания заголовка формы помещается компонент Label, для того  необходимо выбрать его на странице Standard, щелкнув на нем левой кнопкой мыши. Затем передвинуть указатель к тому месту, где надо разместить  объект. В окне Object Inspector необходимо задать свойства компонента.
Для любого элемента управления значение свойства Caption всегда соответствует надписи на самом элементе управления. Поэтому для задания заголовка формы с помощью компонента Label установим значение его свойства Caption – «Выбор группы станков». При запуске приложения введенное значение будет той же надписью, которое отобразится на элементе управления.
 Для работы многих приложений требуется выбор одного из вариантов, перечень которых задается в виде списка (меню). Создание такого режима можно организовать с помощью визуального компонента RadioButton (радиокнопка), расположенного на странице Standard ( ). Компоненты RadioButton, собранные в одну группу, могут применяться для создания списка. В один момент может быть выбран только один из группы переключателей. Набор альтернатив, из которых выбирается одна, реализуется требуемым количеством радиокнопок, размещенных в одном контейнере (форме, панели и тому подобное).
Для реализации формы «Выбор группы станков» (рисунок 1) на форме располагается пять компонентов RadioButton. Каждому компоненту необходимо установить в окне Инспектора объектов свое значение свойства Caption:
кнопке RadioButton1 - «Токарные»;
RadioButton 2 - «Сверлильные»;
RadioButton3 -«Шлифовальные»;
RadioButton4 - «Фрезерные»;
RadioButton 5- «Выход».
Пусть только выбор варианта «Токарные» из предложенного списка приведет к дальнейшей работе приложения, остальные группы станков недоступны, а выбор «Выход» позволит закрыть работу приложения. Пусть необходимо на создаваемой форме разместить компонент Button (Кнопка) на странице Standart ( ), который обеспечит переход к следующему шагу работы проекта. Для компонента Button в свойство Caption вводится значение «Далее». Поскольку нажатие кнопки должно привести к определенным полезным действиям, необходимо задать набор событий, которые этот объект может обрабатывать. Для генерации блока кода обработчика события надо сделать двойной щелчок мышью на объекте. Курсор окажется в окне Редактора кода. Курсор будет находиться внутри пустой процедуры Button1Click, в которой между операторами цикла begin…end нужно ввести необходимый программный код. Процедура для кнопки Button должна выглядеть следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
begin
if RadioButton1.Checked then form2.showmodal;
if RadioButton2.Checked then showmessage('Данная группа станков не-
доступна');
if RadioButton3.Checked then showmessage('Данная группа станков не-
доступна');
if RadioButton4.Checked then showmessage('Данная группа станков не-
доступна');
if RadioButton5.Checked then form1.Close;
end;

Если был выбран вариант «Токарные» в форме «Выбор группы станков», то на экране должна появиться следующая форма Form2, в которой предлагается выбрать тип станка, аналогично той , которая показана на рисунке 2. Для открытия новой формы выполняется команда File | New | Form. Эта команда создаст новую форму и добавит ее к текущему проекту.
Создание главного и выпадающего меню возможно с помощью Конструктора меню, который позволяет также проверить структуру меню во время разработки приложения. Необходимо выполнить следующие этапы:
а) поместить невизуальный компонент MainMenu (главное меню) со страницы Standard на форму;
б) сделать двойной щелчок мышью на компоненте меню, в результате будет выделен первый пункт меню, который еще предстоит определить;
в) ввести имя меню верхнего уровня (например, «Типы станков») и нажать клавишу Enter, в результате имя пункта меню верхнего уровня появится на панели меню приложения;
г) заполнить подпункты первого пункта нужными именами;
д) заполнять следующие пункты и подпункты до тех пор, пока не будет создана задуманная структура.
При создании меню появляются пустые графы ниже последнего подпункта в выпадающем меню и вправо от последнего пункта в окне меню. На них щелкают, когда требуется добавить новые пункты. Подразделы выпадающего меню можно отделять разделительной линией между ними, для этого используют вместо подписи несколько символов минус (-). Назначать имя разделителю не обязательно. Он полезен для визуального разбиения пунктов меню на отдельные группы. Его применение сделает интерфейс приложения более удобным и дружественным пользователю.
Во время разработки приложения или во время его выполнения некоторые пункты меню можно сделать недоступными. Деактивация пунктов меню выполняется следующим образом:
- выбрать редактируемый пункт (или подпункт меню);
- дважды нажать на нем мышью;
- в Инспекторе объектов установить свойству Enabled значение
False.
В результате выполненных действий в недоступных пунктах текст отобразится серым цветом.
Закончив построение меню и щелкнув на кнопке закрытия окна конструктора меню, можно просмотреть пункты меню, как в обычном меню, выбирая их или проводя над ними мышь с нажатой кнопкой.
Чтобы добавить код для любого из пунктов, необходимо дважды щелкнуть на нужном пункте меню, в результате откроется участок кода, соответствующий процедуре обработки события выбора этого пункта.
В качестве примера ниже приведены процедуры, обеспечивающие в форме, приведенной на рисунке 2, при выборе подпункта «Автоматы и полуавтоматы» открытие формы Form3, а при выборе подпункта «Выход» закрытие формы Form2 .

Для подпункта «Автоматы и полуавтоматы»:

procedure TForm2.N2Click(Sender: TObject);
 begin
 Form3.showmodal;
 end;

Для подпункта «Выход»:

procedure TForm2.N5Click(Sender: TObject);
begin
 form2.Close;
end;