Продолжаем понемногу писать текстовый редактор. Последний вариант редактирования можно скачать с прошлого урока здесь.
В почти каждом MDI-приложении есть меню "Окно" или "Window", в котором первыми пунктами стоят различного рода операции с позиционированием дочерних окон. Сделаем что-то подобное в нашем многооконном приложении.
Открываем проект на приложении в среде программирования Delphi. Комбинацией клавиш Shift+F12 выводим на экран главную форму MainForm.
Начиная с версии Delphi 4, на странице палитры компонентов Standart есть компонент TActionList. Его назначение, а также другие полезные компоненты можно узнать из урока№ 6. Устанавливаем этот компонент на проектировочную форму MainForm. Дважды щелкаем по нему мышкой или выбираем пункт "Action List Editor" из выпадающего меню по правой кнопке мыши. Открывается окно изменения действий. Нажимаем комбинацию клавиш Ctrl+Ins, или выбираем пункт "New Standart Action" из ниспадаюшего меню на желтой кнопки.
Появляется окно добавления стандартных действий, которые в последствии можно привязать к пунктам меню или кнопкам.
С помощью нажатой кнопки Shift или Ctrl выберите все стандартные действия, которые относятся к категории Window. Это и есть действия управлением состоянием окон. Нажимаем на кнопку Ok. Теперь вы видите, что в списке действий появилась категория Window (в левой части), в которой находятся все выбранные стандартные действия с окнами (в правой части).
По умолчанию все стандартные действия будут иметь названия на английском языке, поэтому будем из русифицировать вручную. Выбираем первый пункт списка действий Arrange1 и меняем свойство Caption на "Упорядочить значки". Здесь вы сразу заметите, что изначально это свойство имеет значение "&Arrange". Знак амперсанта означает, что следующий за ним символ будет подчеркнут. Это свойство полезно для быстрого выбора пункта данного меню с помощью горячей подчеркнутой клавиши, когда меню активизировано (подробнее можно узнать из справочной системы Windows). Вы сами можете назначать свои буквы быстрого доступа к пунктам меню самостоятельно. Скажу только, что за свою многолетнюю практику ни разу не встречал человека, который пользовался бы таким доступом в меню, поэтому в своих программах подчеркнутых букв не делаю. Но вы пожете не пренебрегать правилами хорошего тона в программировани и все делать по правилам.
Таким образом меняем свойства Caption для всех действий, согласно таблице
&Arrange | Упорядочить значки |
&Cascade | Каскадом |
C&lose | Закрыть |
&Minimize All | Минимизировать все |
Tile &Horizontally | Упорядочить по горизонтали |
&Tile Vertically | Упорядочить по вертикали |
Теперь можно закрыть окно с действиями. Вызываем проектировщик пунктов меню MainMenu1 для формы MainForm.
Удаляем все пункты из меню "Окна". Там из наших первых уроков присутствует только один пункт "Упорядочить". Дальше все довольно просто. Для первого пустого пункта меню изменяем свойство Action в Arrange1. Этот пункт меню сразу изменит свое название на "Упорядочить значки". В проектировщике меню сразу добавляется новый пункт. Изменяем его свойство Action на Cascade1.
И так далее. Добавляем в меню все стандартные действия с окнами.
Теперь сохраняйте проект и запускайте приложение на выполнение. Обратите внимание, что если дочерних окон нет, то эти пункты меню становятся серыми и недоступными для пользователя.
Еще раз отмечу прелесть визуального программирования. На этом примере вы убедились, что можно не писать ни строчки программного кода в редакторе, а добавлять необходимые компоненты, изменять некоторые свойства и в результате получается некоторое работоспособное приложение.
У нас остался незадействованным меню "Правка". Там содержатся три стандартных пункта "Вырезать", "Копировать" и "Вставить". Эти действия являются стандартными и содержатся в списке стандартных действий в ActionList1. Они находятся в категории Edit. Добавьте их в список действий самостоятельно. Не забудьте о русификации свойства Caption. В проектировщике меню измените свойство Action у пунктов правки на соответствующие пункты стандартных действий.
На этот урок все. Скачать вышерассмотренный пример можно отсюда.
Часть урока для продвинутых программистов
Всегда хочется каким-то образом оформить свое приложение, чтобы оно выглядело по-новому и немного нестандартно.
Рассмотрим создание главного меню программы, аналогичное главному меню в главном окне среды программирования delphi.
1. Создаем обычное меню на компоненте TMainMenu, но за одним исключением. У окна формы необходимо очистить свойство Menu и мы сразу видим, что меню исчезает из проектировочной формы.
2. Устанавливаем в форму компонент TControlBar (страница Additional). Свойство Align для него в alTop.
3. Устанавливаем в ControlBar1 компонент TToolBar (страница Win32). Для него все вложенные свойства для EdgeBorders в false. Свойство Flat устанавливаем в true. Свойства ShowCaptions и AutoSize тоже в true.
4. Создаем в Toolbar1 столько кнопок, сколько у нас пунктов имеет меню. Для всех кнопок меняем свойства AutoSize и Grouped на true.
5. Для каждой кнопки меняем свойство MenuItem на соответствующий пункт меню ("Файл", "Правка", Окна" и т. д.)
Оформление меню окончено.
С помощью свойств DragKind (установить в dkDock) и DockSite для приемника перетаскиваемого можно получить интересные эффекты при перетаскивании меню и других Dock'табельных компонентов. Такой простой пример можно скачать отсюда. Он еще далек от совершенства, но важна сама идея.
С уважением, ведущий уроков Semen *****@***net
Урок10. Переменные.
Как я уже говорил неоднократно, для того, чтобы вам легче было изучать язык программирования Object Pascal, необходимы некоторые азы знания языка Pascal. Потребуются только поверхностные знания синтаксиса, основных операторов, типов данных. Не отходя далеко от нашего сайта вы сможете изучить и этот язык в разделе "Программирование на языке Pascal"
Но тем не менее мы с вами постепенно просматриваем общие правила, так сказать азы, чтобы дальше углубляться без вопросов в более сложный материал. Перед вами последний ознакомительный урок с языком Pascal, после чего мы будем углубляться в сам Delphi.
Как уже говорилось ранее, переменные – это некоторая область в памяти, хранящая данные. Перед использованием переменной необходимо указать ее тип, и при необходимости размер. Места, где объявляются переменные, мы уже немного рассматривали в примерах.
Целочисленный тип.
Здесь переменные могут содержать целые числа, не имеющие дробной части
Тип | Значения | Объем |
Shortint | –128..127 | 8-бит со знаком |
Smallint | –32768..32767 | 16-бит со знаком |
Integer | – | 32-бит со знаком |
Longint | – | 32-бит со знаком |
Int64 | –2^63..2^63–1 | 64-бит со знаком |
Byte | 0..255 | 8-бит без знака |
Word | 0..65535 | 16-бит без знака |
Longword | 0.. | 32-бит без знака |
Cardinal | 0.. | 32-бит без знака |
Здесь и далее, число после знака ^ означает степень. Тем не менее, это правило нельзя применять в программе.
Среди всего многообразия предложенных данных рекомендую пользоваться типом Integer, который кроме всего имеет логический тип представления целых чисел.
Действительный тип.
В переменных этого типа числа представляют данные, состоящие из целой и дробной части. Причем все это храниться в одной ячейке данных, что само собой дает некоторую погрешность. В таком случае можно посоветовать использовать переменную большей точности или отделять целые числа и хранить в отдельных переменных.
Если за начальное значение таких типов принять 0, то минимальное значение, которое приведет к изменению его величины можно считать порогом (или точностью).
Тип | Порог | Максимальное значение | Кол-во цифр в значении | Объем, байт |
Real | 2,9*10^-39 | 1,7*10^38 | 11-12 | 6 |
Single | 1,5*10^-45 | 3,4*10^38 | 7-8 | 4 |
Double | 5,0*10^-324 | 1,7*10^308 | 15-16 | 8 |
Extended | 3,4*10^-4932 | 1,1*10^4932 | 19-20 | 10 |
Comp | 1,0 | 9,2*10^18 | 19-20 | 8 |
Currency | 0,0001 | 9,2*10^14 | 19-20 | 8 |
Последние два типа применяются для финансовых арифметических операций.
Тип Real оставлен для совместимости с ранними версиями Delphi и Pascal. Большинство программистов работают на компьютерах с процессорами 5 серии (встроенный сопроцессор) или выше, поэтому рекомендуется пользоваться переменными типа Double.
Символьный тип.
Символьный тип называется Char. Он занимает один байт в памяти и это значит, что может содержать 255 возможных значений символов, что соответствует стандартной кодировке ANSI.
Функция Ord(C) возвращает значение порядкового номера символа С в таблице кодировки. Возвращаемое значение имеет тип Byte.
Обратное преобразование осуществляется функцией Chr(B).
Пример такого преобразования при нажатии на кнопку Button1:
procedure TForm1.Button1Click(Sender: TObject);
Var C:Char;B:Byte; // символьная и численная переменная
begin
C:='A'; // в переменную С заносим символ А
B:=Ord(C); // получаем значение символа А равное 65
B:=100; // В переменную В заносим 100
C:=Chr(B); // получаем символ d
end;
Функция UpCase преобразует строчную букву в прописную. Но она работает только с символами английского алфавита.
Строковый тип.
В языке программирования Pascal максимальная длина строки String имела 255 символов. В Delphi оставлена такая строка, но называется она ShortString. Максимальная длина переменная String теперь ограничивается только размерами памяти. Данные в строковых, как и в символьных переменных, помещаются в кавычки, которые отделяют данные от команд программы.
Пример:
…
Var st:String; // Объявление строковой переменной st
…
st:='привет'; // Заносим в переменную st текстовую строку
ShowMessage(st); // Вывод на экран окошка с сообщением
Здесь весь пример куска программы можно привести в более упрощенный вид:
ShowMessage('привет');
Булевый тип.
Здесь можно сказать, что переменные, имеющие булевый тип, могут принимать два возможных значений. Это true (истинно) или false (ложно). Объявляется он как тип Boolean.
С уважением, ведущий уроков Semen *****@***net
Урок11. Текстовый редактор
На этом уроке мы с вами продолжим писать текстовый редактор MyEdit. Последнюю версию можно посмотреть в уроке №9 и скачать здесь. Если вы самостоятельно писали эту программу по урокам, но настоятельно рекомендую скачать именно мою версию, поскольку у нас может не совпадать названия пунктов меню.
Итак, наша программа уже обладает почти всеми стандартными функциями работы с простым текстом. Напишем еще процедуры сохранения текста на диск.
Если редактируемый файл новый, то вместо сохранения будет предложено файл "сохранить как...", где пользователь должен указать имя файла.
Для начала изменяем свойство Caption для окна ChildForm на 'НОВЫЙ'. Это можно сделать и программно. Для этого для реакции на событие OnCreate для этого дочернего окна создаем процедуру.
procedure TChildForm. FormCreate(Sender: TObject);
begin
Caption:='НОВЫЙ'; // Заголовок окна нового файла содержит название "НОВЫЙ"
end;
Теперь пишем процедуру нажатия на меню "Сохранить как...". Для этого в главную форму MainForm устанавливаем компонент TSaveDialog
, находящейся на странице Dialogs палитры компонентов. Поскольку фильтр отображаемых файлов в диалоговых окнах открытия и сохранения файла одинаков, то копируем строчку свойства Filter для компонента OpenDialog1 в аналогичное свойство для компонента SaveDialog1. Дальше с помощью Object Inspector создаем процедуру реакции на нажатие кнопки "Сохранить как...".
procedure TMainForm. N5Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit; // если нет MDI дочерних окон, то выйти из процедуры
SaveDialog1.Title:='Сохранить файл как...'; // заголовок диалогового окна сохранения файла
if SaveDialog1.Execute then // если пользователь выбрал название файла
begin
(ActiveMDIChild as TChildForm).Memo1.Lines. SaveToFile(SaveDialog1.FileName); // сохранение
(ActiveMDIChild as TChildForm).Caption:=SaveDialog1.FileName; // заголовок окна
end;
end;
Строка (ActiveMDIChild as TChildForm) позволяет получить доступ из главного окна к активному дочернему. Эта строка равноценна ChildForm, только выполняется она только для активного окна.
После сохранения файла заголовок дочернего окна содержит полный путь и название редактируемого файла.
Делаем процедуру сохранения файла для пункта "Сохранить". Следует при этом помнить, что если файл новый и название не определено, то вместо этого необходимо вызывать процедуру "Сохранить как..."
procedure TMainForm. N4Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit; // если нет MDI дочерних окон, то выйти из процедуры
if (ActiveMDIChild as TChildForm).Caption='НОВЫЙ' then // если заголовок окна "НОВЫЙ", то выполнять 1, иначе выполнять 2
N5Click(Sender) // 1. Идти в процедуру "Созранить как..."
else (ActiveMDIChild as TChildForm).Memo1.Lines. SaveToFile((ActiveMDIChild as TChildForm).Caption); // 2. Сохранить файл с именем, указанным в заголовке
end;
Получилась немного сложноватые строки даже для специалиста. Но не пугайтесь этого. Все команды с параметрами можно мысленно разбить на части, что упрощает просмотр.
Если текст в текстовых редакторах меняется, то обычно при выходе программа делает запрос на сохранение измененных данных. Если ответить "Да", то файл сохраняется. Если файл новый и не был ни разу сохранен, то будет предложен диалог сохранения файла под именем, или проще "Сохранить как...". Если ответить "Нет", то файл (окно) закроется без сохранения. Если нажать "Отмена", то ничего с окном не произойдет и пользователь продолжит редактирование.
Для окон есть событие OnCloseQuery, которое следует применять именно в этих случаях. Оно вызывается именно тогда, когда пользователь пытается закрыть окно и в качестве вносимого параметра CanClose определяет, может ли продолжаться закрытие окна или нет.
У каждого компонента в Delphi есть свойство Tag. Оно имеет тип Integer и является свойством, которым пользуются только программисты. Tag в программе ни на что не влияет. По умолчанию принимает нулевое значение.
В нашей программе я предлагаю использовать его для флага состояния редактирования. Если текст изменяется, то он в последствии подлежит запросу на сохранение.
Если свойство Tag для компонента Memo1 установлен в 0, то файл закрывается без запросов, иначе - 1.
Событие OnChange для компонента Memo1:
procedure TChildForm. Memo1Change(Sender: TObject);
begin
Memo1.Tag:=1; // Текст изменен и подлежит запросу на сохранение
end;
Тогда нам нужно убрать запрос на сохранение в случае "ручного" сохранения файла, когда пользователь сам выбрал необходимый пункт меню. Изменяем следующие процедуры сохранения файла.
Процедура "Открыть"
procedure TMainForm. N3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ChildForm:=TChildForm. Create(Self);
ChildForm. Memo1.Lines. LoadFromFile(OpenDialog1.FileName);
ChildForm. Caption:=OpenDialog1.FileName;
ChildForm. Memo1.Tag:=0; // добавить
end;
end;
Процедура "Сохранить как..."
procedure TMainForm. N5Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit;
SaveDialog1.Title:='Сохранить файл как...';
if SaveDialog1.Execute then
begin
(ActiveMDIChild as TChildForm).Memo1.Lines. SaveToFile(SaveDialog1.FileName);
(ActiveMDIChild as TChildForm).Caption:=SaveDialog1.FileName;
(ActiveMDIChild as TChildForm).Memo1.Tag:=0; // добавить
end;
end;
Процедура "Сохранить"
procedure TMainForm. N4Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit;
if (ActiveMDIChild as TChildForm).Caption='НОВЫЙ' then
N5Click(Sender) else
begin // добавить
(ActiveMDIChild as TChildForm).Memo1.Lines. SaveToFile((ActiveMDIChild as TChildForm).Caption);
(ActiveMDIChild as TChildForm).Memo1.Tag:=0; // добавить
end; // добавить
end;
Добавленные строки отделены комментарием "//добавить".
А теперь непосредственно создаем процедуру OnCloseQuery для окна ChildForm.
procedure TChildForm. FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
Var Res:Integer; // переменная для хранения результата выбора действия
begin
if Memo1.Tag=0 then // если не сохранять, то 1, иначе - 2
begin // 1:
CanClose:=true; // можно закрыть окно
end else
begin // 2:
Res:=Application. MessageBox('Вы желаете сохранить изменения?','Вопрос',MB_YESNOCANCEL + MB_ICONQUESTION);
// вопрос на сохранение
if Res=IDYES then // нажата кнопка "Да"
begin
ChildForm. BringToFront; // Расположить данное окно выше всех (сделать активным)
MainForm. N4Click(Sender); // Вызвать процедуру "Сохранить"
if Memo1.Tag=1 then CanClose:=false;
// если пользователь все-таки не сохранил файл, то окно не закрывать
end;
if Res=IDNo then CanClose:=true; // если "Нет", то можно закрыть
if Res=IDCANCEL then CanClose:=false; // если "Отмена", то не закрывать
end;
end;
Находясь в редакторе кода в файле ChildUnit необходимо подключить модуль главной формы MainUnit через пункт меню "UseUnit".
Аналогом команды MessageBox в Delphi есть команда MessageDLG. Более подробную информацию как по этой, так и по другой можно прочитать в справочной системе. Старайтесь всегда при неизвестных командах пользоваться подсказкой в справочной системе. Надо, чтобы указатель (курсор) находился на интересующем вас слове, и нажать комбинацию клавиш Ctrl+F1.
Архив примера текстового редактора с сегодняшними изменениями вы можете забрать тут.
С уважением, ведущий уроков Semen *****@***net
Урок12. Компонент TMemo
Он находится на палитре компонентов Standart. Как мы уже успели понять, он представляет собой поле для отображения и редактирования неформатированного текста. Текст можно загрузить из файла, набрать на клавиатуре, вставить из буфера обмена. Т. е. он имеет многие доступные свойства для редактирования текста, что способствует его применению в простейших текстовых редакторах для просмотра (редактирования) текста, наподобие того примера, который мы с вами периодически дописываем вот уже несколько уроков.
В этом компоненте текст всегда имеет одинаковый шрифт, задающийся через свойство Font.
Программно для компонента Memo1, расположенного на форме это делается следующим образом. Допустим, на форме расположено три компонента: поле редактирования текста Memo1 (страница Standart), диалог выбора шрифта FontDialog1 (страница Dialogs) и кнопка Button1 (страница Standart). Реакция на событие нажатия на кнопку Button1
procedure TForm1.Button1Click(Sender: TObject);
begin
if FontDialog1.Execute then // если пользователь выбрал шрифт
Memo1.Font:=FontDialog1.Font; // установить выбранный шрифт
end;
Если необходимо, чтобы в диалоге выбора шрифта изначально был выбран текущий шрифт, установленный компоненте Memo1, то перед вызовом диалога Execite устанавливаем в диалоге нужный шрифт.
procedure TForm1.Button1Click(Sender: TObject);
begin
FontDialog1.Font:=Memo1.Font; // установить шрифт в диалоге
if FontDialog1.Execute then
Memo1.Font:=FontDialog1.Font;
end;
Можно изменять шрифт для компонента TMemo (и не только для него) программно. Для этого в свойстве Font устанавливаются необходимые свойства во время работы приложения.
Memo1.Font. Name:='Arial'; // установка имени шрифта
Memo1.Font. Size:=14; // установка размера шрифта
Memo1.Font. Color:=clRed; // цвет шрифта
{для того, чтобы увидеть полный список доступных стандартных цветов воспользуйтесь справочной системой, например, подведя курсор под clRed и нажав на Ctrl+F1}
Memo1.Font. Style:=[fsBold]; // установить жирный стиль
Style представляет собой массив свойств стиля шрифта. Необходимо в квадратных скобках указывать через запятую необходимые стили. Пустые кавычки будут означать установку шрифта без стиля. Список доступный свойств стиля шрифта:
fsBold – жирный;
fsItalic – наклонный;
fsUnderline – подчеркнутый;
fsStrikeout – перечеркнутый.
Свойство WordWrap устанавливает, может или нет текст автопереносится на следующую строчку, если он достиг левого края компонента. Автоперенос работает и когда пользователь во время работы приложения изменяет размеры компонента.
Текст в компоненте доступен через свойство Lines. Он содержит массив строк, находящихся в компоненте. Можно получить доступ как к отдельной строке, так и к всему тексту. Это свойство можно редактировать и во время работы приложения, и во время разработки в инспекторе объектов.
Загрузка строк из файла через процедуру
Memo1.Lines. LoadFromFile('c:\1.txt');
где "c:\1.txt" – загружаемый файл в компонент. Следует при этом помнить, что компонент TMemo ограничен в размерах текста.
Сохранение строк в файл.
Memo1.Lines. SaveToFile('c:\1.txt');
Количество строк в компоненте можно узнать через свойство Memo1.Lines. Count, а доступ к отдельной строчке через функцию Strings. Например:
ShowMessage(Memo1.Lines. Strings[0]); // Показывает в окошке первую строчку текста.
Strings – это массив строк, начинающихся с нулевого знака, заканчивающиеся Count-1. Об этом следует помнить при написании подобных процедур доступа, иначе произойдет выход за доступный предел массива, что вызовет ошибку в программе.
Можно для примера организовать цикл поочередного отображения строк из компонента Memo1. Для реакции на нажатия на кнопку Button1 это выглядит следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
Var i:Integer; // объявление целочисленной переменной
begin
if Memo1.Lines. Count<>0 then // проверка ненулевого количества строк
for i:=0 to Memo1.Lines. Count-1 do // задается цикл, равный кол-ву строк
ShowMessage(Memo1.Lines. Strings[i]); // вывод строк в сообщение
end;
Очистить Strings можно одной процедурой Memo1.Lines. Clear.
Добавить строчку –
Memo1.Lines. Add('добавленная строка');
Вставить строчку в заданное место –
Memo1.Lines. Insert(0,'вставленная строка');
Последний пример вставляет текстовую строку в первую строку (первая строка -1 = 0).
Удалить строчку –
Memo1.Lines. Delete(0); // удаляет первую строку
При применении процедуры удаления строк Delete помните, что сначала нужно проверять компонент TMemo на наличие таковых вообще. Проверка через функцию Count, которая возвращает их целочисленное значение.
Работа с выделенным текстом программно аналогична работе пользователя вручную. Если пользователь выберет процедуру вырезания выделенного текста в буфер или его удаление, то он пропадет. Выделение текста производится с помощью двух процедур.
Memo1.SelStart:=0; // установить начальное положение выделения
Memo1.SelLength:=15; // установить длину выделенного текста
Если необходимо всегда видит выделенный текст, даже при переходе управления на другой элемент управления, то установите свойство HideSelection в false.
Работа с выделенным фрагментом текста
Memo1.ClearSelection; // удалить выделенный текст
Memo1.CutToClipboard; // вырезать в буфер обмена
Memo1.CopyToClipboard; // скопировать в буфер обмена
Memo1.PasteFromClipboard; // вставить из буфера обмена
Memo1.SelText; // эта функция возвращает текстовую строку выделенного текста
Отмена последнего изменения – процедура Memo1.Undo.
Компонент TMemo является оконным визуальным компонентом, т. е. у него имеются свойства, характерные множеству компонентов, таких как Border, Color, Align, Enabled, Visible.
С уважением, ведущий уроков Semen *****@***net
Урок13 Завершение проектирования MyEdit.
На сегодняшнем уроке мы с вами закончим рассматривать и написание программы простейшего текстового редактора. Предыдущую версию программы можно забрать здесь.
Итак, наша программа, лишенная некоторых нерассмотренных возможностей, практически готова. Ее можно применять как для просмотра, так и для редактирования текстовых файлов небольшого размера и вполне может заменить стандартный блокнот в Windows. К тому же, наша программа может работать с несколькими текстовыми файлами одновременно.
Организуем закрытие главного окна при выборе пункта меню "Выход". Для этого по известной нам методике, вызываем главное окно проекта MainForm на редактирование. Для этого нажимаем Shift+F12 и выбираем его в списке. Дальше, чтобы организовать реализацию события выбора пункта меню пользователем OnClick можно двумя способами:
1. Для дважды кликнуть по компоненту главного меню MainMenu1, после чего вызывается на редактирование редактор пунктов этого меню. После чего нужно выбрать пункт "Выход" и в инспекторе объектов (вкладка Events) выбрать процедуру OnClick на этом пункте, тем самым создав новую процедуру обработки события.
2. Просто из уже готового (отображаемого) меню в окне MainForm выбрать пункт "Выход". Delphi автоматически по умолчанию воспринимает как выбор программистом события OnClick для этого меню и создает все ту же пустую процедуру реакции программы на событие.
Какой из этих методов в дальнейшей работе – выбирать вам. Второй экономит время написания программы, первый нагляднее. Такой способ быстрого выбора событий для компонентов, которые установлены по умолчанию, характерны для всех компонентов в delphi. Например, двойной щелчок мышки по форме создает событие OnCreate для этой формы, для кнопки TBotton – событие OnClick, TMemo – событие OnChange. Постепенно в ходе обучения я буду обращать внимание на такие моменты оптимизации вашей работы.
В готовой процедуре реакции на событие выбора пункта меню "Выход" пишем только одно слово:
procedure TMainForm. N8Click(Sender: TObject);
begin
Close; // Закрыть главное окно (закрыть программу)
end;
Можно написать MainForm. Close, что равнозначно вышесказанному. Но поскольку данный модуль (Unit) предназначен для работы с формой (MainForm) и с его компонентами, то все команды в этом модуле воспринимаются как команды для окна, если мы непосредственно не указываем получателя.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


