Модель решения задачи в Turbo Delphi 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Модель решения задачи в Turbo Delphi



ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

РЯЗАНСКИЙ ГОСУДАРСТВЕННЫЙ РАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

 

В.В. КАРАСЕВ

 

ОСНОВЫ ПРОГРАММИРОВАНИЯ

в среде TURBO DELPHI

Учебное пособие

 


 

Рязань 2010

УДК 681.3.068

Основы программирования в среде Turbo Delphi: учеб. пособие/ В.В. Карасев; Рязан. гос. радиотехн.ун-т. Рязань, 2010. 64 с.

 

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

Предназначено для изучения дисциплины «Информатика» студентами

заочной и очной форм обучения по направлению 230200 «Информационные системы».

Табл.: 3. Ил.: 45. Библиогр.: 6 назв.

 

Визуальные компоненты, инспектор объектов, метод, модуль, свойство событие, форма

 

Печатается по решению редакционно-издательского совета Рязанского государственного радиотехнического университета.

 

Рецензент: кафедра АСУ РГРТУ (зав. кафедрой д-р. техн. наук, проф. Г.И. Нечаев)

 

К а р а с е в Виктор Владимирович

Основы программирования в среде Turbo Delphi

 

Редактор М.Е. Цветкова

Корректор С.В. Макушина

 

Подписано в печать Формат бумаги 60 х 84 1/16.

Бумага газетная. Печать трафаретная. Усл.печ.л. 4,0.

Тираж 25 экз. Заказ

Рязанский государственный радиотехнический университет.

390005, Рязань, Гагарина, 59/1.

Редакционно-издательский центр РГРТУ.

 

© Рязанский государственный

радиотехнический университет, 2010

Введение

Учебное пособие посвящено изложению основ программирования в среде Turbo Delphi Explorer. Данный пакет предназначен для обучения программированию и предоставляется фирмой Borland бесплатно (www.turboexplorer.com). Кратко осветим историю появления пакета. Первая версия Delphi была выпущена в 1995 г. [1] и была ориентирована на разработку приложений Windows. Затем практически ежегодно создавались новые версии. В 2001 г. вышла версия Delphi 6.0, в 2002 – Delphi 7.0, в 2003 – Delphi 8.0. Последняя кардинально изменила внешний облик среды разработки и предполагала создание только приложений.NET (читается “дот нет”). Разработки, не связанные с технологией.NET, средой не поддерживались. Delphi 2005 устранила этот недостаток для тех, кто привык к прежним возможностям среды. Она позволяет не только создавать традиционные приложения Windows на базе популярной библиотеки визуальных компонентов, но и переводить их на платформу.NET, а также создавать на ее основе новые проекты. В среде стало возможным программирование еще на одном языке – C# (“си шарп”). Язык был создан специально для.NET. Ну, а первым языком остался Object Pascal, развившийся в язык Delphi. На этом новом языке можно создавать программы и для Windows, и для.NET. В Delphi 2006 к названным языкам добавился C++, который позволяет создавать только приложения Windows. В результате программистам была предложена интегрированная среда Borland Developer Studio (BDS). В ней можно создавать три группы программ: VCL Win32 (традиционные приложения для Windows), приложения VCL.NET и приложения Windows Forms для.NET. Turbo Delphi – это среда разработки приложений для Windows, извлеченная из BDS. Что же касается технологии.NET, то она представляет собой надстройку над существующими операционными системами и языками программирования и предназначена для разработки приложений, независимых на уровне исполняемых файлов от операционной системы и языка программирования.

Файлы проекта

Проект TD состоит из форм, модулей, установок параметров проекта, ресурсов и т.д. Вся эта информация представлена в файлах, многие из которых создаются средой автоматически при построении приложения. Если проект был сохранен в соответствующей папке под именем Project1, то файл Project1.dpr является головным файлом программы. Обычно он содержит операторы инициализации, создания основной формы, запуска программы на выполнение и представляется следующим образом.

program Project1;

 

uses

Forms,

Unit1 in 'Unit1.pas' {Form1};

 

{$R *.res}

 

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

