Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции delphi 1часть

.pdf
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
814.86 Кб
Скачать

Процедура Move(Index1, Index2: integer) перемещает строку с позиции Index1 в

позицию Index2. После перемещения номера строк корректируются.

Метод IndexOf(const S:string) : integer определяет, содержится ли строка S в списке.

Если строка присутствует в списке, то возвращается её номер, иначе возвращается значение -1.

Методы LoadFromFile и SaveToFile позволяют загрузить строки в список из файла и сохранить список строк в файле. При чтении строк из файла, предыдущее содержимое списка удаляется. Если при сохранении списка будет указано имя файла, которого нет, то такой файл будет создан.

Для выбора элементов из списка можно ещё использовать компоненты CheckListBox,

ComboBoxEx, ValueListEditor.

Список CheckListBox подобен ListBox, но у каждой строки есть индикатор, состояние которого характеризуется свойством Checked. Это свойство можно устанавливать программно, либо читать, отслеживая действия пользователя во время работы приложения

(аналогично CheckBox). Например:

if CheckListBox1.Checked[1] and CheckListBox1.Checked[2] then Form2.Show;

С помощью задаваемого программно свойства Header список CheckListBox можно разбить на разделы и дать этим разделам названия:

CheckListBox1.Header[3]:=true;

Расширенный комбинированный список ComboBoxEx подобен ComboBox, но хорошо приспособлен для включения в элементы списка изображений.

Компонент ValueListEditor предназначен для ввода строк вида «имя = значение».

Окно имеет две колонки с заголовками Key для имён и Value – для значений.

ValueListEditor удобно использовать для работы с данными сложной структуры.

Например, вводить и редактировать списки студентов, содержащие большое количество сведений (фамилию, имя, отчество, год рождения, пол, адрес, телефон, шифр и т.д.).

Компоненты-таблицы DrawGrid и StringGrid

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

В ячейках таблицы DrawGrid вместе с текстом можно поместить и рисунки. Чтобы таблица была работоспособной, в ней как минимум следует определить обработчик события OnDrawCell, которое возникает при необходимости прорисовать ту или иную ячейку. Для прорисовки используется свойство Canvas. При формировании процедур

прорисовки используются методы CellRect и MouseToSell. Компонент DrawGrid только отображает информацию, но не хранит её.

Более простой и удобной в использовании является таблица StringGrid,

предназначенная для работы с текстовыми данными. Компонент StringGrid является прямым потомком DrawGrid, от которого унаследовал большинство свойств и методов.

Поэтому StringGrid тоже позволяет отображать графические образы, но их прорисовка и хранение выполняются программно.

Таблица делится на две части – фиксированную и рабочую. Фиксированная часть служит для отображения заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы. Остальная часть таблицы – рабочая, она содержит произвольное число столбцов и рядов. Количество рядов и столбцов можно изменять в Инспекторе объектов и программно. По умолчанию свойства ColCount и RowCount, определяющие размеры таблицы, имеют значение 5. Так как нумерация столбцов и строк начинается с нуля, то первоначальный размер таблицы 6×6. Если рабочая часть не умещается в пределах окна компонента, то используются полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется её содержимое – заголовки строк

истолбцов.

Спомощью сложного свойства Options определяется внешний вид и функциональные свойства таблицы. Так, параметр goEditing управляет режимом редактирования. Чтобы можно было вводить в таблицу данные и редактировать содержимое ячеек, параметр goEditing надо установить в true. При работе приложения пользователь может вводить данные только в ячейки рабочей области. Однако программно может быть реализован доступ к любым ячейкам таблицы.

Свойство Cells[ACol,ARow:integer] : String обеспечивает доступ к отдельным ячейкам и представляет собой двумерный массив, содержащий строки текста ячеек таблицы. Размеры массива определяются значениями свойств ColCount и RowCount.

Параметр ACol указывает колонку ячейки, а параметр ARow – её строку. Доступ к ячейкам таблицы осуществляется во время выполнения приложения. Для примера зададим нужное число строк таблицы и запишем заголовки первого и второго столбца:

