Разработка прикладных программ для ОС Windows с помощью интегрированных сред Delphi/C++Builder

Первоначальные теоретические знания о функционировании ОС Windows и исследование практических основ создания приложений в системах Delphi/C++Builder. Механизм и основные этапы разработки простых Windows-приложений, основы программирования в нем.

Рубрика Программирование, компьютеры и кибернетика
Вид методичка
Язык русский
Дата добавления 28.06.2009
Размер файла 813,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Form1. Hint:='Это строка текста контекстной помощи';

C++Builder. Согласно синтаксису C++ вышеприведенный код должен быть записан как

Form1->ShowHint=true; // для C++ в 'true / false' все буквы прописные!

Form1->Hint= «Это строка текста контекстной помощи»;

4.1.2 Настройка связи событий с процедурами их обработки

Установка связи событий с обрабатывающими процедурами также проста и производится на странице Events Инспектора Объектов (см. рис. З).

Для задания нужной процедуры следует выбрать строку соответствующего события и единожды щелкнуть кнопкой «мыши» по кнопке со стрелкой вниз, появляющейся в правой части соответствующей строки (при этом будет показан список уже спроектированных процедур, соответствующих данному событию по списку формальных параметров; пользователю остается выбрать нужную) или дважды щелкнуть на соответствующей строке (в этом случае Delphi сгенерирует уникальное имя процедуры и создаст прототип и заготовку ('пустышку') этой процедуры с отсутствующим телом процедуры; имя процедуры можно в дальнейшем изменить) или просто ввести желаемое имя процедуры (прототип и «пустышка» также будут сгенерированы).

Например, на рис. 3 процедуры FormActivate, FormClose, FormCreate и FormResize связаны (т.е. будут вызываться при возникновении соответствующих событий) с событиями OnActivate (возникает в момент активизации формы), OnClose (возникает в момент закрытия формы), OnCreate (возникает при создании формы) и OnResize (возникает при изменении размеров формы) соответственно.

Например, ниже приведена спроектированная Delphi заготовка ('пустышка') процедуры FormActivate (текст TForm1. FormActivate говорит о принадлежности процедуры FormActivate объекту типа TForm1)

procedure TForm1. FormActivate (Sender: TObject);

begin

end;

В описательную часть (после служебного слова type для Delphi) будет также помещен прототип процедуры в виде строки

procedure Form1. Activate (Sender: TObject);

C++Builder. В этом случае «пустышка» (в файле *.СРР) и прототип (в файле *) имеют вид (квалификатор __fastcall задает режим передачи параметров функции не через стек, а через регистры процессора - если это возможно, конечно)

void _fastcall TForm1: FormActlvate (Tobject *Sender)

{

}

void _fastcall Form1: Activate (TObject *Sender);

