Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уроки в Delphi.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
987.14 Кб
Скачать

Пример. Вычисление факториала

Вычисление факториала - классическая в программировании задача на использование рекурсии. Факториал числа N - результат перемножения всех чисел от 1 до N (обозначается N!): N! = 1*2* ... *(N-1)*N = N*(N-1)! урок 10

Обработка исключительных ситуаций

Исключительные ситуации в Delphi встречаются постоянно. Исключительная ситуация это такая ситуация, в результате которой генерируется ошибка, и выполнение программы прерывается. Именно потому такая ситуация и называется исключительной. Например, деление на ноль - классический пример исключительной ситуации. Как в такой ситуации действует человек? Если он пытается что-то сделать, и это не получается - он идёт другим путём. Так же и компьютер, следующий программе, умеющей обрабатывать исключительные ситуации. Он не бросает выполнение программы, не виснет, а обходит исключительную ситуацию, выполняя альтернативный вариант фрагмента, в которой исключительная ситуация возникла. Возникает вопрос, почему бы не поставить проверку, например, на равенство нулю знаменателя при делении? Можно и поставить. Но во многих случаях источник исключительной ситуации далеко не так очевиден, а на все случаи жизни проверки не введёшь. Итак, для контроля исключительных ситуаций программист должен подготовить как основной вариант фрагмента, где возможна исключительная ситуация, так и его вариант, в котором она заведомо невозможна, или выводится информационное сообщение для пользователя. Вот как выглядит оператор контроля исключительных ситуаций: try основные операторы фрагмента; except альтернативный вариант фрагмента; end; Вначале производится попытка выполнить операторы секции try/except, содержащие основной вариант программы. При возникновении в каком-либо операторе этой секции исключительной ситуации остальные операторы секции пропускаются, и выполняется секция except/end. Если всё "проходит штатно", то секция except/end пропускается. Ещё один вариант оператора контроля исключительных ситуаций применяется, когда необходимо, чтобы определённый фрагмент кода выполнился в любом случае, возникла исключительная ситуация или нет: try операторы finally заключительные действия end; Основные операторы, находящиеся в секции try, могут пройти штатно, или вызвать исключительную ситуацию. Операторы заключительных действий, находящиеся в секции finally, будут выполнены в любом случае. Есть ещё один способ контроля исключительных ситуаций, касающийся ошибок операций ввода-вывода. Перед участком программы, где возможны ошибки ввода-вывода (а это, по сути, все операторы ввода-вывода), ставится директива {$I-}, заставляющая компилятор не включать в код автоконтроль ошибок ввода-вывода. Таким образом, в случае ошибки ввода или вывода программа не прерывается. В конце участка с операторами ввода-вывода ставится директива, включающая автоконтроль: {$I+}. Затем анализируется результат вызова функции IOResult. Если функция IOResult (вызывается без параметров) возвращает 0, значит ошибок ввода-вывода на данном участке не было. Вот какой пример использования директив {$I} и функции IOResult содержит справка системы Delphi: var F: file of Byte; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then begin MessageDlg('File size in bytes: ' + IntToStr(FileSize(F)), mtInformation, [mbOk], 0); CloseFile(F); end else MessageDlg('File access error', mtWarning, [mbOk], 0); end; end; Функция IOResult досталась Delphi в наследство от Turbo Pascal. Тот же самый фрагмент можно составить и с использованием оператора try. На мой взгляд, это удобнее и проще. При работе программы под управлением Delphi, система будет сама реагировать на исключительные ситуации, мешая работе операторов обработки исключений. Чтобы проверить их действие, можно запускать программу непосредственно, сворачивая Delphi и пользуясь ярлыком, установленном на Рабочем столе. Или можно отключить реакцию системы на исключительные ситуации, тем самым давая возможность отработать специально для этого написанным фрагментам программы - нашим операторам try/except/end. Для этого откроем пункт системного меню Delphi Tools -> Debugger Options.... В появившемся окошке нужно снять галку в чекбоксе Stop on Delphi Exceptions, расположенном на вкладке Language Exceptions. Теперь система Delphi будет предоставлять вашей программе возможность самостоятельно обрабатывать исключительные ситуации, среди которых могут быть и ситуации, возникновение которых прописано специально как удобный инструмент достижения необходимых результатов.

Урок 11

Обзор компонентов

Итак, среда разработки Delphi ориентирована, прежде всего, на создание программ для Windows. При этом большое внимание уделяется возможности визуальной разработки приложений с помощью большого набора готовых компонентов Delphi, позволяющих избежать ручного кодирования. Компоненты Delphi охватывают практически все аспекты применения современных информационных технологий. Конечно, для работы в Delphi прежде всего требуется изучить базовые компоненты Delphi, которые требуются при подготовке практически любого приложения.