StringGrid1.RowCount:=10;

StringGrid1.Cells[0,0]:='Аргумент';

StringGrid1.Cells[1,0]:='Функция';

Свойство Objects[ACol,ARow:integer]:TObject обеспечивает доступ к объекту,

связанному с ячейкой (ACol, Arow). Это свойство применяется, в основном, для

связывания изображения со строками и использования их для специфического отображения данных в таблице. Следующая строка помещает объект MyBitmap типа

TBitmap в 10-ю колонку, 3-ю строку таблицы StringGrid:

StringGrid1.Objects[10,3]:= MyBitmap;

Если объект был помещен в массив Objects, он продолжит своё существование даже после того, как таблица StringGrid будет удалена.

Свойство Cols[Index:integer]:TString – представляет собой список строк, содержащий значения всех ячеек колонки с номером Index. Это свойство используется для получения доступа к любому столбцу.

Свойство Rows[Index:integer]:TString обеспечивает доступ к ряду с номером,

заданным параметром Index. Для примера выполним копирование первой строки

StringGrid2 в четвёртую строку StringGrid1:

StringGrid1.Rows[4].Assign(StringGrid2.Rows[1]);

Аналогично можно выполнять копирование в любые компоненты, имеющие свойства класса TString, например, в ComboBox или ListBox.

Компонент StringGrid позволяет выбирать значения, отображённые в ячейках, во время работы приложения. В момент выбора ячейки генерируется событие OnSelectCell, в

обработчик которого передаются номера столбца ACol и строки ARow выделенной ячейки.

Это событие позволяет использовать в программе значение из выбранной ячейки: procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,

ARow: Integer; var CanSelect: Boolean);

begin

if (ACol in [1..3]) and (ARow in [1..3])

then case ARow of

1:xn:=strtofloat(StringGrid2.cells[ACol,ARow]);

2:xk:=strtofloat(StringGrid2.cells[ACol,ARow]);

3:hx:=strtofloat(StringGrid2.cells[ACol,ARow]);

end;

end;

3.4.6. Компоненты для отображения текста Метка Label

Компоненты класса TLabel (метки) предназначены для размещения текстов:

заголовков для других компонент, разделителей, поясняющих надписей и т.д. Элементы этого типа применяют в тех случаях, когда надо отобразить текст, который не должен изменяться пользователем.

Свойство AutoSize указывает, будет ли метка изменять свои размеры в зависимости от помещённого в свойство Caption текста.

Свойство Alignment управляет выравниванием текста по горизонтали, а свойство

LayOut – по вертикали.

Свойство WordWrap разрешает/запрещает разрыв строки на границе слова. Для вывода многострочных надписей необходимо AutoSize присвоить значение false,

WordWrap присвоить значение true и задать необходимые размеры метки.

Статический текст StaticText

Статический текст StaticText очень похож на метку Label. Дополнительно этот компонент может иметь рамку, задаваемую свойством Border. Для записи длинного текста в несколько строчек достаточно установить в свойстве AutoSize значение false и задать достаточный размер компонента.

Форматированный текст RichEdit

Для создания, просмотра и редактирования rtf-документов в приложениях используется компонент RichEdit. Многострочный редактор RichEdit работает с расширенным текстовым форматом, хранит дополнительную служебную информацию,

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

Текст можно подготовить заранее, сохранить в файле, а затем при работе приложения в нужный момент загрузить в RichEdit методом LoadFromFile. Иногда удобно на этапе разработки приложения передать подготовленный текст через буфер или ввести небольшой текст с клавиатуры, используя String List Editor. В этом случае форматирование текста выполняется путём задания нужных значений свойств в инспекторе объектов. Кроме того, компонент RichEdit имеет сложные свойства

SelAttributes и Paragraph, доступные из программы и позволяющие динамически изменять параметры символов и абзацев. Для программного добавления строк используется метод

Add, а для очистки редактора – метод Clear.

3.4.7. Компоненты для работы с графикой Компонент Shape

Этот компонент рисует одну из простейших геометрических фигур: прямоугольник,

