Лекция 4. Управляющая конструкция if, цикл for
Здесь вы познакомитесь со строковыми, символьными и логическими типами данных. Изучите управляющую конструкцию if и цикл for, познакомитесь с "программными скобками". Напишите приложение, используя пройденный материал.
Строковые типы данных
Мы уже работали со строковым типом данных String. Однако, как и в случае с цифрами, бывает несколько строковых типов. Строка состоит из набора символов. Компьютер работает в двоичной системе исчисления, он работает только с цифрами. И символы компьютер воспринимает в виде цифр. Для этого в операционной системе существует таблица символов, где каждому символу соответствует какая либо цифра.
Самая первая таблица символов, созданная для операционной системы MS-DOS, называлась ASCII. Эти символы были 7-ми битными, как следствие, таблица содержала максимум 127 символов. Поскольку в одном байте содержится 8 бит, один бит терялся впустую. У этой таблицы были свои языковые расширения, то есть, для каждого языка делалась своя такая таблица.
Для операционной системы Windows была разработана таблица символов ANSI, которая используется по сей день. Эта таблица использует 8-ми битные символы, то есть, содержит 256 символов, от 0 до 255. В Delphi такая таблица используется, как основная. Большее количество символов позволило вставить в таблицу не только основные символы, но и цифры, знаки препинания, специальные символы. Мы будем работать, в основном, с этой таблицей.
Для того, чтобы удовлетворить потребности пользователей других языков, была создана таблица UNICODE. Эта таблица использует 16 бит, и в нее помещается от 0 до 65 535 символов. Эта таблица, начиная с Windows 2000, используется все более широко, и когда-нибудь станет стандартом, но пока что она встречается гораздо реже, чем ANSI.
Имеются следующие строковые типы данных:
ShortString – короткая строка из ANSI символов. Количество символов может быть от 0 до 255. Иными словами, строку длиной более 255 символов в ShortString записать нельзя.
LongString – длинная строка из ANSI символов. Длина строки здесь почти не ограничена, в одну переменную такого типа можно записать текстовый файл с романом "Война и мир". Этот тип используется по умолчанию, то есть, когда мы указываем тип String, подразумевается именно этот тип данных. С ним нам чаще всего и придется работать.
WideString – длинная строка из UNICODE символов. От LongString отличается только тем, что использует иную таблицу символов.
Существует еще один тип строк – PChar. Этот тип работает с процессором совершенно иначе, чем предыдущие типы строк. Он очень неудобен в использовании и остался для совместимости с программами старых версий. Кроме того, встроенные в Windows функции работают именно с таким типом данных, поэтому его все же придется использовать. Когда мы начнем работать с этими функциями, разберем этот тип подробней.
Символьные типы данных
Программисту приходится работать не только со строками, но и с отдельными символами. Символ – это любая буква, цифра, арифметический знак, знаки препинания или пробел. Кроме того, существуют специальные символы, например, символ перехода на новую строку. Delphi поддерживает два типа символьных данных:
AnsiChar – символ ANSI таблицы. Используется по умолчанию, то есть, когда мы указываем тип Char, подразумеваем именно этот тип.
WideChar – символ UNICODE таблицы. Разница между ними такая же, как и у строк этих типов.
Как и в случае со строками, программист обычно объявляет тип Char, что соответствует типу AnsiChar.
Логический тип данных
Логический тип данных используется в условных выражениях. Он необходим для создания логики программы. Условное выражение проверяет – соответствует ли действительность заданному условию? Если соответствует, то выражение возвращает результат True(Истина). Если не соответствует, то возвращается False (Ложь). Таким образом, логический тип данных может иметь только одно из двух этих значений.
Boolean – логический тип данных.
В таблице 4.1 приведены операнды, с помощью которых формируют логические выражения:
Таблица 4.1. Логические операнды | |||
Логическая операция | Описание | Логическая операция | Описание |
= | Равно | >= | Больше или равно |
> | Больше | <= | Меньше или равно |
< | Меньше | <> | Не равно |
== | Точное равно |
Предположим, у нас есть два числа, и нужно проверить их на равенство. Эти числа хранятся в переменных целого типа a и b. Тогда выражение сравнения будет выглядеть так:
a = b;
Если в обоих переменных хранится одно и то же значение, то результатом такого сравнения будет True, иначе – False.
Begin .. end
В языке программирования Delphi, как и в других языках, существуют программные скобки, показывающие начало и конец какого-либо блока кода. Эти скобки имеют вид
Begin
//блок кода
end;
Обратите внимание, что после слова Begin точка с запятой не ставится. Эти программные скобки обязательны для каждой процедуры или функции, даже если они содержат только одну команду. Однако эти же скобки часто применяются в управляющих конструкциях или циклах. Циклы, как и управляющие конструкции, работают только с одним оператором (командой). А что, если в этом месте требуется использовать более одного оператора? Тут на помощь приходят эти самые программные скобки. Весь блок кода, сколько бы команд там не было, заключенный между Begin и End воспринимается, как один оператор. Мы не раз будем использовать эти скобки.
Управляющая конструкция if
В предыдущих примерах нам уже приходилось применять эту конструкцию на практике, теперь пришло время познакомиться с ней поближе. Управляющая конструкция if является основной конструкцией, на которой строится логика программы. Простейший синтаксис этой конструкции выглядит так:
if условие then оператор;
Кто знаком с английским языком, уже ухватил суть этой конструкции. На русский язык это выражение можно перевести так:
если условие то оператор;
Другими словами, если какое-то заданное условие верно, то выполняется указанный оператор. Иначе этот оператор не выполняется.
Часто одного оператора бывает недостаточно, тогда используют программные скобки:
if условие then begin
Оператор 1;
Оператор 2;
...
Оператор n;
end;
Операторы, заключенные в программные скобки begin .. end воспринимаются, как единый оператор. Иногда и этого бывает недостаточно. Что, если по логике программы требуется выполнить один оператор, если условие верно, и другой, если оно неверно? Тут приходит на помощь расширенная конструкция:
if условие then оператор 1
else оператор2;
Как видно из синтаксиса, если указанное условие истинно, то выполнится оператор 1. Иначе выполнится оператор 2. Еще одно правило, которое следует запомнить: перед словом else точка с запятой не ставится!
Конечно же, с помощью программных скобок можно расширить и эту конструкцию:
if условие then begin
Оператор 1;
…
Оператор n;
end
else begin
Оператор 1;
…
Оператор n;
end;
Сейчас самое время упомянуть о классических стилях программирования. Мы уже говорили, что хороший стиль программирования подразумевает каждый отдельный оператор писать на своей строке, применять отступы. В литературе по программированию часто встречается два классических стиля. Один стиль выглядит так:
if условие then
begin
Оператор 1;
…
Оператор n;
end;
То есть, слово begin пишется на отдельной строке. Другой стиль выглядит иначе:
if условие then begin
Оператор 1;
…
Оператор n;
end;
Оба эти стиля являются классическими, какой из них применять – дело вкуса. На этой лекции будет использоваться второй стиль.
Однако и это еще не все. В предыдущем примере мы рассматривали только одно условие. Если оно верно, то выполнялся один оператор, а если нет – другой. А что, если по логике программы требуется проверить более, чем одно условие? И снова мы можем расширить эту конструкцию. Взгляните на синтаксис:
if условие 1 then оператор 1
else if условие 2 then оператор 2
else оператор 3;
Здесь, если условие 1 будет верно, конструкция выполняет оператор 1 и завершает работу. Если это условие неверно, проверяется условие 2. Если условие 2 верно, то выполняется оператор 2, и конструкция завершает работу. Если же оба условия неверны, выполняется оператор 3. Расширений else if в такую конструкцию можно вставлять сколько угодно.
Давайте теперь проанализируем часть кода из примера прошлой лекции.
If Perem2 = 0 then begin
Soobshenie;
Edit3.Text := '0';
end
else begin
Perem3 := Delenie(Perem1, Perem2);
Edit3.Text := FloatToStr(Perem3);
end;
Вам уже должно быть понятно, что если Perem2 действительно равна 0, то выполнится первый блок кода. Иначе будет выполнен второй блок кода.
Цикл for
Еще один мощный инструмент в Delphi – циклы. Эти циклы выполняют оператор или блок операторов заданное количество раз. Синтаксис цикла for следующий:
for счетчик := нач_значение to кон_значение do оператор;
В расширенном варианте синтаксис такой:
for счетчик := нач_значение to кон_значение do begin
оператор 1;
оператор 2;
…
оператор n;
end;
Здесь:
- счетчик – переменная любого целого типа;
- нач_значение – начальное значение счетчика;
- кон_значение – конечное значение счетчика.
В качестве счетчиков используют обычно целые переменные. Чтобы не тратить попусту оперативную память, счетчикам назначают тип Byte или Word, в зависимости от того, какое значение может оказаться у конечного значения.
В самом начале счетчик будет равен начальному значению. Когда выполнятся все указанные операторы блока, управление вновь вернется к началу цикла. Счетчик увеличится на единицу, и цикл будет выполнен снова. И так далее, до тех пор, пока счетчик не станет равным конечному значению.
Давайте изучим цикл for на примере. Пусть нам нужно перевести температуру от 0 до 100 градусов из шкалы Цельсия в шкалу Фаренгейта. Правила здесь просты: нужно взять температуру по Цельсию, умножить ее на 9/5 и к результату прибавить 32. Сам результат нужно будет программно добавить в компонент Memo в виде строки:
"x градусов по Цельсию = y градусов по Фаренгейту"
Создайте новое приложение.
Сразу же свойству Name формы присвойте имя fName. В свойстве Caption напишите "Перевод температур из Цельсия в Фаренгейты". Сохраните проект в новую папку.
В верхнюю часть окна поместите компонент Memo и в свойстве Lines удалите из него весь текст. Растяните Memo по форме, как на рисунке 4.1:
Рис. 4.1. Внешний вид приложения
Ниже Memo добавьте кнопку Button, в свойстве Caption которой укажите "Расчет температур".
Теперь создадим обработчик нажатия на кнопку, дважды щелкнув по ней. Процедура выглядит так:
procedure TfName.Button1Click(Sender: TObject);
var
i : Byte; //счетчик
begin
for i := 0 to 100 do //делаем от 0 до 100
Memo1.Lines.Add(IntToStr(i) + ' градусов Цельсия = ' +
FloatToStr(CelToFar(i)) + ' Фаренгейта');
end;
Здесь следует обратить внимание на последний оператор. Оператор
Memo1.Lines.Add('Строка');
добавляет строку 'Строка' в компонент Memo. При этом, в качестве строки, мы использовали сложное выражение, формирующее строку из разных частей. Разберем каждую часть подробно.
IntToStr(i)
в качестве результата вернет значение i (счетчика) в виде строки. Как уже говорилось, это значение за каждый проход цикла будет увеличиваться на единицу. То есть, в первом проходе i будет равна 0, во втором 1, и так далее, пока не станет равна 100. Выполнив оператор в последний раз, цикл прекратит свою работу. А мы каждый раз будем получать это число в виде строки.
Далее у нас идет строка
' градусов Цельсия = '
С помощью знака "+" (знак конкатенации) мы добавляем одну строку к другой. В результате, при первом проходе мы получим строку
'0 градусов Цельсия = '
Обратите внимание, что во второй строке в начале и в конце есть пробелы. Без пробела строки сольются: "0градусов Цельсия =", а это некрасиво.
Далее мы имеем строку
FloatToStr(CelToFar(i))
Функция FloatToStr() возвращает вещественное число в виде строки. В качестве вещественного числа мы использовали вызов функции CelToFar(i), передав ей в качестве параметра целое число – текущее значение счетчика. Функция использует это число, как градус Цельсия, преобразует его в Фаренгейт и вернет значение в виде вещественного числа. Этой функции пока еще не существует, мы напишем ее позже. В результате мы получим строку "0 градусов Цельсия = 32". Далее мы добавляем еще строку
' Фаренгейта'
в результате чего получаем готовую строку "0 градусов Цельсия = 32 Фаренгейта". И уже готовую строку с помощью метода Add() мы добавляем в компонент Memo.
Еще одно правило, которое можно увидеть из этого примера – если оператор получается длинным, его можно перенести на следующую строку после арифметического знака или запятой.
Функцию CelToFar() нужно будет создать выше нашей процедуры:
function CelToFar(a : Byte): Real;
begin
Result := a * 9/5 + 32;
end;
Функция принимает параметр в виде целого числа, переводит его в Фаренгейты и возвращает в качестве результата, как вещественное число. Наша программа готова. Сохраните ее, скомпилируйте и посмотрите, как она работает. Если у вас не умещается весь полученный текст в Memo, добавьте в компонент вертикальную полосу прокрутки.
Лекция 5. Свойства
Здесь вы познакомитесь со свойствами формы и кнопки. Изучите управляющую конструкцию case и цикл while. Напишите шуточное приложение, используя пройденный материал.
Свойства формы
Мы сделали уже немало проектов, но пока не научились, как следует создавать форму. Разберем несколько полезных свойств формы, чтобы улучшить ее вид.
BorderIcons – свойство определяет, какие кнопки должны быть у полученного окна. Имеет только 4 значения, каждое из которых может быть True, то есть кнопка есть, и False, то есть, ее нет.
- BiSystemMenu определяет, будет ли у формы системное меню, которое показано в виде иконки слева на заголовке окна. Кроме того, будут ли там другие кнопки заголовка.
- BiMinimize определяет кнопку минимизации (сворачивания) окна. При этом False не убирает саму кнопку, а только делает ее неактивной.
- BiMaximize точно также определяет кнопку разворачивания окна.
- BiHelp – кнопка помощи в виде вопросительного знака. Не покажется у обычного вида формы, даже если поставить в True.
BorderStyle – свойство формы, определяет ее общий вид. Может быть:
- BsSizeable – обычное окно. Установлено по умолчанию. Стандартное окно, которое может менять размеры.
- BsDialog – окно в форме диалога, имеет только кнопку "закрыть".
- BsNone – окно вообще без оборки и без заголовка окна.
- BsSingle – отличается от обычного окна тем, что у него нельзя изменить размеры.
- BsSizeToolWin – окно с тонкой оборкой. Особенно это заметно у заголовка окна.
- BsToolWindow – такое же, как предыдущее, но у этого окна нельзя менять размеры.
BorderWidth – ширина оборки окна. По умолчанию установлен 0.
Color – цвет рабочей области окна. Не очень-то увлекайтесь раскраской окон! По крайней мере, помните, что если вы решили сделать окно, непохожее на стандартное, то все окна приложения придется делать такими же, чтобы поддержать общий стиль программы. А вообще все профессиональные приложения стремятся иметь стандартный вид.
Cursor – вид указателя мыши. Вы выбираете, как будет выглядеть указатель при наведении на форму.
Font – выбор шрифта по умолчанию. Другими словами, если Вы измените шрифт, то все компоненты, устанавливаемые на форму, по умолчанию примут его.
Height – высота окна. Обратите внимание, что когда вы мышью изменяете размер окна, это свойство автоматически меняет значение.
Icon – иконка в заголовке окна. Если дважды щелкнуть по этому свойству, выйдет окно загрузки другой иконки. По умолчанию установлена стандартная иконка Delphi 7, но можно сделать и свою собственную. Чаще всего используют коллекции иконок, скачанных из интернета. Но если Вы чувствуете в себе талант художника, можете попробовать сделать иконку для своего проекта самостоятельно. Для этого используйте встроенную утилиту Image Editor, ярлык которой находится там же, где Delphi. Выберите команду "File – New – Icon file", и рисуйте на здоровье!
Name – имя компонента формы. Это свойство вместе со свойством Caption мы уже рассматривали, так что просто вспомним, что Name главной формы желательно всегда указывать одинаково, например, fMain.
Position – расположение окна. Довольно важное свойство! Оно имеет несколько значений:
- PoDefault – Windows сам будет решать, где расположить Ваше окно на экране, и какие у него будут размеры.
- PoDefaultPosOnly – Windows решает, где будет окно, а размеры его будут такими же, как Вы их установили.
- PoDefaultSizeOnly – позиция остается, как Вы указали, но Windows решает, какие у окна будут размеры.
- PoDesigned – это значение по умолчанию. И позиция, и размеры остаются такими, как Вы их создали.
- PoDesktopCenter – выбирайте этот вариант, если желаете, чтобы окно всегда выходило по центру рабочего стола.
- PoMainFormCenter – это значение используют для дочерних окон, о которых речь будет впереди. Если у дочернего окна выбран этот вариант, то оно всегда будет появляться по центру главной формы.
- PoOwnerFormCenter – это значение заставит дочернее окно появляться по центру того окна, из которого оно вызвано.
- PoScreenCenter – окно появляется по центру экрана. Почти то же самое, что и PoDesktopCenter.
Width – ширина окна. Как и высота, это свойство меняет свое значение, когда Вы меняете размер формы.
WindowState – состояние окна после запуска. Имеет три значения:
- WsNormal – по умолчанию. Окно показывается в нормальном состоянии.
- WsMaximized – окно появляется в развернутом виде.
- WsMinimized – окно появляется в свернутом виде.
Вот, собственно, и все основные свойства формы. Теперь попробуйте поэкспериментировать с этими свойствами, и посмотреть, как будет меняться внешний вид формы. Большинство из этих свойств общие для всех компонентов. Мы уже говорили, что свойства компонента (в данном случае, формы) можно рассматривать как переменные определенных типов. Значения в эти свойства чаще всего заносят в момент создания формы, с помощью Объектного инспектора. Однако многие свойства позволяют заносить в них новые значения программно, то есть, в момент работы готового приложения.
Свойства кнопки TButton
Здесь мы разберем только основные свойства кнопки, которые нам пригодятся для работы, и которых мы еще не знаем. Большинство свойств мы уже знаем. Свойство ModalResult мы будем разбирать позднее, когда будем работать с модальными окнами. Сейчас обращу Ваше внимание только на три свойства.
Name – это свойство нам вполне знакомо, оно указывает имя этого компонента. Обычно мы изменяли Name только у формы, но в дальнейшем приучайтесь изменять его у всех компонентов. Когда у Вас будут сложные формы со множеством кнопок, очень сложно будет определить в редакторе кода, что делает кнопка Button1 или Button12. Поэтому будет лучше, если Вы приучитесь давать кнопкам осмысленные названия. К примеру, в редакторе текстов мы устанавливали 3 кнопки: Загрузить, Сохранить и Очистить. Следовательно, было бы правильным изменить имена кнопок на bLoad, bSave и bClear. Первая буква b подскажет нам, что это кнопка, а название после этой буквы скажет, что кнопка должна делать. Приучайтесь сразу к хорошему стилю программирования, если не хотите иметь неряшливый код, в котором легко запутаться. Если Вам не нравятся правила, что форму мы начинаем с буквы f, а кнопку с буквы b – придумайте свои правила, но в дальнейшем всегда придерживайтесь их!
Left – с этим свойством мы пока что не работали. Свойство Left показывает положение кнопки от левой границы формы. Если мы будем менять это значение, кнопка на форме будет двигаться по горизонтали.
Top – это положение кнопки от верхней границы формы. Работает также, как Left, но двигает кнопку по вертикали.