10229

Ввод-вывод данных в Delphi

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа № 6 Вводвывод данных в Delphi. Цель работы: изучить наиболее часто используемые для организации вводавывода компоненты Edit MaskEdit Label Memo RichEdit StatusBar и встроенные диалоговые окна. Т.к. в предыдущих лабораторных работах уже было знакомство с некоторы

Русский

2013-03-24

73.5 KB

119 чел.

Лабораторная работа № 6

Ввод-вывод данных в Delphi.

Цель работы: изучить наиболее часто используемые для организации ввода-вывода компоненты (Edit, MaskEdit, Label, Memo, RichEdit, StatusBar) и встроенные диалоговые окна.

Т.к. в предыдущих лабораторных работах уже было знакомство с некоторыми компонентами, информация о них приводится в сокращенном виде.

TEdit

Компоненты класса TEdit (поля редактирования) предназначены для ввода числовой и текстовой информации.

Перечислим основные свойства компонента.

Свойство     Определяет 

Name         -     Имя объекта.

Text           -     Текст, находящийся в поле ввода - редактирования.

Left          -      Расстояние от левой границы поля до левой границы формы.

Top           -      Расстояние от верхней границы поля до верхней границы формы.

Height       -     Высота поля.

Width        -     Ширина поля.

Font          -     Шрифт, используемый для отображения вводимого текста.

ParentFont -     Признак наследования свойств шрифта родительской формы.

Если значение свойства ParentFont равно False то свойство Font этого объекта не наследует значение свойства Font "родителя". Это дает возможность установить свойства шрифта объекта иные, чем у формы.

Приведем некоторые события Windows, которые могут обработать большинство визуальных компонентов.

Свойство    Происходит 

OnClick            -    При щелчке кнопкой мыши.

OnDblClick       -    При двойном щелчке кнопкой мыши.

OnEnter            -    Перед тем как элемент управления получает фокус.

OnError             -    Когда элемент контроля обнаруживает ошибку и не может вернуть информацию об ошибке вызывающей программе.

OnExit              -    Непосредственно перед тем как элемент управления теряет фокус.

OnKeyDown     -    При нажатии клавиши. События OnKeyDown и OnKeyPress - это чередующиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp).

OnKeyPress      -    Когда пользователь нажимает клавишу, которая генерирует печатаемый символ. Не происходит при нажатии клавиш Tab, Enter и клавиш перемещения курсора.

OnKeyUp         -   При отпускании нажатой клавиши.

OnMouseDown -   При нажатии кнопки мыши.

OnMouseMove -   При перемещении мыши.

OnMouseUp      -   При отпускании кнопки мыши.

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

Приведем пример процедуры обработки события OnKeyPress фильтрующей символы, вводимые в компонент Edit.

Procedure TForm1.Edit1.KeyPress(Sender: TObject; var Key: Char);

begin

case Key of

'0'..'9', chr(8):;

',': if pos(',',Edit1.Text)<>0 then Key:=#0;

'-': if length(Edit1.Text)<>0 then Key:=#0;

'.': begin 

