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

Лабораторная работа № 2 – программа "Картотека предприятия"

Образец: task2.exe + файлpersons.txt

Программа должна реализовывать следующие функции:

  1. Загрузка информации о сотрудниках предприятия из файла при запуске программы.

  2. Отображение иерархической структуры предприятия в виде древовидного списка.

  3. Отображение полной информации о сотруднике при выборе конкретного элемента (должности) в древовидном списке.

  4. Редактирование любой информации о сотруднике.

  5. Отображение текущей информации о сотруднике в статусной строке.

  6. Сохранение информации о сотрудниках предприятия в файле при завершении работы программы.

Требования к лабораторной работе № 2:

  1. При старте программы информация о сотрудниках должна загружаться из некоторого файла (в примере он называется “persons.txt”), а при выходе – сохраняться в нем. Если файл отсутствует, то при старте программа должна создавать его и заполнять данными по умолчанию.

  2. Главное окно программы должно содержать две закладки: «Предприятие» и «Человек». При запуске программа всегда должна открываться на закладке «Предприятие», при этом иерархический список подразделений должен быть полностью раскрыт и в нем должен быть выбран (подсвечен) пункт «Директор».

  3. У каждого элемента древовидного списка должна быть своя собственная иконка размером 16х16 пикселов.

  4. При щелчке мышью на любом элементе древовидного списка информация об этом человеке должна переноситься в поля на закладку «Человек» и в статусную строку.

  5. При изменении любой информации на закладке «Человек» изменения должны сразу же отображаться в статусной строке.

  6. Неправильный ввод данных в поле «Год рождения» должен корректно обрабатываться.

  7. Поле «Телефон» должно иметь маску ввода (для этого вместо компонента Edit надо использовать компонент MaskEdit).

  8. Поля «Образование» и «Специальность» должны представлять собой 2 различных варианта выпадающего списка: с возможностью редактирования и без.

  9. Для поля «Лояльность» свойства должны быть установлены таким образом, чтобы при нажатии клавиш Up/Down значение менялось на единицу, а при нажатии клавиш PgUp/PgDown – на 10.

  10. Переход между различными элементами управления по клавише Tab на закладке «Человек» должен осуществляться последовательно, а не хаотично.

Методические указания к лабораторной работе № 2:

  1. Работа с компонентом PageControl. КомпонентPageControl представляет собой контейнер, внутри которого содержатся сами закладки (экземпляры классаTabSheet).

  • Для добавления новой закладки к компоненту PageControlщелкните по нему правой кнопкой мыши и выберите командуNew Page. При этом внутриPageControl создается компонент TabSheet, который содержит собственный набор свойств (в частности свойствоCaption для изменения названия закладки).Повторите операцию столько раз, сколько закладок вам необходимо.

  • Для изменения текущей активной закладки в процессе выполения программы присвойте нужное значение свойству PageControl.ActivePage.

  1. Работа с компонентом TreeView.

  • Для добавления/редактирования элементов в TreeView используйте встроенный редактор (вызывается двойным щелчком мыши поTreeView).

  • Для подключения картинок к элементам TreeView выполните следующие шаги:

  1. добавьте к форме компонент ImageList (список изображений) с закладкиWin32;

  2. загрузите в компонент ImageList нужное количество картинок размером 16х16 пикселов при помощи встроенного редактора (вызывается двойным щелчком мыши поImageList).

  3. установите свойство TreeView.Images = имя вашегоImageList;

  4. вызовите встроенный редактор элементов TreeView и для каждого элемента дерева назначьте свойствамImageIndex и SelectedIndex значения индексов картинок из ImageList (счет начинается с 0, значение –1 означает, что у данного элемента картинка отсутсвует). Обычно, значенияImageIndex и SelectedIndex для одного элемента выбирают одинаковыми, если только вы не хотите, чтобы картинка у выбранного элемента отличалась от картинки невыбранного.

  • Чтобы получить уникальный индекс текущего выбраннного элемента дерева, используйте свойство TreeView.Selected.AbsoluteIndex. TreeView.Selected представляет собой текущий выбранный узелдерева, аAbsoluteIndex – порядковый номер этого узла в дереве.

  • Чтобы выбранный элемент в TreeView оставался подсвеченным даже когда компонент теряет фокус ввода, установите свойствоHideSelection = False.

  • Чтобы полностью раскрыть все пункты дерева (например, при старте программы), используйте процедуру TreeView.FullExpand.

  1. Работа с компонентом StatusBar.

  • Для добавления/редактирования секций (панелек) у StatusBar используйте встроенный редактор (для этого найдите в Инспекторе объектов свойствоPanels и нажмите[…]). Каждая секция имеет свой набор свойств, наиболее полезными среди которых являются Text иWidth.

  • Для изменения нужной секции в процессе выполнения программы полезно запомнить, что свойство Panelsпредставляет собоймассив панелек, так что к любой панельке можно обратиться по ее порядковому номеру (счет начинается с 0). Например, чтобы изменить надпись у 4 панельки, пишем:StatusBar.Panels[3].Text := ‘Файл изменен’.

  1. Создание массива записей для хранения разнородной информации о сотрудниках. Объявление записи («структуры» в терминологии языка С) в языке Pascal имеет следующий вид:

type

typename = record

field1: type1;

field2: type2;

...

end;

где typename – имя нового типа (записи),

field1, field2 – название компонентов (полей) этой записи,

type1, type2 – типы указанных полей.

Например, следующая простая запись из трех полей описывает человека:

type

TPerson = record

FIO: string[30]; // ФИО человека

BirthYear: integer; // Год рождения

Sex: boolean; // Пол (True – мужской, False – женский)

end;

Замечание: поля записи не могут принадлежать типам данных с неопределенным размером объекта (например, они не могут быть типаstring, который допускает хранение строк произвольной длины). Поэтому, в данном случае мы используем форму записи строки с явным указанием ее максимального размера.

После объявления типа записи можно создавать объекты указанного типа, например, переменные или массивы объектов:

var

SelectedPerson: TPerson;

Persons: array [1..5] of TPerson;

Значения массива можно при объявлении инициализировать списком значений:

var

Person: array [1..2] of TPerson = (

(FIO: ‘Иванов С. С.’; BirthYear: 1970; Sex: True),

(FIO: ‘Петрова М. И.’; BirthYear: 1975; Sex: False));

  1. Работа с файлами. Для работы с файлами в Delphi существует 3 способа:

  1. классические процедуры языка Pascal (Assign, Read, Write);

  2. функции Windows (FileOpen, FileRead, FileWrite);

  3. объектно-ориентированный подход на основе класса TFileStream.

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

Для того, чтобы записать в файл 2 переменные типа запись, необходимо выполнить следующую последовательность действий:

var

F: file of TPerson; // Создать файловую переменную типа запись

Man1, Man2: TPerson;

AssignFile (F, ‘fname’); // Связатьфайловую переменную с именем файла

Rewrite (F); // Открыть файл длязаписи

Write (F, Man1, Man2); // Записать вфайл 2 записи

CloseFile (F); // Закрыть файл

Для того, чтобы прочитать записи из файла в переменные, поступаем аналогично, только вместо процедуры Rewrite(F)используемReset(F), а вместоWrite(F,...) используемRead(F,...). Естественно, что при чтении/записи в файл вместо простых элементов можно использовать элементы массива.

  1. Прочие полезные советы:

  • Чтобы выполнить начальные инициализирующие действия при старте программы, когда еще ни одно окно не отображается на экране, воспользуйтесь событием OnCreate у главной формы. Аналогично, воспользуйтесь событиямиOnClose илиOnDestroy, чтобы выполнить определенные действия при завершениии программы.

  • Для хранения информации в полях «Образование», «Специальность», «Семейное положение» лучше воспользоваться не конкретными строковыми значениями, а соответствующими им числовыми индексами. Если в последствии какие-то из строк будут изменены, это никак не скажется на работе самой программы.

  • Для создания радиогруппы для поля «Семейное положение» удобнее воспользоваться компонентом RadioGroup, а не создавать четыре отдельных компонентаRadioButton.

  • Об изменении значения некоторых полей (Edit, Memo, ComboBox, TrackBar) можно узнать, перехватив для них событиеOnChange. Для других полей(CheckBox, RadioGroup, TreeView) то же самое можно узнать, перехватив событиеOnClick.

  • Чтобы вывод сведений о человеке в компоненте Memo получился «ровным», используйте для вывода текста моноширинный шрифт, например Courier New.

  • Чтобы в программе удобнее было выводить вперемежку строки, числа и данные других типов, можно воспользоваться функцией Format() – аналогом функции printf() в языке C. Например: TotalsLabel.Caption := Format (‘Количество =%d, Сумма= %d’, [Count, Sum]);

  • Чтобы изменить порядок перехода между различными элементами управления по клавише Tab, выберите команду меню Edit | Tab Order и переупорядочите элементы управления в нужном порядке.