Страница Standart

Изучение Delphi естественным образом начинается со страницы палитры компонентов Standart. На этой странице расположены стандартные для Windows интерфейсные элементы, такие как главное и всплывающее меню, кнопка, однострочный и многострочный редакторы, переключатели, метки, списки, и некоторые другие компоненты, применяющиеся наиболее часто.

Страница Additional

На страницу Additional помещены дополнительные компоненты, без некоторых из которых сегодня трудно представить программу для Windows: кнопки с дополнительными свойствами, таблицы, компоненты для размещения изображений...

Страница Win32

Эта страница содержит компоненты, представляющие собой интерфейсные элементы для 32-разрядных операционных систем Windows 95/98/NT (В версии системы Delphi 2 эта страница называлась Win95). Использующие эти компоненты программы выглядят в стилистике последних версий операционных систем Windows.

Страница System

На этой странице представлены компоненты, которые имеют различное функциональное назначение (например, Timer - очень важный в любой программе компонент), в том числе компоненты, поддерживающие стандартные для Windows технологии межпрограммного обмена данными OLE и DDE.

Урок 12

Работа со строками

Список строк Delphi TStringList - это структура данных, напоминающая компонент ListBox, но не визуальная, а просто хранящая в памяти и имеющая свойства и методы для работы со строками типа TString. Для работы со списком строк типа TStringList его сначала необходимо создать с помощью конструктора - Create: var StrList: TStringList; begin StrList:=TStringList.Create; Теперь нужно описать способ хранения строк в списке. Список строк типа TStringList может сортировать добавляемые строки или хранить без сортировки, а также может игнорировать попытки добавления новой строки при наличии уже сохранённого дубликата:

StrList.Sorted:=True;

//True - сортировать, False - не сортировать

StrList.Duplicates:=dupIgnore;

//dupAccept - сохранять дубликаты (значение по умолчанию), dupIgnore - игнорировать, dupError - вызвать сообщение об ошибке

Теперь можно добавить в список строки типа TString:

StrList.Add('Новая строка');

//Добавление в конец списка (или в порядке сортировки). Возвращается индекс строки

StrList.Insert(Index, 'Новая строка');

//Строка добавляется на позицию с номером Index. Если список отсортирован, то возникает исключительная ситуация.

Удалить строку: StrList.Delete(Index); // Удаление строки с номером Index; Количество строк в списке: N:=StrList.Count; Доступ к строке с номером Index: Str:=StrList[Index]; Index отсчитывается от 0, поэтому номер последней строки: Last:=StrList.Count-1; Очищаем список строк: StrList.Clear; Если список отсортирован, есть метод для поиска:

StrList.Find(S, Index);

// В случае удачного поиска возвращает True, и индекс строки S в переменной Index

Если список не отсортирован, то тоже есть функция поиска:

I:=StrList.IndexOf(Text);

// Возвращает индекс строки с заданным текстом Text, или -1, если поиск неудачен

В конце работы со списком его необходимо удалить из памяти: StrList.Free; end; Как видим, список типа TStringList обладает ценным свойством, которым вряд ли обладает какой-либо другой объект в Delphi, а именно возможностью обнаруживать дубликаты строк. Как узнать, что строка уже содержится в списке? Вот алгоритм:

  1. Запретить списку запись дубликатов, что возможно только при задании сортировки списка. Это делается один раз, при создании списка, например, по событию Формы OnCreate: StrList.Duplicates:=dupIgnore; StrList.Sorted:=True;

  2. Сохранить в переменной количество строк в списке: begin Count:=StrLst.Count;

  3. Попробовать записать новую строку: StrList.Add(NewLine);

  4. Сравнить количество строк в списке с прежним значением. Если оно совпадёт с количеством перед записью, то такая строка в списке уже есть: if StrList.Count=Count then ShowMessage('Попытка добавления дубликата'); end;

Аналогичный, на мой взгляд даже более удобный, алгоритм реализации этой процедуры связан с использованием метода обработки исключений. Если вместо StrList.Duplicates:=dupIgnore для обработки дубликатов использовать значение dupError, это вызовет исключительную ситуацию при попытке добавить дубликат. Соответственно, при добавлении оригинальной строки программа идёт дальше, а при попытке добавления дубликата переходит к операторам секции except/end. Эти методы работают в случае если список отсортирован. Однако есть задачи, где сортировка не нужна, а находить значение в списке всё равно необходимо. В этом случае нужно пользоваться функцией IndexOf.