прямоугольник с закруглёнными краями, квадрат, квадрат с закруглёнными краями,

эллипс, окружность. Вид геометрической фигуры задаётся свойством Shape, заполнение внутреннего пространства – свойством Brush, а отрисовка внешних границ – свойством

Pen.

Свойства Brush и Pen сложные. Brush.Color, Pen.Color задают цвет заполнения и цвет граничной линии. Метод заполнения определяется значением свойства Brush.Style.

Тип линии задаётся значением свойства Pen.Style, а свойство Pen.Width задаёт толщину линии. Если толщина линии равна 1, то, изменив свойство Pen.Style, можно выбрать другой тип линии.

Свойство пера Mode определяет режим наложения графической фигуры на экран или другую поверхность. Режим наложения действует не только на контур фигуры, но также на её внутреннюю область, контролируемую кистью.

Компонент Image

Компонент Image служит для размещения на форме одного из поддерживаемых

Delphi изображений, хранимых во внешних файлах. Используются растровые изображения .bmp, .jpg, иконка .ico, метафайл .wmf.

Центральным свойством класса является Picture, которое задаёт нужный тип изображения и служит для него контейнером. Отображаемая картинка хранится в свойстве Picture, доступном на этапе проектирования и на этапе выполнения.

Свойство AutoSize позволяет управлять автоматическим изменением размера изображения: если имеет значение true, то компонент изменяет свой размер в зависимости от размера изображения (размер компонента Image подгоняется под размер картинки).

При AutoSize равном false, размер компонента остаётся неизменным и, если изображение больше размера компонента, то выводится только часть картинки. По умолчанию свойство AutoSize имеет значение false.

Свойство Stretch разрешает/запрещает изменять размер изображения так, чтобы оно занимало всю клиентскую область компонента (только для файлов .bmp и .wmf), то есть позволяет подогнать размер картинки под размер компонента. Масштабирование целесообразно применять для метафайлов.

3.4.8.Формирование меню

Различают два типа меню: главное и контекстное (локальное, всплывающее).

Главное меню обычно располагают под заголовком формы. Выбор пункта главного меню вызывает появление на экране выпадающего меню. Выпадающее меню содержит команды или вложенные выпадающие меню. Уровень вложения не ограничен, но создавать очень сложные меню не рекомендуется, так как это затрудняет работу с приложением.

Всплывающее меню не привязано к конкретному месту формы или к главному меню.

Оно появляется по специальному требованию, обычно по щелчку правой кнопкой мыши.

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

В Delphi главное меню реализовано компонентом MainMenu, а всплывающее –

PopupMenu. Подключение меню к форме выполняется через свойства формы MainMenu и PopupMenu. Компоненты, применяемые при создании меню, являются невизуальными. На этапе выполнения их значки не отображаются. Значки компонентов MainMenu и PopupMenu используется на этапе разработки для того, чтобы можно было задать значения свойств.

Дизайнер меню

Формирование пунктов меню выполняется в Дизайнере меню. Дизайнер меню вызывается из контекстного меню, связанного с компонентами MainMenu или PopupMenu,

командой Menu Designer (другой способ вызова - двойной щелчок на компонентах).

Помимо создания и модификации меню утилита Menu Designer позволяет загружать меню из ресурсов и сохранять меню в качестве шаблонов. Меню, сохранённые как шаблоны, могут использоваться несколькими приложениями. Создание и удаление пунктов меню выполняется в окне Дизайнера меню, а свойства задаются в Инспекторе объектов.

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

(расположенного справа) или создать вложенное меню. Щелчок по пункту главного меню приводит к началу формирования вложенного меню: ниже заполненного пункта появляется пустая ячейка. По мере заполнения строк ниже появляется пустая ячейка,

завершающая список команд. После того, как все нужные команды вложенного меню записаны, можно приступать к созданию следующего пункта главного меню. Пустую ячейку удалять не следует, она видна только на этапе проектирования.