MessageDlg('Для отделения дробной части числа'+#13+'от целой используйте запятую', mtInformation, [mbOk], 0);

Key:=#0;

end

else Key:=#0

end;

end;

Процедура проверяет: если нажата цифровая клавиша, то в поле редактирования появляется символ; если нажата клавиша (BackSpace), то последний введенный символ стирается; если запятая, то процедура проверяет, есть ли в поле редактирования запятая и если есть, то появление второй запятой блокируется; если нажат (-), то минус появляется только в случае, если в поле редактирования нет ни одной цифры.

TMaskEdit

Ввод числовых данных можно осуществлять через компонент MaskEdit. Раскройте диалоговое окно свойства MaskEdit. Это свойство указывает маску компонента, т.е. определяет, какие символы и в какой последовательности может набирать пользователь в окне ввода. Например, для целых чисел введите в строке Input Mask #999999999;1; Теперь компонент будет автоматически контролировать ввод пользователя и отвергать любые символы, кроме знаков '+' или '-' в первой позиции (элемент маски '#') и цифр (элементы '9'). В окне 'Character for Blanks' укажите символ заполнителя - пробел.

Преобразовывать введенный текст MaskEdit1.Text в числовую информацию можно по нажатии клавиши Enter (символ #13). Для этого обработаем событие OnKeyPress компонента MaskEdit.

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);

begin

If Trim(MaskEdit1.Text)='' then Exit;

If Key = #13 then X:= StrToInt (Trim(MaskEdit1.Text))

end;

Функция Trim(S) возвращает строку аргумент без обрамляющих ее пробелов;

StrToInt(S) преобразует строку  символов S в целое число.

FloatToStr(S) преобразует строку  символов S в вещественное число.

TLabel

Текст, находящийся на форме, называют меткой. Перечислим некоторые свойства компонента.

Свойство        Определяет

Caption      -     Текстовая информация, надпись на компоненте

AutoSize   -    Автоматически устанавливает размеры метки в зависимости от количества символов текста метки и шрифта.

TMemo

Если надо ввести символьный массив, то вместо компонента Edit удобнее использовать компонент Memo, который позволяет вводить несколько строк текста.

Перечислим основные свойства компонента.

Свойство       Определяет 

Name     -        Имя объекта.

Lines     -        Текст, находящийся в строках поля Memo. Обращение к какому либо элементу массива строк задается: Memo1.Lines[i]. Строки Memo нумеруются с нуля.

Lines.Count -  Количество строк, введенных в поле Memo.

Text     -         Текст, находящийся в поле ввода - редактирования.

TRichEdit

Компонент TRichEdit представляет собой многострочное окно редактирования текстов в обогащенном формате .rtf, позволяющее производить выбор цвета, шрифта, поиск текста и т.д. В этом основное отличие TRichEdit от более простого компонента TMemo, в котором атрибуты форматирования одинаковы для всего текста.

При желании изменить атрибуты вновь вводимого фрагмента текста вы можете задать свойство SelAttributes. Это свойство типа TTextAttributes, которое в свою очередь имеет подсвойства: Color (цвет), Name (имя шрифта), Size (размер), Style (стиль) и ряд других. Например, если приложение имеет компонент RichEdit, диалог выбора шрифта TFontDialog FontDialog1, следующий код позволит пользователю менять атрибуты текста:

if FontDialog1.Execute then

with RichEdit1.SelAttributes do begin

  Color:=FontDialog1.Font.Color;

  Name:=FontDialog1.Font.Name;

  Size:=FontDialog1.Font.Size;

  Style:=FontDialog1.Font.Style;

 end;

RichEdit1.SetFocus;

В приведенном коде присваивается поочередно значение каждого свойства. Но этот текст можно кардинально сократить, воспользовавшись тем, что объекты SelAttributes и Font совместимы по типу. Поэтому можно присвоить сразу все свойства одного объекта другому:
  if FontDialog1.Execute then

    RichEdit1.SelAttributes.Assign(FontDialog1.Font);

 RichEdit1.SetFocus;

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

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

Alignment   Определяет выравнивание текста

FirstIndent   Число пикселей отступа красной строки

Numbering   Управляет вставкой маркеров, как в списках

LeftIndent   Отступ в пикселях от левого поля

RightIndent  Отступ в пикселях от правого поля

TabCount      Количество позиций табуляции

Tab      Значения позиций табуляции в пикселях

Значения подсвойств свойства Paragraph можно задавать только в процессе выполнения приложения, например, в событии создания формы или при нажатии какой-нибудь кнопки. Значения подсвойств свойства Paragraph относятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответственное выравнивание текущего абзаца:

RichEdit1.Paragraph.Alignment:=taLeftJustify; // Влево

RichEdit1.Paragraph.Alignment:=taCenter;   // По центру 

RichEdit1.Paragraph.Alignment:=taRightJustify;// Вправо

Следующий оператор приведет к тому, что текущий абзац будет отображаться как список, т.е. с маркерами:

RichEdit1.Paragraph.Numbering:=nsBullet;

Уничтожение списка в текущем абзаце осуществляется оператором

RichEdit1.Paragraph.Numbering:=nsNone;

TStatusBar

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

Свойство SimplePanel компонента TStatusBar определяет, включает ли полоса состояния одну или множество панелей. Если SimplePanel = true, то вся полоса состояния представляет собой единственную панель, текст которой задается свойством SimpleText. Если же SimplePanel = false, то полоса состояния является набором панелей, задаваемых свойством Panels. В этом случае свойство SizeGrip определяет, может ли пользователь изменять размеры панелей в процессе выполнения приложения.

Каждая панель полосы состояния является объектом типа TStatusPanels. Свойства панелей вы можете задавать специальным редактором наборов, который можно вызвать тремя способами: из Инспектора Объектов кнопкой с многоточием около свойства Panels, двойным щелчком на компоненте TStatusBar или из контекстного меню, выбрав команду Panels Editor. В окне редактора вы можете перемещаться по панелям, добавлять новые или уничтожать существующие. При перемещении по панелям в окне Инспектора Объектов вы будете видеть их свойства.

Основное свойство каждой панели - Text, в который заносится отображаемый в панели текст. Другое существенное свойство панели - Width (ширина). Свойство Style определяет стиль панели: psText - текстовая, psOwnerDraw - предназначена для изображений на канве.

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

StatusBar1.Panels[0].Text := 'текст 1';

или

StatusBar1.Panels.Items[0].Text := 'текст 1';

Количество панелей полосы состояния можно определит из подсвойства Count свойства Panels. Например, следующий оператор очищает тексты всех панелей:

for i:= 0 to StatusBar1.Panels.Count -1 do  

StatusBar1.Panels[i].Text := '';

Свойство AutoHint, установленное в true, обеспечивает автоматическое отображение в первой панели полосы состояния вторых частей подсказок (свойства Hint) тех компонентов, над которыми перемещается курсор мыши. Причем отображение происходит независимо от значения свойства ShowHint этих компонентов. Конечно, панель должна быть текстовой (Style = psText).

Свойство SizeGrip определяет наличие в нижнем правом углу полосы состояния захвата, позволяющего пользователю изменять размер полосы. Если при этом полоса выровнена по нижнему краю формы (Align = alBottom), то одновременно будет изменяться и размер окна приложения.

Встроенные диалоговые окна ввода-вывода текста

1. ShowMessage(const Msg : WideString) отображает простое окно сообщения с кнопкой OK. Заголовок окна совпадает с именем выполняемого файла приложения.

ShowMessage('Работа приложения успешно завершена.');

ShowMessage('Задано ' + IntToStr(N1) + ' параметров из ' + IntToStr(N2)); // N1 и N2 - целые переменные содержат соответствующие числа,

//которые переводятся в строки функцией IntToStr.

2. ShowMessageFmt(const Msg:WideString; Params:array of const) отображает окно сообщения с кнопкой OK. Параметр Msg задает строку описания формата, а параметр Params задает массив параметров, форматируемых строкой Msg. Заголовок окна совпадает с именем выполняемого файла приложения.

ShowMessageFmt('Задано %d параметров из %d ', [N1, N2]);

3. ShowMessagePos (const Msg: WideString; X, Y: Integer), во всем аналогичная функции ShowMessage, отображает окно в заданном месте экрана.

4. MessageDlg(const Msg: WideString; AType: TMsgDlgType;AButtons: TMsgDlgButtons; HelpCtx: Longint) отображает диалоговое окно и ожидает ответа пользователя. Сообщение в окне задается параметром функции Msg. Вид отображаемого окна задается параметром AType. Возможные значения этого параметра:

mtWarning -  Окно замечаний, содержащее желтый восклицательный знак.

mtError  -  Окно ошибок, содержащее красный стоп-сигнал.

mtInformation - Информационное окно, содержащее голубой символ "i".

mtConfirmation - Окно подтверждения, содержащее зеленый вопросительный знак.

mtCustom  - Заказное окно без рисунка. Заголовок соответствует имени выполняемого файла приложения.

Параметр AButtons определяет, какие кнопки будут присутствовать в окне. Тип TMsgDlgBtns параметра AButtons является множеством, которое включает различные кнопки. Возможные значения видов кнопок:

mbYes  - Кнопка с надписью 'Yes'

mbNo  - Кнопка с надписью 'No'

mbOK  - Кнопка с надписью 'OK'

mbCancel  - Кнопка с надписью 'Cancel'

mbHelp - Кнопка с надписью 'Help'

mbAbort  - Кнопка с надписью 'Abort'

mbRetry  -  Кнопка с надписью 'Retry'

mbIgnore - Кнопка с надписью 'Ignore'

mbAll  -  Кнопка с надписью 'All'

Список необходимых кнопок заключается в квадратные скобки [ ], поскольку параметр AButtons является множеством. Если внутри скобок список отсутствует, в окне не будет ни одной кнопки и пользователю придется закрывать окно системными кнопками Windows.

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

Значение                  Описание

mbYesNoCancel  Включает в окно кнопки Yes, No и Cancel

mbOkCancel Включает в окно кнопки OK и Cancel

mbAbortRetryIgnore Включает в окно кнопки Abort, Retry и Ignore

Эти константы являются предопределенными множествами. Поэтому при их использовании их не надо заключать в квадратные скобки [ ].

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

Функция MessageDlg возвращает значение, соответствующее выбранной пользователем кнопке. Возможные возвращаемые значения:

mrNone,  mrAbort,    mrYes,  mrOk,  mrRetry,  mrNo,  mrCancel,  mrIgnore,   mrAll.

Примеры:

1. Заключительный диалог при окончании работы приложения.

if MessageDlg('Действительно хотите закончить приложение?',

   mtConfirmation, [mbYes, mbNo], 0) = mrYes then

 begin

       MessageDlg('Работа приложение закончена', mtInformation,

              [mbOk], 0);

   Close;

 end;

2.  Сообщение об ошибке и замечание.

on Exception do

 begin

  MessageDlg('Произошла ошибка.', mtError,

           [mbOk], 0);

     MessageDlg('Будьте внимательнее.', mtWarning,

           [mbOk], 0);

 end;

5. MessageDlgPos (const Msg: WideString; AType: TMsgDlgType;AButtons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer), во всем аналогичная функции MessageDlg, отображает окно в заданном месте экрана.

6.  API-функции MessageBox и MessageBoxEx также предназначены для вывода информации. Для начального обучения достаточно сложны в применении и будут рассмотрены позднее.

7. function InputBox(const ACaption, APrompt, ADefault: string): string отображает входное диалоговое окно, которое позволяет вводить в строку. ACaption - заголовок диалогового окна, APrompt – текст-приглашение, который подсказывает что вводить в окно, ADefault - строка, которая появляется в окне редактирования по умолчанию. Если выбирается кнопку Cancel, InputBox возвращает эту встроенную строку. Если потребитель выбирает кнопку OK, InputBox возвращает строку в окне редактирования. Если приложению нужно знать что выбрал пользователь (OK или Отмена), используйте взамен функцию function InputQuery(const ACaption, APrompt: string; var Value: string): Boolean;

Задания на разработку

1. Создайте программу для решения квадратного уравнения. Ввод и вывод данных оформите через компонент TEdit. Результат сравните с примером (\Example1).

2. Разработайте программу для контроля веса. Оптимальный вес (кг) вычисляется по формуле: Рост (см)-100.

3. Создайте текстовый редактор, позволяющий работать с форматом rtf и задавать выlеленному участку текста цвет, размер, шрифт, стиль и производить выравнивание текста. Количество символов в тексте выведите в компоненте StatusBar (\Example2).

4. Создайте приложение, демонстрирующее все вам известные встроенные диалоговые окна с возможностью выбора всех параметров (\Example3).

Контрольные вопросы

  1.  Чем отличается компонент TMaskEdit от TEdit?
  2.  Как оформляется ввод специализированной информации (целые, вещественные числа, четные, простые числа, выборочные символы) в компоненты ввода-вывода?
  3.  В чем отличие компонента TRichEdit от TMemo?
  4.  Для каких целей используется полоса состояния TStatusBar?
  5.  Какие замены  вы могли бы предложить компоненту TStatusBar?
  6.  Приведите примеры использования встроенных диалоговых окон.