Имя программы в заголовке совпадает с именем файла, в котором сохранен проект. После слова uses перечисляются модули, загружаемые программой (в примере – системный модуль Forms и модуль Unit1 формы, имя которой дано в комментарии). Затем следует директива компилятора – {$R *.res}. Она связывает с выполняемым модулем файлы ресурсов проекта (пиктограммы, битовые матрицы). Текст программы создается средой автоматически, и его не рекомендуется изменять. Основные действия сосредоточены в подключаемых модулях.

В папке проекта размещены также текстовый файл Project1.bdsproj, который содержит служебную информацию о проекте; файл Project1.cfg, хранящий установки проекта, в том числе используемые директивы компилятора; бинарный файл Project1.res ресурсов проекта; текстовые файлы Unit1.pas модуля и Unit1.dfm соответствующей ему формы; исполняемый файл Project.exe; откомпилированный файл Unit1.dcu модуля и некоторые другие файлы.

 

Типы данных в Delphi

Язык Delphi базируется на известных по языку Turbo Pascal простых типах данных: целых, вещественных, символьных и логических. Однако в нем появились новые имена типов, а некоторые типы получили другие диапазоны допустимых значений. Характеристики типов даны далее.

Таблица целых типов

Тип VCL Win32 Диапазон значений Память, байт
Byte 0…255  
Word 0…65535  
Longword 0…4294967295  
Cardinal 0…4294967295  
Shortint -128…127  
Smallint -32768…32767  
Integer -2147483648… 2147483647  
Longint -2147483648…2147483647  
Int64 -263…263-1  

 

Для целых типов наивысшую производительность обеспечивают Integer и Cardinal, для вещественных типов, представленных в следующей таблице, – тип Real, эквивалентный в этой версии языка типу Double. Наименьшее по абсолютной величине и наибольшее значения для типов Single, Double, Extended и Comp можно узнать с помощью констант модуля Math, имя которых начинается с Min или Max соответственно и продолжается именем типа, например MaxDouble – наибольшее значение в Double.

Таблица вещественных типов

Тип VCL Win32 Диапазон значений Память, байт
Single 1.5·10-45…3.4·1038  
Real48 2.9 ·10-39…1.7·1038  
Real 5.0 ·10-324…1.7·10308  
Double 5.0 ·10-324…1.7·10308  
Extended 3.4 ·10-4932…1.1·104932  
Comp -263+1…263-1  
Currency -922337203685477.5808… 922337203685477.5807  

 

Для работы с логическими переменными предпочтительнее использовать тип Boolean. Символьные данные описывают с помощью родового типа Char. Можно также использовать типы AnsiChar и WideChar. Первый из них описывает символы, представленные в кодировке ANSI (Американский национальный институт стандартов), и требует одного байта для хранения символа; второй – в кодировке Unicode и требует двух байтов памяти. Тип Char является универсальным и позволяет перемещать код между различными видами приложений.

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

Тип строки Максимальная длина Память #0 в конце строки
ShortString   ≤ 256 байт Нет
AnsiString ~ 2 Гб ≤ 2 Гб Есть
String ~ 2 Гб ≤ 2 Гб Есть или нет
WideString ~ 1 Гб ≤ 2 Гб Есть

 

