
Добавил:
Yanus
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лекции Шафеевой / Секретные файлы Шафеевой)) / V1_07K / DELPHI / LR4DEL
.TXT Разработала: Залевская Е.А., гр. Ив-218
ЛАБОРАТОРНАЯ РАБОТА №4
ВКЛЮЧЕНИЕ В ПРОЕКТ ФОРМ. УПРАВЛЕНИЕ ФОРМАМИ.
ПРОГРАММИРОВАНИЕ ЦИКЛОВ С ИСПОЛЬЗОВАНИЕМ ОПЕРАТОРОВ REPEAT И WHILE.
ПРЕРЫВАНИЕ ЦИКЛА.
Цель работы: научиться создавать проекты, состоящие из нескольких форм; ознакомиться с операторами цикла repeat и while и научиться использовать их в программах
ВКЛЮЧЕНИЕ В ПРОЕКТ ФОРМ
Во многих случаях ваш проект будет содержать не одну, а несколько форм. Кроме того, вы, может быть, захотите убрать из нового проекта пустую форму и включить вместо нее другую, разработанную ранее вами или кем-то другим.
Включение в проект новой формы может производиться различными способами. Если вы хотите включить новую пустую форму, вам достаточно выполнить команду File/New Form или нажать соответствующую быструю кнопку.
Теперь рассмотрим случай, когда вам требуется включить в свой проект форму, разработанную ранее вами или кем-то еще для другого проекта. Тут возможны несколько вариантов действий, имеющих различные последствия.
Можно включить готовую форму в проект командой Project/Add to Project или соответствующей быстрой кнопкой. Введенное этими действиями совместное владение несколькими приложениями одной и той же формой имеет свои плюсы и минусы. Если эти приложения представляютсобой некоторую группу связанных друг с другом приложений, рассчитанных на применение одними и теми же пользователями, то наличие общих форм можно только приветствовать. Какие-то усовершенствования, введенные в подобной форме, согласованно отобразятся во всех использующих ее приложениях. Если же приложения, совместно использующие форму, совершенно разные или форма используется в них для разных целей, то, введя изменения в форму в одном приложении, вы рискуете испортить прежнее приложение, если соберетесь его перекомпилировать.
Чтобы избежать совместного владения формой несколькими приложениями, после того, как вы включили в новое приложение форму из другого приложения, перейдите в окно Редактора Кода в модуль этой формы и выполните команду File/Save As, сохранив модуль в каталоге нового приложения и, если хотите, под другим именем. В этом случае разные приложения будут использовать совершенно разные копии одной формы и изменения одной из них не затронут другие приложения.
Заимствование форм из Депозитария
В Delphi 5-3 имеется еще одна возможность - заимствование включаемой в проект формы из Депозитария. Для этого надо выполнить команду File/New, после которой откроется окно New Items. На странице Forms вы найдете ряд форм, которые можете заимствовать для своего проекта.
Форма заимствования определяется тремя радиокнопками, размещенными в нижней части окна: Copy - копировать, Inherit - наследовать, Use - использовать. Если включена кнопка Copy, то файлы будут просто скопированы в ваше приложение. При этом никакой дальнейшей связи между исходной формой и копией не будет. Вы можете спокойно изменять свойства вашей копии и это никак не отразится на форме, хранящейся в Депозитарии. А если вы в дальнейшем что-то измените в форме, хранящейся в Депозитарии, то эти изменения никак не затронут вашего приложения, куда вы до этого скопировали форму.
При включенной кнопке Inherit вы получите в своем прокте форму, наследующую размещенной в Депозитарии. Это значит, что если вы что-то измените в форме, хранящейся в Депозитарии, то это отразится при перекомпиляции во всех проектах, которые наследуют эту форму. Однако, изменения в наследуемых формах никак не скажутся на свойствах формы, хранящейся в Депозитарии.
При включенной кнопке Use вы получите режим использования. В этом случае в ваш проект включится сама форма, хранящаяся в Депозитарии. Значит любое изменение свойств формы, сделанное в вашем проекте, отразится и на хранящейся в Депозитарии форме, и на всех проектах, наследующих эту форму.
УПРАВЛЕНИЕ ФОРМАМИ
Обычно сколько-нибудь сложное приложение содержит несколько форм. По умолчанию все формы создаются автоматически при запуске приложения и первая из введенных в приложение форм считается главной. Главная форма отличается от прочих рядом свойств. Во-первых, именно этой форме передается управление в начале выполнения приложения. Во-вторых, закрытие пользователем главной формы означает завершение выполнения приложения. В-третьих, главная форма так же, как и любая другая, может быть спроектирована невидимой, но если все остальные формы закрыты, то главная форма становится в любом случае видимой.
Указанные выше условия, принятые по умолчанию, могут быть изменены. Сделать это можно в окне Опций пректа, которое вызывается командой Project/Options. В окне Опций проекта надо выбрать страницу Forms. В верхнем выпадающем списке Main forms можно выбрать главную форму среди имеющихся в проекте. Пользуясь двумя нижними окнами можно установить, какие формы должны создаваться автоматически, а какие не должны. Например, если надо исключить форму Form2 из списка автоматически создаваемых, то надо выделить ее в левом окне (Auto-create forms) и с помощью кнопки со стрелкой, направленной вправо, переместить в правое окно доступных форм (Available forms).
Для каждой автоматически создаваемой формы Delphi добавляет в файл программы соответствующий оператор ее создания методом CreateForm. Это можно увидеть, если выполнить команду Project/View Source и посмотреть появившийся файл проекта .dpr. Он может, например, содержать следующие выполняемые операторы:
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
Первый и второй из них создают соответствующие формы, а третий начинает выполнение приложения. Для форм, которые были исключены из списка автоматически создаваемых, аналогичный метод CreateForm надо выполнить в тот момент, когда форма должна быть создана. В момент создания формы возникает событие OnCreate. Обработка этого события широко используется для настройки каких-то компонентов формы, создания списков и т.д.
В нужный момент форму можно сделать видимой методами Show или ShowModal. Последний метод открывает форму как модальную. Методы Show и ShowModal можно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент видима, то прежде, чем применять эти методы, следует проверить свойство Visible формы.
Например:
if (not Form2.Visible) then Form2.ShowModal;
При выполнении методов Show и ShowModal возникает событие формы onShow.
Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие onHide.
Необходимо помнить, что для выполнения методов CreateForm, Show, ShowModal, Hide и вообще для обмена любой информацией между формами модули соответствующих форм должны использовать друг друга. Например, если форма в модуле Unit1 должна управлять формой в модуле Unit2, то оператор uses модуля Unit1 должно быть включено имя второго модуля Unit2. А если к тому же форма в модуле Unit2 должна пользоваться какой-то информацией, содержащейся в модуле Unit1, то в оператор uses модуля Unit2 должно быть включено имя первого модуля Unit1. Проще не включать имена модулей приложения в операторы uses вручную, а использовать команду File/Use Unit, которая автоматизирует этот процесс.
Закрыть форму можно методом Close. Рассмотрим последовательность событий, возникающих при выполнении этого метода.
Первым возникает событие onCloseQuery. В его обработчик передается как var булева переменная CanClose, определяющая, должно ли продолжаться закрытие формы. По умолчанию CanClose равно true, что означает продолжение закрытия. Но если из анализа текущего состояния приложения или из ответа пользователя на запрос о закрытии формы следует, что закрывать ее не надо, параметру CanClose должно быть присвоено значение false. Тогда последующих событий, связанных с закрытием формы, не будет.
Например, пусть в приложении имеется окно редактирования RichEdit1, в котором свойство Modified указывает на то, был ли изменен пользователем текст в этом окне с момента его последнего сохранения. Тогда обработчик события onCloseQuery может иметь вид:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if RichEdit1.Modified then
if (Application.MessageBox('Текст документа не сохранен.'+
'Действительно хотите закончить работу?',
'Подтвердите завершение работы',
MB_ICONQUESTION+MB_YESNOCANCEL)<>IDYES)
then CanClose:=false;
end;
В приведенном операторе вызывается методом Application.MessageBox диалоговое окно. Первый параметр метода содержит текст сообщения пользователю. Второй параметр - текст заголовка окна. Третий параметр - набор флагов, определяющих вид окна. Флаг MB_ICONQUESTION отображает в окне пиктограмму вопросительного знака. Флаг MB_YESNOCANCEL заносит в окно кнопки Да, Нет и Отмена.
Функция MessageBox возвращает результат, который указывает на реакцию пользователя в диалоговом окне. Значение IDYES возвращается, если пользователь нажал кнопку Да, значение IDNO возвращается при нажатии кнопки Нет, значение IDCANCEL - при нажатии кнопки Отмена или клавиши Esc.
Если обработчик события onCloseQuery отсутствует или если в его обработчике сохранено значение true параметра CanClose, то следом наступает событие OnClose. В обработчик этого события передается как var переменная Action, которой можно задавать значения:
-------------------------------------------------------------------------------------------------
caNone Не закрывать форму. Это позволяет и в обработчике данного события еще отказать-
ся от закрытия формы.
caHide При этом значении закрыть форму будет означать сделать ее невидимой. Для пользователя она исчезнет с экрана, но вся хранящаяся в форме информация сохранится. Она может использоваться другими формами или той же самой формой, если она снова будет сделана видимой.
caMinimize При этом значении закрыть форму будет означать свернуть ее до пиктограммы. Как и в предыдущем случае, вся информация в форме будет сохранена.
caFree При этом значении закрыть форму будет означать уничтожение формы и освобождение занимаемой ею памяти. Вся информация, содержащаяся в форме, будет уничтожена.
-------------------------------------------------------------------------------------------------
Не все значения Action допустимы для любых форм.
ОПЕРАТОР ЦИКЛА REPEAT
Структура repeat...until используется для организации циклического выполнения совокупности операторов, называемой телом цикла, до тех пор, пока не выполнится некоторое условие. Синтаксис управляющей структуры repeat...until:
repeat
<операторы тела цикла>
until <условие>;
Точка с запятой после последнего оператора тела цикла может опускаться.
Структура работает следующим образом. Выполняются операторы тела цикла. Затем вычисляется <условие>, которое должно возвращать результат булева типа. Если выражение условия возвращает false, то повторяется выполнение операторов тела цикла и после этого снова вычисляется условие. Такое циклическое повторение цикла продолжается до тех пор, пока проверяемое условие не вернет true. После этого цикл завершается и управление передается оператору, следующему за структурой repeat...until.
Поскольку проверка условия осуществляется после выполнения операторов тела цикла, то эти операторы заведомо будут выполнены хотя бы один раз, даже если условие сразу истинно. С другой стороны, программист должен быть уверен, что условие рано или поздно вернет true, иначе программа зациклится, т.е. цикл будет выполняться бесконечно.
ОПЕРАТОР ЦИКЛА WHILE
Структура while...do используется для организации циклического выполнения оператора, называемого телом цикла, пока выполняется некоторое условие. Синтаксис управляющей структуры while...do:
while <условие> do <оператор>;
Структура работает следующим образом. Сначала вычисляется <условие>, которое должно возвращать результат булева типа. Если условие возвращает true, то выполняется оператор тела цикла, после чего опять вычисляется выражение, определяющее условие. Такое циклическое повторение выполнения оператора и проверки условия продолжается до тех пор, пока условие не вернет false. После этого цикл завершается и управление передается оператору, следующему за структурой while...do.
Поскольку проверка выражения осуществляется перед выполнением оператора тела цикла, то, если условие сразу ложно, оператор не будет выполнен ни одного раза. В этом основное отличие структуры while...do от структуры repeat...until, в котором тело цикла заведомо выполняется хотя бы один раз.
Программист должен быть уверен, что условие рано или позно вернет false. Если этого не произойдет, то программа зациклится.
ПРЕРЫВАНИЕ ЦИКЛА: ОПЕРАТОР BREAK, ПРОЦЕДУРЫ CONTINUE,EXIT И ABORT
В некоторых случаях желательно прервать повторение цикла, проанализировав какие-то условия внутри него.
Один из способов решения этой задачи - использование оператора break. Этот оператор прерывает выполнение любого цикла for, repeat или while и передает управление следующему за циклом выполняемому оператору.
Для прерывания циклов, размещенных в процедурах или функциях, можно воспользоваться процедурой Exit. Она прервет не только выполнение цикла, но и выполнение той процедуры или функции, в которой расположен цикл.
Прервать выполнение цикла, а заодно - и блока, в котором расположен цикл, можно также генерацией какого-то исключения. Наиболее часто в этих целях используется процедура Abort, генерирующая "молчаливое" исключение, не связанное с каким-то сообщением об ошибке.
Описанные способы прерывали выполнение цикла. Имеется еще процедура Continue, которая прерывает только выполнение текущей итерации, текущего выполнения цикла и передает управление на следующую итерацию.
Задание №1:
1. Подсчитать количество цифр в десятичной записи целого неотрицательного числа N.
2. Дана непустая последовательность различных натуральных чисел, за которой следует 0. Определить порядковый номер наименьшего из них.
3. Дано число Х. Найти заданные целые степени этого числа, пока значение степени при вводе не совпадет в нулем.
4. Вычислить любую функцию с заданной точностью.
5. Угадать число, "загаданное" датчиком случайных чисел.
6. Ввести число k (k<32767). Определить наибольшую и наименьшую цифры в этом числе.
7. Дано вещественное число В>0. Найти и распечатать все числа последовательности, образованной по правилу: а[i]=1; а[i+1]=а[i]*а[i]+ 1.
8. В последовательности введенных символов (последний '$') определить порядковый номер первой буквы R (с учетом верхнего/нижнего регистров).
9. Составить программу, печатающую "ДА" или "НЕТ" в зависимости от того, имеют ли три целых введенных числа одинаковую четность. Организовать цикл, пока не будут введены три нуля.
10. Дано натуральное число N (N<32767). Определить его первую и последнюю цифры.
12. Дано натуральное число N (N<32767). Вычислить сумму k старших (находящихся слева) цифр числа.
13. Напишите программу, которая печатает степени числа 2 (2, 4, 8, 16, 32, 64 и т.д.). Цикл должен заканчиваться каким-либо признаком.
14. Рассчитайте число Pi на основании бесконечно ряда Pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ... .
15. Ввести целое десятичное число. Установить в каких позициях его двоичного кода записаны нули.
16. Введите месяц и день своего рождения. Выясните, какой ближайший год будет для вас счастливым. Год называется счастливым, если остаток от деления его цифр на 10 совпадает с аналогичным остатком сумм цифр месяца или дня рождения.
17. В кассе имеются только трех- и пятирублевые купюры. Разработать программу, которая "выплачивала" бы такими купюрами любую сумму более семи рублей.
18. Множество троек целых значений сторон прямоугольного треугольника называется тройками Пифагора (сумма квадратов двух сторон равна квадрату третьей стороны). Найдите все тройки Пифагора среди введенных с клавиатуры. Ввод прекратить, когда один из параметров пре-
высит значение 999.
19. Ввести и распечатать последовательность символов, заканчивающуюся точкой. Распечатать только те из них, которые расположены до первого символа ':'.
20. Ввести последовательность символов, заканчивающуюся '@'. Распечатать только те из них, которые не являются буквой А.
Задание №2:
1. Дано вещественное число Е: 0<Е<0.1. Образовать последовательность чисел по правилу а[i] =1/i. Для последнего элемента должно выполняться условие |а[i]-а[i-1]|< Е.
2. Разработать программу ввода троек целых чисел до тех пор, пока не будут найдены три числа с одинаковой четностью.
3. Разработать программу перевода десятичного числа в восьмиричное.
4. Дано вещественное число А>0. Найти среди чисел 1, 1+1/2, 1+1/2+1/3, ... первое число, большее А.
5. Дано вещественное число A: 0<A<0.5. Образовать последовательность чисел по правилу х[i]=1/i*i и найти такое х[i], чтобы х[i-1]>A>x[i].
6. По заданному вещественному X вычислить значение его корня по следующей итерационной формуле у[i+1]= 0.5(у[i]+ х/у[i]), принять у[0]=х. Итерации прекратить при | у[i]-у[i-1] | < 2*10000.
7. Даны натуральные числа n и k. Определить k-ю справа цифру числа n.
8. Дано 15 натуральных чисел. Найти сумму чисел, предшествующих первому отрицательному числу. Если среди чисел нет отрицательных, то просуммировать все элементы.
9. Дано натуральное число n. Подсчитать сумму цифр этого числа, находящихся на нечетных позициях.
10. Составить программу, печатающую "Да" или "Нет" в зависимости от того, входит ли введенная цифра в заданное натуральное десятичное число.
11. По заданному вещественному х (х<3) вычислить значение его корня по формуле двойной итерации у[i+1]= 0.5у[i]z[i], z[i+1]=0.25z[i]^2*(z[i]-3). Итерации прекратить при | у[i]-у[i-1] | < 10000.
12. Придумать задачу по данной теме.
13. Придумать задачу по данной теме.
14. Придумать задачу по данной теме.
15. Определить, встречается ли введенная цифра среди цифр дробной части заданного вещественного числа.
16. Дано положительное число А>10. Найти такое k, что (k-1)!<=A<k!.
17. Дано вещественное число E: 0<E<0.5. Образовать последовательность чисел по правилу а[i] = S (1- 1/(k+i).
k=1
Найти первый член последовательности, для которого |а[i]-а[i-1]|<E.
18-20. Придумать задачу по данной теме.
Порядок выполнения лабораторной работы:
1. Ознакомиться с теоретическим материалом.
2. Выполнить первое задание, используя оператор while (см. Primer4_1).
3. Выполнить второе задание, используя оператор repeat (см. Primer4_2).
При выполнении заданий создавать приложения, содержащие более одной формы.
ЛАБОРАТОРНАЯ РАБОТА №4
ВКЛЮЧЕНИЕ В ПРОЕКТ ФОРМ. УПРАВЛЕНИЕ ФОРМАМИ.
ПРОГРАММИРОВАНИЕ ЦИКЛОВ С ИСПОЛЬЗОВАНИЕМ ОПЕРАТОРОВ REPEAT И WHILE.
ПРЕРЫВАНИЕ ЦИКЛА.
Цель работы: научиться создавать проекты, состоящие из нескольких форм; ознакомиться с операторами цикла repeat и while и научиться использовать их в программах
ВКЛЮЧЕНИЕ В ПРОЕКТ ФОРМ
Во многих случаях ваш проект будет содержать не одну, а несколько форм. Кроме того, вы, может быть, захотите убрать из нового проекта пустую форму и включить вместо нее другую, разработанную ранее вами или кем-то другим.
Включение в проект новой формы может производиться различными способами. Если вы хотите включить новую пустую форму, вам достаточно выполнить команду File/New Form или нажать соответствующую быструю кнопку.
Теперь рассмотрим случай, когда вам требуется включить в свой проект форму, разработанную ранее вами или кем-то еще для другого проекта. Тут возможны несколько вариантов действий, имеющих различные последствия.
Можно включить готовую форму в проект командой Project/Add to Project или соответствующей быстрой кнопкой. Введенное этими действиями совместное владение несколькими приложениями одной и той же формой имеет свои плюсы и минусы. Если эти приложения представляютсобой некоторую группу связанных друг с другом приложений, рассчитанных на применение одними и теми же пользователями, то наличие общих форм можно только приветствовать. Какие-то усовершенствования, введенные в подобной форме, согласованно отобразятся во всех использующих ее приложениях. Если же приложения, совместно использующие форму, совершенно разные или форма используется в них для разных целей, то, введя изменения в форму в одном приложении, вы рискуете испортить прежнее приложение, если соберетесь его перекомпилировать.
Чтобы избежать совместного владения формой несколькими приложениями, после того, как вы включили в новое приложение форму из другого приложения, перейдите в окно Редактора Кода в модуль этой формы и выполните команду File/Save As, сохранив модуль в каталоге нового приложения и, если хотите, под другим именем. В этом случае разные приложения будут использовать совершенно разные копии одной формы и изменения одной из них не затронут другие приложения.
Заимствование форм из Депозитария
В Delphi 5-3 имеется еще одна возможность - заимствование включаемой в проект формы из Депозитария. Для этого надо выполнить команду File/New, после которой откроется окно New Items. На странице Forms вы найдете ряд форм, которые можете заимствовать для своего проекта.
Форма заимствования определяется тремя радиокнопками, размещенными в нижней части окна: Copy - копировать, Inherit - наследовать, Use - использовать. Если включена кнопка Copy, то файлы будут просто скопированы в ваше приложение. При этом никакой дальнейшей связи между исходной формой и копией не будет. Вы можете спокойно изменять свойства вашей копии и это никак не отразится на форме, хранящейся в Депозитарии. А если вы в дальнейшем что-то измените в форме, хранящейся в Депозитарии, то эти изменения никак не затронут вашего приложения, куда вы до этого скопировали форму.
При включенной кнопке Inherit вы получите в своем прокте форму, наследующую размещенной в Депозитарии. Это значит, что если вы что-то измените в форме, хранящейся в Депозитарии, то это отразится при перекомпиляции во всех проектах, которые наследуют эту форму. Однако, изменения в наследуемых формах никак не скажутся на свойствах формы, хранящейся в Депозитарии.
При включенной кнопке Use вы получите режим использования. В этом случае в ваш проект включится сама форма, хранящаяся в Депозитарии. Значит любое изменение свойств формы, сделанное в вашем проекте, отразится и на хранящейся в Депозитарии форме, и на всех проектах, наследующих эту форму.
УПРАВЛЕНИЕ ФОРМАМИ
Обычно сколько-нибудь сложное приложение содержит несколько форм. По умолчанию все формы создаются автоматически при запуске приложения и первая из введенных в приложение форм считается главной. Главная форма отличается от прочих рядом свойств. Во-первых, именно этой форме передается управление в начале выполнения приложения. Во-вторых, закрытие пользователем главной формы означает завершение выполнения приложения. В-третьих, главная форма так же, как и любая другая, может быть спроектирована невидимой, но если все остальные формы закрыты, то главная форма становится в любом случае видимой.
Указанные выше условия, принятые по умолчанию, могут быть изменены. Сделать это можно в окне Опций пректа, которое вызывается командой Project/Options. В окне Опций проекта надо выбрать страницу Forms. В верхнем выпадающем списке Main forms можно выбрать главную форму среди имеющихся в проекте. Пользуясь двумя нижними окнами можно установить, какие формы должны создаваться автоматически, а какие не должны. Например, если надо исключить форму Form2 из списка автоматически создаваемых, то надо выделить ее в левом окне (Auto-create forms) и с помощью кнопки со стрелкой, направленной вправо, переместить в правое окно доступных форм (Available forms).
Для каждой автоматически создаваемой формы Delphi добавляет в файл программы соответствующий оператор ее создания методом CreateForm. Это можно увидеть, если выполнить команду Project/View Source и посмотреть появившийся файл проекта .dpr. Он может, например, содержать следующие выполняемые операторы:
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
Первый и второй из них создают соответствующие формы, а третий начинает выполнение приложения. Для форм, которые были исключены из списка автоматически создаваемых, аналогичный метод CreateForm надо выполнить в тот момент, когда форма должна быть создана. В момент создания формы возникает событие OnCreate. Обработка этого события широко используется для настройки каких-то компонентов формы, создания списков и т.д.
В нужный момент форму можно сделать видимой методами Show или ShowModal. Последний метод открывает форму как модальную. Методы Show и ShowModal можно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент видима, то прежде, чем применять эти методы, следует проверить свойство Visible формы.
Например:
if (not Form2.Visible) then Form2.ShowModal;
При выполнении методов Show и ShowModal возникает событие формы onShow.
Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие onHide.
Необходимо помнить, что для выполнения методов CreateForm, Show, ShowModal, Hide и вообще для обмена любой информацией между формами модули соответствующих форм должны использовать друг друга. Например, если форма в модуле Unit1 должна управлять формой в модуле Unit2, то оператор uses модуля Unit1 должно быть включено имя второго модуля Unit2. А если к тому же форма в модуле Unit2 должна пользоваться какой-то информацией, содержащейся в модуле Unit1, то в оператор uses модуля Unit2 должно быть включено имя первого модуля Unit1. Проще не включать имена модулей приложения в операторы uses вручную, а использовать команду File/Use Unit, которая автоматизирует этот процесс.
Закрыть форму можно методом Close. Рассмотрим последовательность событий, возникающих при выполнении этого метода.
Первым возникает событие onCloseQuery. В его обработчик передается как var булева переменная CanClose, определяющая, должно ли продолжаться закрытие формы. По умолчанию CanClose равно true, что означает продолжение закрытия. Но если из анализа текущего состояния приложения или из ответа пользователя на запрос о закрытии формы следует, что закрывать ее не надо, параметру CanClose должно быть присвоено значение false. Тогда последующих событий, связанных с закрытием формы, не будет.
Например, пусть в приложении имеется окно редактирования RichEdit1, в котором свойство Modified указывает на то, был ли изменен пользователем текст в этом окне с момента его последнего сохранения. Тогда обработчик события onCloseQuery может иметь вид:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if RichEdit1.Modified then
if (Application.MessageBox('Текст документа не сохранен.'+
'Действительно хотите закончить работу?',
'Подтвердите завершение работы',
MB_ICONQUESTION+MB_YESNOCANCEL)<>IDYES)
then CanClose:=false;
end;
В приведенном операторе вызывается методом Application.MessageBox диалоговое окно. Первый параметр метода содержит текст сообщения пользователю. Второй параметр - текст заголовка окна. Третий параметр - набор флагов, определяющих вид окна. Флаг MB_ICONQUESTION отображает в окне пиктограмму вопросительного знака. Флаг MB_YESNOCANCEL заносит в окно кнопки Да, Нет и Отмена.
Функция MessageBox возвращает результат, который указывает на реакцию пользователя в диалоговом окне. Значение IDYES возвращается, если пользователь нажал кнопку Да, значение IDNO возвращается при нажатии кнопки Нет, значение IDCANCEL - при нажатии кнопки Отмена или клавиши Esc.
Если обработчик события onCloseQuery отсутствует или если в его обработчике сохранено значение true параметра CanClose, то следом наступает событие OnClose. В обработчик этого события передается как var переменная Action, которой можно задавать значения:
-------------------------------------------------------------------------------------------------
caNone Не закрывать форму. Это позволяет и в обработчике данного события еще отказать-
ся от закрытия формы.
caHide При этом значении закрыть форму будет означать сделать ее невидимой. Для пользователя она исчезнет с экрана, но вся хранящаяся в форме информация сохранится. Она может использоваться другими формами или той же самой формой, если она снова будет сделана видимой.
caMinimize При этом значении закрыть форму будет означать свернуть ее до пиктограммы. Как и в предыдущем случае, вся информация в форме будет сохранена.
caFree При этом значении закрыть форму будет означать уничтожение формы и освобождение занимаемой ею памяти. Вся информация, содержащаяся в форме, будет уничтожена.
-------------------------------------------------------------------------------------------------
Не все значения Action допустимы для любых форм.
ОПЕРАТОР ЦИКЛА REPEAT
Структура repeat...until используется для организации циклического выполнения совокупности операторов, называемой телом цикла, до тех пор, пока не выполнится некоторое условие. Синтаксис управляющей структуры repeat...until:
repeat
<операторы тела цикла>
until <условие>;
Точка с запятой после последнего оператора тела цикла может опускаться.
Структура работает следующим образом. Выполняются операторы тела цикла. Затем вычисляется <условие>, которое должно возвращать результат булева типа. Если выражение условия возвращает false, то повторяется выполнение операторов тела цикла и после этого снова вычисляется условие. Такое циклическое повторение цикла продолжается до тех пор, пока проверяемое условие не вернет true. После этого цикл завершается и управление передается оператору, следующему за структурой repeat...until.
Поскольку проверка условия осуществляется после выполнения операторов тела цикла, то эти операторы заведомо будут выполнены хотя бы один раз, даже если условие сразу истинно. С другой стороны, программист должен быть уверен, что условие рано или поздно вернет true, иначе программа зациклится, т.е. цикл будет выполняться бесконечно.
ОПЕРАТОР ЦИКЛА WHILE
Структура while...do используется для организации циклического выполнения оператора, называемого телом цикла, пока выполняется некоторое условие. Синтаксис управляющей структуры while...do:
while <условие> do <оператор>;
Структура работает следующим образом. Сначала вычисляется <условие>, которое должно возвращать результат булева типа. Если условие возвращает true, то выполняется оператор тела цикла, после чего опять вычисляется выражение, определяющее условие. Такое циклическое повторение выполнения оператора и проверки условия продолжается до тех пор, пока условие не вернет false. После этого цикл завершается и управление передается оператору, следующему за структурой while...do.
Поскольку проверка выражения осуществляется перед выполнением оператора тела цикла, то, если условие сразу ложно, оператор не будет выполнен ни одного раза. В этом основное отличие структуры while...do от структуры repeat...until, в котором тело цикла заведомо выполняется хотя бы один раз.
Программист должен быть уверен, что условие рано или позно вернет false. Если этого не произойдет, то программа зациклится.
ПРЕРЫВАНИЕ ЦИКЛА: ОПЕРАТОР BREAK, ПРОЦЕДУРЫ CONTINUE,EXIT И ABORT
В некоторых случаях желательно прервать повторение цикла, проанализировав какие-то условия внутри него.
Один из способов решения этой задачи - использование оператора break. Этот оператор прерывает выполнение любого цикла for, repeat или while и передает управление следующему за циклом выполняемому оператору.
Для прерывания циклов, размещенных в процедурах или функциях, можно воспользоваться процедурой Exit. Она прервет не только выполнение цикла, но и выполнение той процедуры или функции, в которой расположен цикл.
Прервать выполнение цикла, а заодно - и блока, в котором расположен цикл, можно также генерацией какого-то исключения. Наиболее часто в этих целях используется процедура Abort, генерирующая "молчаливое" исключение, не связанное с каким-то сообщением об ошибке.
Описанные способы прерывали выполнение цикла. Имеется еще процедура Continue, которая прерывает только выполнение текущей итерации, текущего выполнения цикла и передает управление на следующую итерацию.
Задание №1:
1. Подсчитать количество цифр в десятичной записи целого неотрицательного числа N.
2. Дана непустая последовательность различных натуральных чисел, за которой следует 0. Определить порядковый номер наименьшего из них.
3. Дано число Х. Найти заданные целые степени этого числа, пока значение степени при вводе не совпадет в нулем.
4. Вычислить любую функцию с заданной точностью.
5. Угадать число, "загаданное" датчиком случайных чисел.
6. Ввести число k (k<32767). Определить наибольшую и наименьшую цифры в этом числе.
7. Дано вещественное число В>0. Найти и распечатать все числа последовательности, образованной по правилу: а[i]=1; а[i+1]=а[i]*а[i]+ 1.
8. В последовательности введенных символов (последний '$') определить порядковый номер первой буквы R (с учетом верхнего/нижнего регистров).
9. Составить программу, печатающую "ДА" или "НЕТ" в зависимости от того, имеют ли три целых введенных числа одинаковую четность. Организовать цикл, пока не будут введены три нуля.
10. Дано натуральное число N (N<32767). Определить его первую и последнюю цифры.
12. Дано натуральное число N (N<32767). Вычислить сумму k старших (находящихся слева) цифр числа.
13. Напишите программу, которая печатает степени числа 2 (2, 4, 8, 16, 32, 64 и т.д.). Цикл должен заканчиваться каким-либо признаком.
14. Рассчитайте число Pi на основании бесконечно ряда Pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ... .
15. Ввести целое десятичное число. Установить в каких позициях его двоичного кода записаны нули.
16. Введите месяц и день своего рождения. Выясните, какой ближайший год будет для вас счастливым. Год называется счастливым, если остаток от деления его цифр на 10 совпадает с аналогичным остатком сумм цифр месяца или дня рождения.
17. В кассе имеются только трех- и пятирублевые купюры. Разработать программу, которая "выплачивала" бы такими купюрами любую сумму более семи рублей.
18. Множество троек целых значений сторон прямоугольного треугольника называется тройками Пифагора (сумма квадратов двух сторон равна квадрату третьей стороны). Найдите все тройки Пифагора среди введенных с клавиатуры. Ввод прекратить, когда один из параметров пре-
высит значение 999.
19. Ввести и распечатать последовательность символов, заканчивающуюся точкой. Распечатать только те из них, которые расположены до первого символа ':'.
20. Ввести последовательность символов, заканчивающуюся '@'. Распечатать только те из них, которые не являются буквой А.
Задание №2:
1. Дано вещественное число Е: 0<Е<0.1. Образовать последовательность чисел по правилу а[i] =1/i. Для последнего элемента должно выполняться условие |а[i]-а[i-1]|< Е.
2. Разработать программу ввода троек целых чисел до тех пор, пока не будут найдены три числа с одинаковой четностью.
3. Разработать программу перевода десятичного числа в восьмиричное.
4. Дано вещественное число А>0. Найти среди чисел 1, 1+1/2, 1+1/2+1/3, ... первое число, большее А.
5. Дано вещественное число A: 0<A<0.5. Образовать последовательность чисел по правилу х[i]=1/i*i и найти такое х[i], чтобы х[i-1]>A>x[i].
6. По заданному вещественному X вычислить значение его корня по следующей итерационной формуле у[i+1]= 0.5(у[i]+ х/у[i]), принять у[0]=х. Итерации прекратить при | у[i]-у[i-1] | < 2*10000.
7. Даны натуральные числа n и k. Определить k-ю справа цифру числа n.
8. Дано 15 натуральных чисел. Найти сумму чисел, предшествующих первому отрицательному числу. Если среди чисел нет отрицательных, то просуммировать все элементы.
9. Дано натуральное число n. Подсчитать сумму цифр этого числа, находящихся на нечетных позициях.
10. Составить программу, печатающую "Да" или "Нет" в зависимости от того, входит ли введенная цифра в заданное натуральное десятичное число.
11. По заданному вещественному х (х<3) вычислить значение его корня по формуле двойной итерации у[i+1]= 0.5у[i]z[i], z[i+1]=0.25z[i]^2*(z[i]-3). Итерации прекратить при | у[i]-у[i-1] | < 10000.
12. Придумать задачу по данной теме.
13. Придумать задачу по данной теме.
14. Придумать задачу по данной теме.
15. Определить, встречается ли введенная цифра среди цифр дробной части заданного вещественного числа.
16. Дано положительное число А>10. Найти такое k, что (k-1)!<=A<k!.
17. Дано вещественное число E: 0<E<0.5. Образовать последовательность чисел по правилу а[i] = S (1- 1/(k+i).
k=1
Найти первый член последовательности, для которого |а[i]-а[i-1]|<E.
18-20. Придумать задачу по данной теме.
Порядок выполнения лабораторной работы:
1. Ознакомиться с теоретическим материалом.
2. Выполнить первое задание, используя оператор while (см. Primer4_1).
3. Выполнить второе задание, используя оператор repeat (см. Primer4_2).
При выполнении заданий создавать приложения, содержащие более одной формы.
Соседние файлы в папке DELPHI