На любом этапе создания приложения меню можно отредактировать. Для этого следует войти в Дизайнер меню, установить курсор на нужном пункте и вызвать контекстное меню щелчком правой кнопки мыши. Контекстное меню позволяет вставить новый пункт (Insert), удалить существующий (Delete), создать выпадающее меню (Create Submenu). Кроме того, имеется несколько команд для работы с шаблонами меню. Все действия относятся к пункту меню, находящемуся в позиции курсора.

Заполнение пунктов меню

Пункты меню являются компонентами, принадлежащими к классу TMenuItem. Для пунктов меню определено свойство OnClick, которое возникает при щелчке мышью или при нажатии на клавишу Enter, если перед этим команда была выбрана.

Свойство Caption содержит текст пункта меню (заголовок). При записи этого свойства можно использовать символ & (амперсант) для формирования подчёркнутого символа, например File, Open. Подчёркнутый символ применяется совместно с клавишей

Alt для вызова пунктов меню с клавиатуры. Если свойству Caption присвоить значение "–"

(минус), то будет сформирована горизонтальная линия, которая используется для разделения групп команд.

Очень часто пункты меню являются переключателями. Если пункт меню работает как обычный переключатель, то он отмечается символом . Наличие такого символа у независимого переключателя говорит о том, что команда выполняется. Повторный выбор этого же пункта приводит к тому, что команда выключается (символ исчезает).

Включена команда или нет, определяется свойством Checked: если значение равно true, то пункт меню выбран и содержит метку.

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

GroupIndex и присвоить свойству RadioItem значение true. Для приведения в действие механизма переключения следует для всех пунктов группы определить обработчики события OnClick. Выбор любого пункта приводит к тому, что его свойство Checked

становится равным true. Некоторые режимы работы приложения могут быть недоступны пользователю в отдельные моменты времени. Пункты меню делают запрещёнными с помощью свойства Enabled.

Как принято в Windows, для любого пункта меню можно задать комбинацию клавиш, которая позволит выполнить команду, не открывая меню. «Быстрые клавиши» выбираются в свойстве ShortCut. Следует помнить, что Delphi не контролирует выбранные комбинации, разработчик должен сам проследить за тем, чтобы использовались разные клавиши.

Локальное меню

Контекстное меню всплывает автоматически после щелчка правой кнопкой мыши,

если значение свойства Autopopup равно true. Место появления зависит от позиции курсора в момент щелчка и определяется свойством Alignment. С позицией курсора может совпадать левый (paLeft) или правый (paRight) верхний угол меню, либо середина верхнего края (paCenter).

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

Локальное меню может быть создано для любого оконного компонента. Чтобы связать щелчок правой кнопкой мыши на компоненте с раскрытием меню, в свойство

PopupMenu этого компонента надо записать имя меню.

3.4.9. Другие компоненты Компонент UpDown

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

обычно в сочетании с Edit.

Чтобы связать UpDown с конкретным компонентом, надо имя этого компонента задать в свойстве Associate. Место появления кнопок со стрелками определяется свойством AlignButton, они могут располагаться слева (udLeft) или справа (udRight) от ассоциированного компонента.

Свойство Position содержит корректируемое числовое значение. Шаг изменения определяется свойством Increment. Максимальное и минимальное значения задаются свойствами Max и Min. Для того чтобы можно было изменять значение мышью и на клавиатуре, свойство ArrowKeys задают true.

Компонент Timer

Таймер позволяет задавать в приложении интервалы времени. Управление таймером осуществляется с помощью свойств Interval, Enabled и события OnTimer.

Свойство Interval задаёт интервал времени в миллисекундах от момента включения таймера до события OnTimer. Минимальный интервал равен 55 мсек (примерно 1 тик),

интервалы кратны 55 мсек. Короткие интервалы времени (единицы и десятки миллисекунд) точно задать с помощью таймера не удаётся: реальные периоды срабатывания будут больше.

Свойство Enabled определяет, включён ли таймер (если true, то включён). Причём,

раз включённый таймер будет возбуждать событие OnTimer до тех пор, пока его свойство

Enabled не станет равным false.