Родовым для Delphi является тип String, но он имеет разный смысл в зависимости от типа приложения и директивы компилятора $H [1]. В приложениях VCL Win32 String по умолчанию интерпретируется компилятором как AnsiString – длинная строка с завершающим нулем (#0), а с директивой {$H-} – как тип ShortString (короткая строка без #0 на конце). Если при объявлении типа после слова String следует размер строки, например String[25], то, независимо от директивы компилятора, тип трактуется как строка с числом символов не более заданного (т.е. 25) и без #0 в конце. Короткую строку используют для обратной совместимости, а основными становятся строки с завершающим нулем. Переменная типа AnsiString является указателем на область в куче (Heap), где хранится строка. Там же хранятся длина строки и число ссылок на строку. Строки типа WideString состоят из символов Unicode. Этот тип совместим с типом BSTR, используемым для действий с объектами COM. К названным строкам применимы стандартные подпрограммы, имена которых и оказываемые действия известны из Turbo Pascal. Длина строки AnsiString в операциях присваивания отслеживается автоматически (символ #0 в длину не входит). Длину коротких и длинных строк можно изменять процедурой SetLength (stroka, NewDlina).

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

 

Палитра базовых компонентов

Палитра компонентов состоит из нескольких вкладок. Кратко охарактеризуем их. На вкладке Standard находятся компоненты, которые являются аналогами компонентов Windows. Вкладка Additional содержит дополнительные стандартные компоненты. Компоненты Win32 – компоненты, которые есть только в семействе ОС Win32. Вкладка System предоставляет системные компоненты, с помощью которых облегчается доступ к системе. Компоненты доступа к базам данных представлены на вкладке Data Access. На вкладке Data Controls размещены компоненты для работы с базами данных. dbExpress – компоненты доступа к базам данных, которые пришли на смену BDE (старые компоненты доступа к базам данных). WebServices и Internet – компоненты доступа к сети Интернет. Dialogs – компоненты, облегчающие доступ к стандартным диалогам.

Рассмотрим более подробно базовые компоненты, находящиеся на вкладках Standard, Additional, Win32, System, Dialogs.

 

7.1. Надпись (TLabel)

Мы уже поверхностно знакомы с компонентом, позволяющим создавать надписи на формах (на других компонентах с его помощью можно создавать надписи, но это используется редко, т.к. у них имеется свойство Caption). Скажем о других полезных свойствах TLabel. Ниже показан рисунок с надписью, имеющей тень. Такой эффект можно получить, если скопировать текст, изменить его цвет (на красный) и сместить копию на 2-3 пиксела вверх (свойство Top) и влево (Left), но свойство Transparent (прозрачность фона) у копии компонента следует задать равным true. Другое свойство – WordWrop будет определять автоматический перенос слов текста, не умещающихся в текущей строке, на следующую строку, если оно равно true, и еще одно свойство – AutoSize = false (признак того, что размер поля под надпись определяется ее содержимым). Свойство Visible, принимающее значение либо true, либо false, позволяет делать надпись соответственно видимой и невидимой. А другое логическое свойство – ParentFont определяет, наследует ли компонент характеристики шрифта формы, на которой он расположен.

 

7.2. Многострочное поле ввода (ТМето)

 
 

В простом приложении нами использовался компонент TEdit, позволяющий вводить и выводить одну строку текста. Компонент TMemo принадлежит вкладке Standard и позволяет выводить и редактировать многострочный текст. Свойство Text компонента – это текст в окне, рассматриваемый как одно целое. Свойство Lines – массив строк текста, пронумерованных от нуля. Оно само является объектом и относится к классу (типу) TStrings. На этапе конструирования в окно можно занести нужный текст (по умолчанию в качестве текста выводится “Memo1”). Для этого находят в инспекторе свойство Lines и делают двойной щелчок по (TStrings). Вызывается окно редактора строк текста. Выполнив редактирование, нажимают Ok. Количество строк в тексте хранит свойство Memo1.Lines. Count. Организуем на основе представленных свойств обработку текста в приложении со следующей формой.

Ниже приведен обработчик клика по кнопке Button1 “Обработать”.

procedure TForm1.Button1Click(Sender: TObject);

var

i, j: integer;

probelov, n: integer; // Количество пробелов в тексте и в строке

 

begin

probelov:= 0;

for i:= 0 to Memo1.Lines.Count - 1 do begin // Цикл по строкам

n:= 0;

if Memo1.Lines[i]<>'' then begin // Если строка не пуста

n:= 1;

for j:= 1 to Length(Memo1.Lines[i]) do // Обработка i-й строки

if Memo1.Lines[i][j] = ' ' then inc(n); //.Lines[i, j] дает ошибку

end;

probelov:= probelov + n;

end;

Edit1.Text:= IntToStr(probelov);

end;

 

Объект Lines имеет методы SaveToFile (<Текстовый файл>) и LoadFromFile (<Текстовый файл>). Первый из них записывает текст объекта TMemo в файл (если файл существовал, то его содержимое заменяется текстом, а если файла не было, то он создается с указанным именем), а второй производит чтение содержимого текстового файла и выводит его в TMemo. Покажем пример действий с этими методами. Пусть одновременно с отображением окна происходит загрузка текста из файла memo.txt. Если указанный файл отсутствует, то функция FileExists (<Имя файла>) возвращает false и выводится соответствующее сообщение, а поле текста останется пустым. Форма обладает событием, связанным с открытием окна при запуске приложения – OnShow. Обработчик события имеет вид:

procedure TForm1.FormShow(Sender: TObject);

begin

if FileExists('memo.txt') then

Form1.Memo1.Lines.LoadFromFile('memo.txt')

else begin

ShowMessage('Файл с текстом отсутствует');

Memo1.Text:= ''

end;

end;

Приведенный обработчик (процедура TForm1.FormShow) создается после двойного щелчка в колонке справа от события OnShow на вкладке Events для формы Form1. При закрытии формы в случае изменения текста (свойство Memo1.Modified = true) выполняют сохранение с помощью обработчика события FormClose:

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if Form1.Memo1.Modified then

Form1.Memo1.Lines.SaveToFile('memo.txt');

end;

 

Объект Lines обладает и другими полезными свойствами, например возможностью обрабатывать (удалять, вставлять, перемещать и др.) строку, указанную мышью. Указание распознается с помощью другого объекта типа TPointCaretPos. У TPoint есть два свойства х и y: х указывает на текущую колонку, a y – на текущую строку. Таким образом, с помощью Memo1.CaretPos.y можно узнать текущую строку. Воспользуемся этим обстоятельством для создания обработчиков соответственно изменения и удаления содержимого указанной строки. В примере дается альтернативный способ обращения к строкам текста (через свойство Strings). Изменение выбранной строки сопровождается выводом сообщения об этом в верхней строке текста (с номером 0).

 

procedure TForm1.IzmenenieClick(Sender: TObject);

begin //Изменяет строку, указанную мышью, и выводит сообщение об этом

Memo1.Lines.Strings[Memo1.CaretPos.Y]:='Измененный текст здесь';

Memo1.Lines.Strings[0]:='Текст изменен!';

end;

 

procedure TForm1.UdalenieClick(Sender: TObject);

begin //Удаляет указанную мышью строку

if Memo1.Lines.Count<>0 then

Memo1.Lines.Delete(Memo1.CaretPos.Y);

end;

 

7.3. Флажок (TCheckBox)

Компонент TCheckBox вкладки Standard представляет собой переключатель (флажок). Он может находиться в одном из двух состояний: установлен (выбран) или сброшен (не установлен). Справа от флажка выводится поясняющий текст, представленный свойством Caption. Состояние флажка (выбран/сброшен) определяется по свойству Checked. Если флажок установлен, то Checked = true, если “галочки” нет, то свойство равно false.

 
 

Ниже приведено окно программы, которая позволяет удалять из текста слова-паразиты, а также пробелы между словами и затем устанавливать, является ли строка перевертышем (палиндромом). Для решения такой задачи на форме размещены два флажка типа TCheckBox. Они определяют характер обработки исходного текста с помощью процедуры.

 

procedure TForm1.Button1Click(Sender: TObject);

var

s, ps: string[70];

i, n, p: integer;

begin

s:= Edit1.Text;

n:= length('как бы');

if CheckBox1.Checked then repeat //Удаление всех 'как бы' из s

p:= pos('как бы', s);

delete(s, p, n)

until p = 0;

if CheckBox2.Checked then

repeat

p:= pos(' ', s); //Позиция пробела в строке s

delete(s, p, 1)

until p = 0;

Label3.Caption:= s;

n:= length(s);

ps[0]:= chr(n); // Задаем размер перевернутой строки ps

for i:= 1 to n do // Производим переворот строки s в строку ps

ps[i]:= s[n-i+1];

if ps = s then Edit2.Text:= 'Эта строка – палиндром'

else Edit2.Text:= 'Эта строка – не палиндром';

end;

7.4. Панель (TPanel)

 
 

Компонент TPanel вкладки Standard представляет собой панель для размещения других компонентов. Свойство Align определяет границу формы, к которой привязана панель. Если свойство принимает значение alLeft, то панель будет прикреплена к левой границе; если alRight – то к правой, alTop – к верхней и alBottom – к нижней. Свойство Enabled позволяет делать компоненты, расположенные на панели, либо доступными (свойство имеет значение true), либо нет (false). Внешний вид панели зависит от свойств BevelInner (внутренняя кромка) и BevelOuter (внешняя кромка): bvNone – панель на одном уровне с поверхностью формы; bvLowered – панель утоплена; bvRaised – панель выступает (визуальные эффекты, вызванные способом прорисовки). Свойство BevelWidth задает ширину кромки в пикселах (на рисунке – по умолчанию 1 пиксел), а свойство BorderWidth – расстояние между кромками (по умолчанию – 0).

7.5. Переключатель (TRadioButton)

Этот компонент находится на вкладке Standard и обладает свойством Checked, таким же, как и у компонента TCheckBox. Но, в отличие от последнего, состояние переключателя TRadioButton зависит от состояния других однотипных с ним элементов на форме, т.е. в группе переключателей только один может быть выбран. При необходимости реализации сложного выбора можно сгруппировать переключатели на отдельных панелях, как показано на рисунке справа. Но библиотека располагает для этих целей специальным компонентом – TRadioGroup, о котором будет сказано ниже.

 

7.6. Группа компонентов TRadioButton (TRadioGroup)

Разместим на форме названный компонент, взяв его с вкладки Standard. Найдем для него на вкладке Properties свойство Items, отвечающее за возможные варианты выбора, и произведем двойной щелчок справа от (TStrings). Заполним в редакторе строк названия вариантов вычисления логарифма заданного числа: десятичного, натурального и по основанию 2. За нумерацию вариантов (от нуля) отвечает свойство ItemIndex. Надпись к группе кнопок появляется только после запуска приложения, благодаря обработчику события OnShow, связанного с визуализацией формы. Ниже приведен код для соответствующих действий.

 

procedure TForm1.Button1Click(Sender: TObject);

var {Обработчик клика по кнопке “Вычислить”}

x: real;

begin

if Edit1.Text = '' then ShowMessage('Нет Числа')

else begin

x:= StrToFloat(Edit1.Text);

case RadioGroup1.ItemIndex of

0: Edit2.Text:= 'log() = ' + FloatToStr(ln(x)/ln(10));

1: Edit2.Text:= 'ln() = ' + FloatToStr(ln(x));

2: Edit2.Text:= 'log2() = ' + FloatToStr(ln(x)/ln(2))

end;

end;

end;

 

procedure TForm1.FormShow(Sender: TObject);

begin {Вывод надписи на форме при ее визуализации}

Label2.Caption:= 'Выбор вида'#13#10 + 'логарифма'

end;

 

7.7. Список выбора (TListBox)

Этот компонент вкладки Standard предназначен для выбора одного или нескольких элементов списка. Элементы списка представлены свойством Items, а за их нумерацию (от нуля) отвечает свойство ItemIndex. С помощью ListBox.Items.Strings можно получить доступ ко всем строкам списка. Если необходимо выбирать несколько строк списка, то следует свойству MultiSelect (на вкладке Properties) задать значение true. Для множественного выбора (на рисунке показан выбор вариантов ответа на вопрос теста) производят щелчок при нажатой клавише <Ctrl>. Ниже приведена процедура обработки клика по кнопке “Ответ”. В ней свойство ListBox1. Selected – массив логических значений, определяющих выбранность (true) соответствующих элементов списка.

procedure TForm1.Button1Click(Sender: TObject);

begin

if ListBox1.Selected[0] or ListBox1.Selected[2] then

Edit1.Text:= 'Правильно'

else Edit1.Text:= 'Ошибка'

 

end;

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

 

7.8. Ниспадающие списки (TComboBox)

Этот компонент вкладки Standard является комбинацией поля редактирования и раскрывающегося списка выбора. Это делает возможным вводить данные как с клавиатуры, так и из имеющегося списка, который раскрывается стандартным для Windows способом. Выбрать из списка можно только один элемент. Формировать список можно в редакторе, как это делалось по отношению к аналогичным компонентам типа TStrings, а также программно – с помощью метода Items.Add. Внешний вид компонента определяет свойство Style: его значению csDropDown соответствует комбинация поля ввода и списка выбора; csDropDownList – только список; csSimple – только поле ввода. Свойство DropDownCount определяет количество элементов в раскрываемом списке: если их число превышает значение данного свойства, то к списку автоматически добавляется полоса прокрутки. Покажем на примере списка из трех элементов некоторые действия с элементами. Левый рисунок демонстрирует исходный список, а правый рисунок – измененный список после выделения “Вариант2”, клика по “Удалить” и добавления элемента “Новый Вариант3” по клику “Добавить” (эту кнопку закрывает список). Обработчики событий представлены ниже.

procedure TForm1.Button1Click(Sender: TObject);

begin //Обработчик клика по кнопке “Добавить”

ComboBox1.Items.Add('Новый Вариант'

+ IntToStr(ComboBox1.Items.Count+1));

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin //Обработчик клика по кнопке “Удалить”

ComboBox1.Items.Delete(ComboBox1.ItemIndex);

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin // При создании окна формируется список элементов

ComboBox1.Style:= csDropDownList; // Стиль – только список

ComboBox1.Items.Add('Вариант1');

ComboBox1.Items.Add('Вариант2');

ComboBox1.Items.Add('Вариант3');

end;

 

Если список элементов должен быть отсортирован в алфавитном порядке, следует задать значение true свойству Sorted.

 

7.9. Полосы прокрутки (TScrollBar)

С помощью этих компонентов панели Standard удобно перемещаться внутри длинных списков, изображений и т.п. За текущее положение ползунка компонента отвечает свойство Position, пределы изменения которого задают свойства Min и Max. Свойство Kind определяет, в каком направлении ориентирован компонент: в горизонтальном (константа sbHorizontal) или в вертикальном (sbVertical). Покажем на простом примере, как работает компонент. Разместим на форме надпись и полосу прокрутки (верхний рисунок), а затем создадим обработчик события OnChange, вызываемого перемещением ползунка. Код обработчика превращает надпись в число, равное позиции ползунка (нижний рисунок).

procedure TForm1.ScrollBar1Change(Sender: TObject);

begin

ScrollBar1.Kind:= sbVertical; // Вертикальная ориентация полосы

ScrollBar1.Min:=10; // По умолчанию Min = 0

ScrollBar1.Max:=200; // По умолчанию Max = 100

Label1.Caption:= IntToStr(ScrollBar1.Position);

end;

 

7.10. Группировка объектов (TGroupBox)

Компонент TGroupBox панели Standard предназначен для группировки логически связанных различных компонентов и представляет собой панель с заголовком наверху. Каких-либо особенных свойств данный компонент не имеет. Ниже приведен пример с использованием компонента.

 
 

7.11. Список действий (TActionList)

Этот компонент вкладки Standard позволяет создавать список действий, каждое из которых может быть назначено какой-либо кнопке или пункту меню. Откроем форму нового приложения и разместим на ней названный компонент. Двойным щелчком по нему вызовем редактор действий (рисунок справа). Инструменты редак-тора позволяют создавать, удалять и пере-мещать действия в списке. Создадим новое действие. Для этого можно нажать соответствующую кнопку на панели задач или просто нажать клавишу <Ins>. Для выделенного действия (оно пока одно) обнаруживаем на вкладке свойств инспектора объектов следующие свойства:

· AutoCheck – если это свойство равно true, то свойство Checked будет автоматически переключаться при выполнении действия;

· Caption – заголовок действия. Этот заголовок будет копироваться в свойство Caption всем компонентам, которым будет назначено данное действие;

· Category – категория. Здесь можно выбрать уже существующую или напечатать новое имя для создания новой категории;

· Enabled – доступно ли действие;

· GroupIndex – индекс группы. Если у двух действий указан один и тот же индекс группы, т. е. они сгруппированы в одну группу, то при выделении одного действия (свойства Checked устанавливаются true) другие действия этой группы сбрасываются (свойства Checked устанавливаются false);

· ImageIndex – индекс иконки. У самого компонента ActionList есть свойство Images, которому можно указать список иконок (компонент ImagesList). Если назначить действию картинку из этого списка, т. е. указать индекс картинки, то она будет появляться на панелях и в меню, поддерживающих картинки;

· SecondaryShortCut – вторичное сочетание клавиш быстрого вызова;

· ShortCut – первичное сочетание клавиш быстрого вызова.

Назовем, например, действие “Выход”, а на вкладке Events создадим обработчик события OnExecute (после двойного клика справа от события) и напишем в нем всего одну строку – вызов метода Close () (закрытие окна программы). Затем в свойстве ShortCut напишем Esc и тем самым сделаем клавишу <Esc> горячей клавишей закрытия окна. После выполненных действий можно запустить программу, нажать <Esc>, и программа завершит свою работу, несмотря на то, что действие еще ничему не было назначено. Теперь поместим на форму, как показано на рисунке, кнопку Button1 и в ее свойстве Асtion укажем имя (Action1) созданного ранее действия. Заголовок кнопки автоматически изменится (следующий рисунок). Если изменить свойство Caption у действия и выполнить сохранение, то изменится заголовок у компонентов, которым назначено действие. Это очень удобно – из одного контейнера действий управлять ими, изменять заголовки, горячие клавиши и т. д. Аналогично создают другие действия и назначают их соответствующим кнопкам. Так можно создать пользовательское меню.

 

7.12. Меню приложения (TMainMenu)

Этот компонент вкладки Standard позволяет создать меню приложения (дословно главное меню). Разместим объект на форме и двойным щелчком по нему вызовем конструктор меню (рисунок справа). Прежде всего следует определить структуру меню. Пока в окне редактора находится один прямоугольник, который отображает новый элемент меню. Занесем в его свойство Caption название пункта меню – “Файл” и нажмем <Enter>. Результат описанных действий представлен на следующем рисунке. После этого кликнем прямоугольник справа от “Файл” и аналогично дадим ему имя “Редактирование”. Так же создадим пункт меню “Помощь”, а затем, щелкнув по “Файл”, выделим пустой пункт в этой секции (рисунок справа). Вводим имя пункта в его свойство Caption – “Открыть” и нажимаем <Enter>. Появившемуся новому пункту секции даем имя и т.д. В результате получаем структуру меню с секциями. На следующем рисунке представлено меню в действии.

Созданное меню пока еще неработоспособно, т.к. с его пунктами не связаны никакие действия. Следующим шагом будет создание обработчиков клика по соответствующим пунктам меню. За него также отвечает событие OnClick. Выбор варианта – за разработчиком.

Каждый пункт меню представляет собой объект типа TMenuItem, наделенный, кроме Caption, еще следующими свойствами:

· BitMap – картинка, отображаемая слева от названия пункта;

· ShortCut – горячая клавиша (их сочетание) для вызова пункта.

Среда автоматически присваивает пунктам меню имена, начинающиеся с буквы 'N', за которой следует порядковый номер пункта. Например, “Помощь” имеет в нашем приложении имя “N3”. Выделим в редакторе меню названный пункт, откроем вкладку событий и дважды щелкнем в колонке справа от OnClick, после чего напишем следующий обработчик:

procedure TForm1.N3Click(Sender: TObject);

begin

ShowMessage('Файл помощи'#13#10 + 'находится в разработке');

end;

 

Чтобы сопоставить с пунктом меню некоторую иконку, следует выделить его в редакторе, а затем щелкнуть по многоточию справа от свойства BitMap. В ответ откроется окно Picture Editor (редактор изображений). Щелчком по кнопке Load … открывают окно диалога, в котором необходимо добраться до папки …\Program Files\Common Files\Borland Shared\Images\GlyFX\Icons\BMP, а затем выбрать из папки с иконками нужного размера подходящую картинку. Пример такой иконки размером 16х16 пикселов (размер, используемый по умолчанию) по отношению к команде “Открыть” представлен на рисунке.

Компонент TMainMenu позволяет создавать стандартное меню. Имеется также возможность конструировать меню в стиле Windows XP. Для этого следует использовать компоненты вкладки Additional: TActionManager (менеджер действий), TActionMainMenuBar (панель главного меню) и TActionToolBar (панель инструментов). Разместим их на форме, как показано на рисунке справа: виден первый из названных компонентов, а два других представлены отводимыми под них соответствующими полосами в верхней части окна (там вставлены поясняющие надписи). На форме размещен также компонент TImageList вкладки Win32. С его помощью необходимо загрузить иконки для соответствующих инструментов. Это делается после двойного клика по ImageList1 и щелчка по кнопке < A dd… > конструктора списка картинок. Редактирование меню начинается с вызова его конструктора двойным щелчком по ActionManager1. С помощью кнопки < New Action > создают пункт меню – Action1 по умолчанию. Далее изменяют его свойство Caption, вводя название первого пункта – “Открыть”. В свойстве Category пишут имя создаваемой секции – “Файл”. Аналогично создают другие команды секции. Затем теми же методами формируют пункты меню других секций. После этого перетаскивают мышью названия секций из колонки Categories редактора на панель ActionMainMenuBar1, и меню готово. Чтобы вставить разделительную линию между пунктами меню, следует перетащить кнопку < Drag to create Separators > на нужную позицию.

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

Для размещения иконок на панели инструментов, необходимо сначала сопоставить их с командами За это отвечает свойство Images компонента ActionManager1. В нем следует указать созданный ранее список ImageList1 (после щелчка по кнопке с многоточием). Перетаскиваем мышью категорию “Файл” на панель ActionToolBar1, и на ней появляются соответствующие действиям иконки, а также имена команд. Чтобы уда лить последние, выполняют двойной щелчок по ActionManager1 и в окне редактирования действий на вкладке Toolbars устанавливают Caption Options в состояние None. Результат действий – на рисунке.

 

7.13. Матрица строк (TStringGrid)

 
 

Компонент TStringGrid расположен на вкладке Addational и представляет собой таблицу, ячейки (Cells) которой содержат строки символов. Столбцы и строки в ней пронумерованы от нуля. Свойства ColCount и RowCount задают количество столбцов и строк, а свойства FixedCols и FixedRows – соответственно число фиксированных слева колонок и сверху строк. В них заносят названия строк и столбцов таблицы. Ячейка массива описывается двумя индексами так: Cells[col, row]. Таким образом, при необходимости каждую строку в таблице можно рассматривать как запись с полями, хранимыми в отдельных ячейках. Покажем простой пример, использующий компонент StringGrid1 для вывода элементов матрицы, размер которой определяет пользователь после запуска приложения. Обработчики событий, связанных с заполнением и выводом элементов матрицы в ячейки таблицы, представлены ниже.

procedure TForm1.Button1Click(Sender: TObject); //Заполнение матрицы

var

i, j: integer;

begin

randomize;

StringGrid1.RowCount:= StrToInt(Edit1.Text) + 1;

StringGrid1.ColCount:= StrToInt(Edit2.Text) + 1;

Label3.Caption:= 'Матрица ' + Edit1.Text + 'x' + Edit2.Text;

//Формируем заголовки строк и столбцов

for i:= 1 to StringGrid1.RowCount + 1 do

StringGrid1.Cells[i, 0]:= IntToStr(i);

for i:= 1 to StringGrid1.ColCount + 1 do

StringGrid1.Cells[0, i]:= IntToStr(i);

for j:= 1 to StringGrid1.ColCount do

for i:= 1 to StringGrid1.RowCount do

m[i, j]:= random(100);

end;

 

procedure TForm1.Button2Click(Sender: TObject); //Вывод матрицы

var

i, j: integer;

begin

for j:= 1 to StringGrid1.ColCount do

for i:= 1 to StringGrid1.RowCount do

StringGrid1.Cells[j, i]:= IntToStr(m[i, j]);

end;

 

7.14. Таймер (TTimer)



Поделиться:


Последнее изменение этой страницы: 2016-06-19; просмотров: 661; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.11.34 (0.223 с.)