Текст (тело процедуры) между служебными словами begin и end; (открывающей и закрывающей фигурными скобками для C++Builder'a) заполняет пользователь, определяя тем самым функциональность данной процедуры. Естественно, возможно определение любого количества процедур, не связанных с событиями; каждая также требует прототипа.

Заметим, что формальный параметр Sender в заголовке функции указывает на объект, вызвавший событие.

Часто приходится строить процедуры обработки следующих событий - OnClick и OnDbClick (одинарный или двойной щелчок 'мышью'), OnKeyDown, OnKeyPress (нажатие и отпускание клавиши), OnMouseDown, OnMouseUp, OnMouseMove (отпускание, нажатие клавиши и перемещение 'мыши'), OnPaint (требование перерисовки объекта).

Для реализации обработки нажатий клавиши методами формы следует установить KeyPreview=TRUE и создать процедуру-обработчик события OnKeyDown

Procedure TForm1. FormKeyDown (Sender: TObject; var Key: Word;

Shift: TShiftState);

Begin

if Printer. PrintIng AND {если происходит печать И}

(Key=VK_ESCAPE) then {нажата клавиша ESC}

begin

Printer. Abort; {остановить печать}

МеssageDlg ('Вывод на печать прерван пользователем',

mtlnformation, [mbOk], 0);

end;

End; {конец процедуры}

Важно, что связывать события с их обработчиками можно и во время выполнения приложения (RunTime), для этого выполняется простое присваивание типа нижеприведенного (в правой части выражения находится имя процедуры-обработчика события):

Form1.0nCreate:=FormCreate:

C++Builder. Соответственно

Form1->OnCreate = FormCreate;

Для переключения между окном формы и окном исходного текста (при создании тела процедур) служит клавиша F12. Другой способ - View|Project Manager (или сочетание клавиш Ctrl+V+P) и в дальнейшем выбор нужной формы из предлагаемого списка и использование кнопок View unit для показа исходного текста формы или View form для показа внешнего вида формы (см. рис. 4).

Окно Project Manager позволяет добавлять и изымать модули и формы из проекта, а также устанавливать некоторые параметры проекта.

На рис. 5 приведено окно Project Options, вызываемое кнопкой Options из Project Manager или путем выбора Options|Forms в главном меню. Здесь в левом подокне приведен список форм, создаваемых Delphi автоматически (в момент старта программы, именно так функционируют большинство форм), в правом подокне - список допустимых форм (создаваемых динамически во время работы Delphi-программы, что бывает необходимо в больших проектах). Динамически создаваемые формы используют компонентный метод Create для создания и метод Free для разрушения; связанные вопросы сложны и данном руководстве не рассматриваются.

Рис. 4. Окно Project Manager для управления модулями и формами

4.1.3 Установка свойств во время выполнения приложения

Выше была рассмотрена методика настройки свойств компонентов Delphi / C++Builder во время проектирования приложения (DesignTime), однако большинство свойств может быть успешно установлено (переустановлено) в период выполнения ЕХЕ-модуля (RunTime). Целесообразно производить это в функции, связанной с событием OnCreate (или OnActivate) для формы (события при создании формы происходят в следующей последовательности - Create, Activate, Paint). В нижеприведенном примере связанная с событием OnCreate (создание формы) процедура FormCreate вызывает процедуру чтения файла конфигурации и устанавливает свойство FormStyle в значение fsMaximized ('растягивает' форму во весь экран), а вызываемая в момент активизации формы процедура OnActivate выполняет присваивание значения переменной FlagPreview свойству Checked компонента Component_N7 и вызывает процедуру LoadFileAnimateOfBanner загрузки файла анимации флага.

Рис. 5. Окно Project Options управления параметрами проекта

procedure TForm1. FormCreate (Sender: TObject);

begin

ReadConfig; {прочитать файл конфигурации}

FormStyle=wsMaximized;

end; {конец процедуры}

procedure TForm1. OnActivate (Sender: TObject);

begin

Component_N7. Checked:= FlagPreview;

LoadFileAnimateOfBanner; {загрузить файл анимации флага}

end; {Баканов В.М., МГАПИ, кафедра ИТ-4, 1996-2000}

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

4.1.4 Модальный и немодальный диалоги

Реальный проект состоит из многих (часто десятков) форм (окон), каждое из которых активируется в виде реакции на некоторое событие (нажатие кнопки «мышью» в простейшем случае).

Существует два основных типов диалога - модальный (активное в данный момент окно перехватывает все сообщения и до его закрытия обращение к другим окнам - даже присутствующим на экране - невозможно) и немодальный (возможна активизация - например, щелчком «мыши» - любого из присутствующих на экране окон). Наиболее часто используются модальные диалоги (например, подобные WINDOWS'95 системы использует в основном модальные диалоги), однако некоторые приложения (например, известный из WINDOWS'3.1х модуль SYSEDIT) строятся на основе немодальных диалогов.

Модальный вызов формы оформляется с использованием компонентного метода ShowModal (в нижеследующей строке модально вызывается форма с именем FormMediaData)

FormMediaData. ShowModal;

Немодальный вызов той же формы производит метод Show

FormMediaData. Show;

C++Builder. Соответственно

FormMediaData->ShowModal();

FormMediaData->Show();

В обоих случаях метод Close закрывает форму.

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

4.1.5 Стандартные формы-панели сообщений

Система Delphi предоставляет пользователю (заранее предопределенные) формы - окна диалоговых панелей сообщений.

Функция MessageDlg позволяет вывести сообщение пользователю и имеет возможность включить в форму несколько кнопок для выбора ответа пользователя. Например, нижеследующий пример стандартного использования функции MessageDlg для закрытия программы при вызове выводит соответствующий текст в форме с графическим символом подтверждения (согласно константе mtConfirmation) и две кнопки с надписью Ok и Cancel (константы mbOk и mbСаnсеl), используя тему контекстного HELP'a с номером 9996 и производит действия в соответствии с возвращаемым MessageDlg значением

Procedure TFormI. FormClose (Sender: TObject;

var Action: TCIoseAction);

Begin {запросить подтверждение на закрытие формы}

if MessageDlg ('Bы в самом деле хотите закончить работу?', mtConfirmation, [mbYes, mbNo],

9996) = mrYes {была нажата кнопка Yes}

then

Action:= caFree {была нажата клавиша кнопка Yes - закрыть форму}

else

Action:= caNone; {кнопка No - игнорировать закрытие формы}

End; {конец процедуры}

C++Builder. В этом случае следует воспользоваться конструкцией

void _fastcall TForm1: FormClose (TObject *Sender,

TCIoseAction &Action)

{

switch (MessageBox (0, «Вы в самом деле хотите закончить работу?»,

«Предупреждение.»,

MB_YESNO | MB_ICONWARNING | MB_TOPMOST))

{

case IDYES: Action=caFree; // нажата кнопка Yes

break;

case IDNO: Action=caNone; // нажата кнопка No

break;

} // конец блока SWITCH

} // конец функции FormClose

 // допустимы также вызовы Delphi-подобных функций диалогов

 // для задания кнопок на форме используются битовые поля -

 // пример использования этих полей см. ниже

 // if (MessageDlg ('Bы в самом деле хотите закончить работу?»,

 // mtConfirmation,

 // TMsgDIgButtons() «mbYes «mbNo,

 // 9996) = IDYES)

 // и так далее

Функция MessageDlgPos, кроме прочих, содержит параметр, позволяющий указать положение формы на экране (MessageDlg всегда выводится в центре экрана).

Функция InputBox используется для вывода формы, содержащей строку ввода и две кнопки - Ok и Cancel. Функция возвращает либо введенную пользователем строку, либо описанную параметром ADefault строку.

Функция InputQuery возвращает введенную пользователем строку или строку ADefault при нажатии любой кнопки. Введенная пользователем строка возвращается в параметре Value, возвращаемое функцией значение есть TRUE при нажатии кнопки Ok или FALSE при нажатии Cancel или Esc.

4.1.6 Статическое и динамическое использование компонентов

Являющаяся компонентом форма может быть использована статически; в этом случае в DPR-файле присутствует строка типа

Application. CreateForm (TForm1, Form1);

говорящая о том, что форма Form1 автоматически создается в момент начала выполнения приложения (и обычно существует до окончания работы оного). В этом случае Form1 присутствует в левой части (Auto-Create Forms) окна Project Options (закладка Forms, полный доступ к окну суть Options|Project|Forms).

Однако форма может создаваться динамически в нужный момент и соответственно уничтожаться за ненадобностью; в некоторых случаях при этом удается добиться снижения общего объема требуемой для работы приложения памяти. Имя такой (динамической) формы должно быть занесено в правую часть (Available Forms) вышеуказанного окна Project Options, a сама форма должна в нужном месте создаваться компонентным методом (конструктором) Create, а уничтожаться с использованием деструктора Free (или Destroy).

Все сказанное относится к любому компоненту и объекту Delphi - ссылка на объект сначала должна появиться в описательной части (после ключевого слова var), а затем сам объект (со всеми дочерними компонентами, для которых он является контейнером) физически создается с помощью метода Create.

5. Часто используемые элементы Windows и их применение

Как было сказано, форма является также контейнером для обеспечивающих пользовательский интерфейс компонентов (Control'ов в терминологии WINDOWS-программистов). Именно с помощью этих компонентов пользователь осуществляет ввод данных, управление режимами выполнения программы и анализирует полученные результаты.

Компоненты выбираются разработчиком из расположенной в правой верхней части окна Delphi палитры компонентов (рис. 1,6) нажатием левой клавиши «мыши» и перетаскиваются в нужное место на форме; в дальнейшем уточняется их положение на форме и происходит настройка с помощью вызова Object Inspector'a для каждого конкретного компонента (нужный компонент выбирается 'мышью', признаком выбранного компонента служит рамочка из черных квадратиков вокруг компонента).

В дальнейшем рассмотрим наиболее часто используемые интерфейсные компоненты Delphi (названия их обычно соответствуют стандартной терминологии WINDOWS-интерфейса); весьма полное описание компонентов Delphi (приведены свойства, методы и сообщения) содержится в книге [8].

На рис. 6 приведена копия экрана дисплея в период проектирования приложения (DesignTime); показано окно ИС Delphi / C++Builder (в палитре компонентов выбрана страница Standard), форма Form1 с размещенными на ней компонентами.

Для уточнения расположения компонентов на форме следует выбрать нужный компонент (одинарным щелчком «мыши» в пределах компонента, выбранный компонент выделяется рамкой из черных квадратиков, см. второй сверху компонент во втором слева ряду компонентов на рис. 6) и перемещать его по форме, держа нажатой левую клавишу 'мыши'. Точное позиционирование можно проводить, используя сочетание клавиш Ctrl+стрелки для перемещения компонента как целое и Shift+стрелки для изменения размеров компонента.

Рис. 6. Форма с размещенными на ней компонентами Delphi

Удобно использовать правую кнопку «мыши» для выравнивания компонентов (вариант Scale во всплывающем меню, предварительно следует выбрать несколько компонентов для выравнивания их положения, включая компоненты в группу путем отметки их «мышью» при нажатой клавише Shift), изменения их размеров (вариант Size) и масштабирования размеров (вариант Scale).

Большинство компонентов (визуализируемые) имеют свойства Left, Top, Height, Width (абсцисса и ордината верхнего левого угла компонента относительно родительского компонента и высота и ширина компонента в пикселах соответственно), Hint и ShowHint (текст ярлычка помощи и разрешение на его демонстрацию), Name (имя компонента), Caption (заголовок компонента), Hide (скрывает компонент), булево свойство Visible (видимость компонента), Tag (любое Longint-число для идентификации компонента), TabOrder (определяющее последовательность передачи фокуса - с помощью клавиши Tab - в пределах формы числовое значение, компонент может получить фокус только при TabStop=TRUE), Handle (получить используемый функциями WINDOWS API идентификатор данного компонента) и другие; события OnClick, OnDbClick, OnMouseMove, методы ScaleBy (масштабирует размер компонента), Refresh, Repaint, Show и Update, что является следствие наследования, свойственным объектно-ориентированной структуре объектов Delphi / C++Builder.

Для интересующихся приведём схему наследования методов для объекта TBitBtn (кнопка c надписью и пиктограммой).

Наиболее абстрактные (общие) методы

TObject

Наиболее общие для всех объектов методы

TPresistant

Добавлена возможность записывать себя самого в EXE-файл (при компиляции) и переносить себя обратно из EXE-файла во время выполнения

TControl

Добавлены возможности взаимодействия с пользователем

TWinControl

Добавлены возможности использования механизма WINDOWS для создания окна

TButtonControl

Обеспечивает возможность функционирования кнопок

TButton

Обеспечивает реальные кнопки возможностями нажатия, изменения надписей и др.

TBitBtn

Обеспечивает отрисовку на кнопке пиктограммы и др.

Наиболее специфичные методы

5.1 Полезные невизуальные объекты Delphi / C++Builder

При работе в Delphi / C++Builder большую помощь оказывают полезные классы, служащие для упорядоченного хранения и доступа к данным (контейнер для хранения коллекции текстовых строк TStringList), а также часто применяемый объект выдержки времени (TTimer). Данные объекты являются невизуальными в том смысле, что не видны на экране дисплея во время RunTime (но могут быть представлены пиктограммами в DesignTime).

Желающих более подробно ознакомиться со стандартными компонентами Delphi / C++Builder отсылаем к книгам [8,11].

5.1.1 Класс TStringList

Класс (объект) TStringList служит для хранения и манипуляций с набором (коллекцией) текстовых строк и является потомком абстрактного класса TSrings. Нижеприведенный пример объявляет объект ListOfFamily типа TStringList

ListOfFamily: TStringList;

Динамическое создание объекта производится следующим образом

ListOfFamily:=TStringList. Create; {создать список ListOfFamily}

Очистка списка содержащихся в объекте строк производится с помощью метода Clear

ListOfFamily. Clear;

Добавление строк к списку выполняет метод Add

ListOfFamily. Add('Иванов');

ListOfFamily. Add('Петров');

ListOfFamily. Add('Сидоров');

ListOfFamily. Add('Рабинович');

C++Builder. Соответственно

TStringList *ListOfFamiIy=new TStringList(0); // создать объект -

 // список ListOfFamily

ListOfFamily->Clear(); // очистить список

ListOfFamily->Add («Иванов»); // добавить в список

LlstOfFamily->Add («Петров»);

LlstOTFamily*>Add («Сидоров»);

LlstOfFamily->Add («Рабинович»);

delete ListOfFamily; // уничтожить объект ListOfFamily

TStringList может содержать не только строки, но и более сложные сущности - например, метод AddObject (S:string, О:TObject) добавляет строку S в паре с объектом О.

Строку (и комбинацию 'строка+объект') можно добавить в произвольное место в списке, для этого служат методы Insert (Index:integer, S: string) и Insert0bject (lndex:integer, S:string, 0:TObject), вставляющие соответствующие сущности под индексом Index.

Метод AddStrings (Strings:TStrings) добавляет в конец данного набора другой набор Strings, метод IndexOf (S:string) возвращает номер в наборе строки S (если S не найдена, возвращается -1); соответствующие методы есть и для работы с объектами. Функция Equals (Strings:TString) сравнивает текущий список со списком Strings, возвращая TRUE в случае полного тождества объектов.

Свойство Count содержит число строк в объекте, к строкам и объектам имеется доступ через свойства Strings[Index] и Objects[Item], где Item - номер строки (объекта), Item изменяется от 0 до Count-1.

Метод Free разрушает объект типа TStringList

ListOfFamily. Free; {это в Delphi}

Для загрузки / сохранения из/в дисковом файле содержимого TStrings-List служат процедуры LoadFromFile (FileName:string) и SaveToFile (FileName:string); для более подробного ознакомления рекомендуется обратиться к книге [8].

5.1.2 Класс TTimer

Компонент TTimer (страница System палитры компонентов) служит для отсчета времени и уведомления программы о истечении заданного временного интервала.

Таймер начинает генерировать события OnTimer через интервалы времени (заданного свойством Interval в миллисекундах) после установки булева свойства Enabled в TRUE ('остановить' таймер можно также присвоением Value=0).

Задержать выполнение программы на mSecs миллисекунд можно также с помощью следующей процедуры:

procedure TForm1. Delay (mSecs: longint);

{ждет mSecs миллисекунд

это всё из кладезей народной мудрости

в области WINDOWS-программирования}

var

FirstTick: longint;

begin

FirstTick:= GetTickCount; {запомнить начало отсчета}

repeat

Application. ProcessMessages; {дать поработать другим

приложениям WINDOWS!}

until

GetTickCount - FirstTick >= mSecs; {интервал истек?}

end;

Настоятельно обращаю внимание на обязательность применения метода ProcessMessages - в противном случае другие приложения WINDOWS «повиснут» вследствие «захвата» всех ресурсов системы данным приложением (в WINDOWS'NT не столь критично).

5.2 Компонент TEdit

Компонент TEdit (верхний в первой слева колонке на рис. 6, в палитре компонентов находится на странице Standart) является однострочным текстовым редактором и служит для ввода пользователем произвольной строки (которая в дальнейшем может быть преобразована, например, в число); для вывода данных используется редко.

Введенный текст содержится в свойстве Text. Считывание информации из компонента TEdit для последующего использования производится согласно следующей схемы (считая, что имя TEdit-компонента есть Edit1)

var WorkString: string; {переменная типа Pascal-строки}

………………….

WorkString:=Edit1. Text;

Часть текста в окне редактирования может быть выделена - свойства SelStart и SelLength определяют начало и длину выделенной части (в количестве символов), сам выделенный текст содержится в строке SelText. Метод ClearSelection исключает из текста выделенный фрагмент, а метод SelectAll выделяет весь текст в редакторе. Свойство Font позволяет задать имя шрифта для символов.

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

Функции CopyToClipboard, CutToClipboard и PasteFromClipboard позволяют работать с системным буфером обмена (при выделении части текста работа происходит именно с ней, в противном случае в операции участвует весь текст). Свойство CharCase позволяет задавать преобразование вводимого текста к верхнему / нижнему регистрам, OEMConvert - осуществлять преобразование между OEM- и ANSI-кодировками, PasswordChar задает символ, используемый вместо введенных при вводе пароля.

Из событий компонента TEdit наиболее интересны OnChange (генерируется при любом изменении текста), OnEnter (возникает при нажатии клавиши Enter, удобно использовать для вызова процедуры верификации ввода) и OnClick (возбуждается при щелчке «мышью» на компоненте).

5.3 Компонент ТМеmо

Компонент TMemo (второй сверху компонент в крайнем левом столбе на рис. 6, в палитре компонентов находится на странице Standart) представляет собой многострочный текстовый редактор и служит обычно для вывода массива строк (например, столбец цифр) и включает многие свойства и сообщения компонента TEdit.

Содержимое объекта может быть представлено в виде набора строк Lines (Lines суть объект типа TStrings, содержащий текст в виде набора строк). Текст может выравниваться по левому, правому краям или по центру - свойство Alignment. При значении свойства WordWrap=TRUE при достижении вводимым текстом конца строки происходит переход на новую строку, в противном случае происходит горизонтальная прокрутка. Во время DesignTime можно заполнить компонент нужными строками - для этого следует использовать свойство Lines (ввод осуществляется в специальном открывающемся окне).

Добавление строк в TMemo возможно путем использования компонентной функции Add (работа с компонентом Memo1)

Memo1. Lines. Add ('Первый элемент');

Memo1. Lines. Аdd ('Второй элемент');

Memo1. Lines. Add ('Третий элемент');

……………………………

Memo1. Lines. Add (Edit1. Text); {добавить строку из Edit1}

Memo1. Lines. Add (Edit2. Text); {- - - - - - - - - Edit2}

Предварительно следует очистить Меmo1 путем использования метода Clear

Memo1. Clear;

Общее число строк, содержащихся в компоненте TMemo, доступно через свойство Count (счет начинается с 0)

var

NumberOfLines: Integer;

………………….

NumberOf Lines: =Memo1. Lines. Count;

Имеется возможность как сохранить, так и восстановить содержимое Memo1 в/из дискового файла

Memo1.LInes. SaveToFiIe ('c:\my_file.txt');

Memo1. Lines. LoadFromFile ('c:\my_file.txt');

С++Builder. Соответственно

Memo1->Lines->SaveToFile («c:\\my_file.txt»);

Memo1->Lines->LoadFromFile («c:\\my_file.txt»);

Генерируемые компонентом TMemo события практически тождественны таковым для TEdit.

5.4 Компонент TLabel

Компонент TLabel (третий сверху в левом столбце рис. 6, располагается на странице Standard палитры компонентов) представляет собой статический текст и служит для отображения информации (часто используется при отладке).

Сам текст содержится в свойстве Caption (Pascal-строка длиной до 255 символов), пример приведен ниже (предполагается имя компонента Label1)

Label1. Caption:='Вывод любой строки';

C++Builder. Соответственно

Label1->Сарtiоn= «Вывод любой строки»;

Свойство Alignment устанавливает правило выравнивания текста - по правому, левому краю или по центру клиентской области, булево свойство Autosize=TRUE автоматически «растягивает» размеры компонента в соответствие с размером текста и высотой шрифта, Wordwrap определяет возможность разрыва слов в случае превышения длиной выводимого текста ширину компонента.

Генерируемые компонентом события не вносят ничего нового по сравнению с вышеописанными.

5.5 Компонент TCheckBox

Компонент TCheckBox (4-й сверху в первом столбце на рис. 6, расположен на странице Standard палитры компонентов) является кнопкой с независимой фиксацией (флажком) и служит в качестве двоичного переключателя режимов в программе (переключается одинарным щелчком «мыши» на компоненте).

Состояние кнопки отражается в булевом свойстве Checked, причем Checked=TRUE соответствует нажатой кнопке и наоборот. Нижеследующий пример демонстрирует проверку нажатия кнопки и соответствующее разветвление программы

if CheckBox1. Checked then

begin

делать что-то при нажатой кнопке

end

else

begin

что-то сделать при ненажатой кнопке

end;

Данной свойство доступно и по записи - кнопку можно «нажать» программным путем, используя оператор

CheckBox1. Checked:=TRUE;

При установке свойства AllowGrayed в FALSE (умолчание) кнопка имеет два состояния и при каждом нажатии переходит из состояния «нажато» в «отжато» и обратно, при AlIowGrayed=TRUE кнопка имеет три состояния и при нажатиях движется по циклу - «нажато/отжато/неактивно» (соответствующие значения свойства State суть cbChecked, cbUnchecked и cbCrayed и также доступны для чтения).

Компонент генерирует события OnClick, OnEnter, OnExit и другие; но, к сожалению, список возможных событий не включает OnChange (пользователь должен анализировать состояние кнопки в обрабатывающей сообщение OnClick процедуре).

Кроме TCheckBox, имеется компонент TRadioButton (также расположенный на странице Standard палитры компонентов), представляющий собой кнопку с независимой фиксацией (радиокнопку); форма TCheckButton - круглая кнопка. Эти кнопки объединяются в группу TRadioGroup (см. ниже), причем только одна радиокнопка в группе может быть нажата в данный момент (при нажатии любой кнопки все другие в группе выключаются).

5.6 Компонент TListBox

Компонент TListBox (нижний в крайнем левом столбце на рис. 6, расположен на странице Standard палитры компонентов) и является списком с возможностью выбора.

Пользователь может выбрать одну из строк, хранящихся в свойстве Items (Items есть объект типа TStrings, содержащий текст в виде набора строк), индекс текущего (сфокусированного) элемента списка содержится в свойстве Itemlndex. При установке свойства MultiSelect в FALSE в списке не может быть выделено несколько элементов одновременно и значение свойства ExtendedSelect не играет роли. При MultiSelect=TRUE (может быть выделено несколько элементов одновременно) в случае ExtendedSelect=FALSE при каждом щелчке «мыши» изменяется выделение только сфокусированного элемента, в случае ExtendedSelect=TRUE выбор происходит при передвижении «мыши» с нажатой левой кнопкой на новом элементе списка при нажатых клавишах Ctrl или Shift или при нажатии Shift+стрелки.

Количество выделенных элементов содержится в свойстве SelCount, проверить и установить выделение для элемента с номером Index можно путем обращения к булеву свойству Selected[Index].

Сортировка строк в алфавитном порядке достигается установкой свойства Sorted в TRUE; к сожалению, не имеется свойства обеспечения уникальности строк.

Элементы списка могут располагаться не только в одном столбце, но и в нескольких - число столбцов задается свойством Columns. Подгонка высоты данного компонента с целью помещения целого числа элементов достигается установкой IntegralHeight=TRUE.

Вывод в ListBox1 квадратных корней первых 100 чисел может быть осуществлен следующей последовательностью операторов (при вычислении квадратного корня неявно производится преобразование 'integer float')

var

I: integer;

lnt, Float: string;

…………….

ListBox1. Clear; {очистить список}

for l:=1 to 100 do

begin

Str (l:4, lnt); {форматирование целого числа - 4 позиции на число} Str (Sqrt(l):15:5, Float); {форматирование вещественного числа -

всего 15 позиций, из них 5 -

для дробной части числа}

ListBox1.ltems. Add (lnt + ':' + Float);

end;

Число строк в ListBox можно получить, прочитав свойство Items. Count; ввести строки в ListBox во время DesignTime можно, щелкнув «мышью» по кнопке справа от строки Items в Инспекторе Объектов.

Генерируемые компонентом TListBox события включают OnClick, OnDbClick и другие; для разработчика представляет интерес событие OnDrawItem, возникающее при перерисовке каждого элемента (обычно процедура обработки этого события дополняет пиктограммами строки списка).

5.7 Компонент TComboBox

Компонент TComboBox (верхний в центральном столбце на рис. 6, расположен на странице Standard палитры компонентов) и является выпадающим списком с возможностью выбора и редактирования. Фактически TComboBox представляет собой выпадающий при нажатии «мышью» на кнопку со стрелкой вниз собственно список (подобно TListBox), дополненный полем ввода (подобно TEdit). С помощью компонента TComboBox пользователь может выбрать одно из имеющихся значений списка или ввести свое. Заменяя TListBox, компонент TComboBox имеет больше возможностей и требует значительно меньше пространства на форме для размещения.

Как и для TListBox, доступ к элементам списка достигается через свойство Items (Items есть объект типа TStrings, содержащий текст в виде набора строк), далее см. все описания для TListBox.

Содержащийся в редактируемом элементе текст доступен через свойство Text, также доступны свойства SelText, SelStart, SelLength и SelectAll (см. описание компонента TEdit).

Значение булева свойства DroppedDown (только для RunTime) соответствует состоянию списка, максимальное число показывающихся при выпадении списка элементов задается свойством DropDownCount (по умолчанию 8).

При изменении текста в окне редактирования возникает событие OnChange, при изменении состояния списка (выпавший / скрытый) возникает событие OnDropDown; также генерируются события OnCIick и OnDbClick и др.

5.8 Компонент TRadioGroup

Компонент TRadioGroup представляет собой группу радиокнопок с зависимой фиксацией (компонентов TRadioButton), в палитре компонентов находится на странице Standard.

Во время проектирования (DesignTime) с помощью Инспектора Объектов в свойстве Items следует задать текст описания для каждой из кнопок (на рис. 6 тексты суть RadioButton1, RadioButton2RadioButton4), число строк текста и определит число радиокнопок.

Кнопки могут располагаться в несколько столбцов (свойство Columns), индекс нажатой кнопки определяется свойством ItemIndex (начиная с 0, при Itemlndex=-l ни одна из кнопок не нажата), набор строк с заголовками радиокнопок содержится в свойстве Items (объекты типа TSrings). Список сообщений компонента TRadioGroup довольно беден и не приводится; интерес представляет собой сообщение OnCIick (щелчок «мышью» в пределах компонента).

Пример связанной с событием OnCIick процедуры обработки состояния второй из показанных на рис. 6 кнопки приведен ниже

procedure TForm1. RadioGroup1Click (Sender: TObject);

begin

if RadioGroup1. Itemlndex = 1 then (вторая в группе кнопка включена)

begin

MessageBeep (MB_OK); {подать звук}

RadioGroup1.ltems[1]:='Ой! Меня нажали!'; {надпись на кнопке}

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

end;

end; {Баканов В.М., МГАПИ, кафедра ИТ-4, 1996-2000}

5.9 Компонент TPanel

Компонент TPanel является несущей конструкцией для размещения на ней других элементов управления, являясь в этом случае родителем для размещенных на ней компонентов. Настоятельно рекомендуется использовать компонент TPanel для размещения компонентов при создании пользовательского интерфейса!

Внешнее оформление панели определяется свойствами BevelInner, BevelOuter (возможные значения bvNone, bvLovered и bvRaised), BevelWidth, BorderWidth, BevelInner и BevelOuter представляют собой (внутреннюю и внешнюю) окаймляющие панель рамки, имитирующие «приподнятость» (bvRaised) или «утопленность» (bvLovered) шириной BevelWidth. Иллюзия трехмерности также создается изменением свойства BorderStyle.

Свойство Alignment определяет горизонтальное выравнивание содержащегося в свойстве Caption текста заголовка панели.

Список генерируемых событий включает OnClick, OnDbClick и др., событие OnResize возникает при изменении размеров панели.

5.10 Компонент TBitBtn

Компонент TBitBtn представляет собой кнопку с пиктограммой и текстом (на рис. 6 данный компонент является 4-м сверху в среднем ряду, в палитре компонентов расположен на странице Additional). В отличие от родственных компонентов TButton и SpeedButton данный компонент имеет ряд дополнительных удобств в использовании.

В Delphi определены стандартные типы кнопок, определяемые свойством Kind; для каждой из них определены передаваемый форме результат, название и картинки. Достаточно установить нужное значение Kind, и кнопка приобретет нужный вид. Например, в случае Kind=bkHelp нажатие кнопки инициализирует систему помощи, bkClose-кнопка закрывает форму.

При Kind=bkCustom параметры кнопки определяются пользователем. Стиль кнопок задается свойством Style, текст на кнопке - свойством Caption, располагаемая на теле кнопки пиктограмма - Glyph, промежуток между пиктограммой и текстом - Spacing и т.д. Присвоение свойству Enabled значения FALSERunTime также) дезактивирует кнопку (устанавливает ее в неактивное «серое» состояния); эта возможность удобна, например, при необходимости деактивировать некоторые кнопки, не задействованные в данном режиме работы программы.

Из событий наиболее часто используется OnClick, также генерируются OnKeyDown, OnKeyPress, OnKeyUp и др.

Из компонентных методов представляют интерес Click (программная иммитация нажатия кнопки).

Процедура, например, «отключающая» кнопку BitBtn1 после нажатия кнопки BitBtn2, может выглядеть следующим образом

procedure TForm1. BitBtn2Click (Sender: TObject);

begin

with BitBtn1 do

begin

Сарtion:='Прощай навсегда'; {текст на кнопке}

Enabled:=FALSE; {деактивировать кнопку}

end;

end; {Баканов В.М., МГАПИ, кафедра ИТ - 4,1996-2000}

Вновь активировать эту кнопку можно только присваиванием BitBtn1. Enabled:=TRUE.

Специальная кнопка (компонент TSpeedButton) может иметь как зависимую, так и независимую фиксацию (при значении свойства Grouplndex=0 кнопка не имеет фиксации в нажатом состоянии и она не зависит от остальных кнопок, кнопки же с одинаковым ненулевым значением свойства GroupIndex имеют зависимую в пределах одного родительского элемента фиксацию).

Поведение этих кнопок зависит также от булева свойства AllowAllUp (при AllowAllUp=FALSE нажатую кнопку в группе можно отпустить лишь путем нажатия другой, в противном случае кнопку можно отпустить путем повторного нажатия). Для возможности фиксации выбранной кнопки ей необходимо присвоить уникальный групповой индекс (в свойстве Grouplndex) и установить AllowAlIUp=TRUE.

Компонент TSpinButton представляет собой две кнопки со стрелками вверх / вниз и служит для управления некоей внешней величиной (путем обработки событий OnUpСlick и OnDownClick - нажатие кнопок вверх / вниз соответственно).

Программа имеет возможность проверить нажатие кнопки, прочитав свойство Down.

5.11 Компонент ТМеdiaРlауег

Компонент TMediaPlayer служит для управления мультимедийными устройствами (расположен в нижней части центрального столбца на рис. 6, в палитре компонентов находится на странице System) и представляет с точки зрения пользователя набор кнопок для (интерактивного) управления устройством путем посылки команд MCI - Media Control Interface [3]. Программист имеет возможность модифицировать реакцию на нажатия кнопок (часть или все кнопки могут быть сделана невидимыми) и другие события в зависимости от специфики задачи.

Тип мультимедийного устройства определяется свойством DeviceType (для автоматического распознавания типа следует выбрать dtAutoSelect), набор возможностей устройства определяется свойством Capabilities.

Булево свойство VisibleButtons управляет видимостью отдельных кнопок линейки управления мультимедийным устройством, свойство Display указывает на окно, в котором будет происходить отображение видеоинформации (в случае Display=NIL создается собственное окно), DisplayRect задает прямоугольную область экрана для изображения.

Управление мультимедиа-устройством не обязательно должно происходить путем нажатия кнопок на линейке управления, линейка может быть скрыта (свойство Visible=FALSE), а управление осуществляться программой с использованием компонентных функций Start, Stop, Pause, Rewind и др. (названия методов совпадают с именами соответствующих кнопок управляющей линейки).


Подобные документы

  • Разработка 32-разрядных приложений Windows с помощью системы виртуального объектно-ориентированного программирования Delphi. Работа с коммуникационными портами. Виртуальное проектирование Windows. Назначение контактов COM порта (разъём DB-9S.).

    реферат [32,7 K], добавлен 28.08.2009

  • Основы работы с многооконным графическим пользовательским интерфейсом операционной системы Windows95/NT. Основы работы с прикладными программами Windows и DOS. Разработка простого приложения для Windows при помощи средства разработки приложений DELPHI.

    контрольная работа [281,0 K], добавлен 15.01.2009

  • Delphi как среда разработки программ, ориентированных на работу в Windows. Назначение и преимущество использования электронных учебников. Описание возможностей среды Delphi 5 для разработки электронного учебника. Варианты применения служб Internet.

    дипломная работа [3,6 M], добавлен 13.07.2011

  • Изучение учебника и справочной подсистемы Windows 95/NT, получение навыков работы с "мышью", манипулирование окнами и значками программ и документов, запуска программ в системе Windows 95/NT. Разработка простого приложения для Windows при помощи Delphi.

    контрольная работа [1,1 M], добавлен 15.01.2009

  • Основные приемы работы в среде программирования Delphi. Особенности технологии создания простейших приложений. Работа с компонентами среды разработки приложений. Ввод, редактирование, выбор и вывод информации. Аспекты использования структуры ветвления.

    методичка [619,9 K], добавлен 17.11.2011

  • Теоретические основы написания Windows-приложений с использованием библиотеки MFC. Основы программирования под Windows. Проектирование приложений в среде Microsoft Visual C++. Описание логической структуры приложения, его функциональное назначение.

    курсовая работа [1,3 M], добавлен 12.12.2011

  • Проектирование, кодирование и отладка службы Windows: "Контроль приложений", осуществляющей контроль набора приложений и управление ими; разработка приложения, управляющего этой службой. Взаимодействие службы и приложения; тестирование и сопровождение.

    курсовая работа [1,1 M], добавлен 22.05.2013

  • Использование языка программирования Delphi для записи программ, представляющих собой последовательность инструкций. Классы и директивы в объектно-ориентированном программировании. Разработка демонстрационной программы. Процесс настройки Windows XP.

    дипломная работа [917,4 K], добавлен 15.01.2014

  • История создания. Windows 9x/NT. Операционная система Microsoft Windows. Преимущества и недостатки Windows. Некоторые клавиатурные комбинации Windows 9x и NT. Windows XP Professional. Наиболее совершенная защита.

    реферат [19,3 K], добавлен 18.07.2004

  • Общая характеристика операционных систем и приложений Windows. Разделение ресурсов, работа с окнами, назначение диска, видов памяти, системы сохранения и передачи данных. История возникновения приложений, их виды и особенности, порядок написания.

    курс лекций [321,0 K], добавлен 24.06.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.