Альтернативным способом отключения таймера является задание интервала срабатывания равным 0 при Enabled = true.

В приведённом примере в обработчике события OnFormCreate задаются начальные размеры формы, которые затем меняются по таймеру.

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Height:=28; Form1.Width:=124;

Timer1.Enabled:=true;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

with Form1 do

begin

if Width<574 then Width:=Width+50 else

if Height<308 then Height:=Height+40 else Timer1.Enabled:=false;

end;

end;

3.5.Создание окон диалога 3.5.1. Процедуры и функции, реализующие диалоги

ВDelphi имеются процедуры и функции для отображения диалоговых окон общего

назначения. Для вывода сообщений используются процедура ShowMessage и функции

MessageDlg, MessageDlgPos. Для ввода данных применяются окна диалога, отображаемые функциями InputBox и InputQuery.

Процедура ShowMessage (const Msg : String) выводит окно сообщения с кнопкой ОК.

Заголовок содержит название исполняемого файла приложения, а строка Msg содержит текст сообщения. Например:

ShowMessage('Повторите ввод целого числа');

Функция MessageDlg (const Msg: String; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint):Word отображает окно сообщений и позволяет получить ответ пользователя. Параметр Msg содержит выводимое сообщение. Параметр

AType задаёт тип окна (Warning, Error, Information и др.). Параметр AButtons определяет набор кнопок окна (Yes, No, OK, Cancel, Cancel, Help, Abort, Retry, Ignore). Для этого параметра имеются две константы, задающие предопределенные наборы кнопок:

mbYesNoCancel = [mbYes, mbNo, mbCancel] mbOKCancel = [mbOK, mbCancel]

Параметр HelpCtx определяет тему справки, появляющейся при нажатии пользователем клавиши F1. Обычно значение этого параметра равно нулю.

Щелчок по любой кнопке, кроме Help, закрывает окно диалога. При этом функция

MessageDlg возвращает модальный результат, проанализировав который, можно управлять выполнением приложения.

Функция MessageDlgPos отличается от функции MessageDlg наличием параметров х и y, управляющих положением окна на экране.

Функция InputBox(const ACaption, APrompt, ADefault: String):String отображает в центре экрана диалоговое окно, служащее для ввода строки текста. В окне имеется поле ввода, а также кнопки ОК и Cancel. Параметр ACaption задает заголовок окна, параметр

APrompt содержит поясняющий текст к полю ввода. Параметр ADefault определяет строку,

возвращаемую функцией при отказе пользователя от ввода информации нажатием кнопки

Cancel или клавиши Esc. Пример использования функции InputBox: st:=InputBox('Студент', 'Введите фамилию', 'Неизвестный');

Функция InputQuery(const ACaption, APrompt:String; var Value:String):Boolean

отличается от функции InputBox тем, что вместо строки по умолчанию используется параметр Value, который при подтверждении ввода содержит введенную пользователем строку. Например:

InputQuery('Студент', 'Введите фамилию', st);

Возвращаемое функцией InputQuery логическое значение позволяет определить,

каким образом завершен диалог (ОК соответствует true).

3.5.2.Стандартные диалоговые панели

На странице Dialogs Палитры компонентов расположены компоненты, реализующие диалоговые окна общего назначения. Использование стандартных окон диалога выполняется по единому сценарию, приведённому ниже.

Поместить на форму компонент и настроить его свойства в Инспекторе объектов или программно.

Вызвать метод Execute, который создаёт и выводит окно на экран. Вызов этого метода обычно располагается в обработчике какого-либо события. Так как окно диалога модальное, то после применения метода Execute выполнение программы приостанавливается до тех пор, пока пользователь не закроет окно. Функция Execute

возвращает true, если результат диалога успешный (OK).

Проанализировав результат диалога, можно выполнить третий этап: использование введённых с помощью диалогового окна данных.

Рассмотрим более подробно диалоговые окна открытия и сохранения файла. Так как окна похожи, то компоненты OpenDialog и SaveDialog, предназначенные для их создания,

имеют идентичный набор свойств и методов. Свойство FileName строкового типа задаёт