For — Ключевое слово Delphi


Содержание

Клуб программистов

Delphi programming

Подписаться на рассылку:

DownTo

Предшествует переменной цикла в декрементном цикле for

  1. for Variable := Integer Expression downto Integer Expression do Statement;
  2. for Variable := Char Expression downto Char Expression do Statement;
  3. for Variable := Enum Expression downto Enum Expression do Statement;

Описание:

Ключевое слово DownTo предшествует переменной цикла Expression(Выражение) в цикле for.

Выражение может быть целым, символьным или перечислимым типом.

См. ключевое слово For для подробного объяснения. Пример иллюстрирует три типа выражения.

Пример кода:

begin
// Loop 5 times
for i := (10 div 2) DownTo 1 do
ShowMessage(‘i = ‘+IntToStr(i));
end;

For — Ключевое слово Delphi

В математических выражениях используются операции присваивания , , , , , целочисленного , остатка от . При использовании этих операций важен приоритет их выполнения, так как в программировании на языке Delphi, как и в обычной математике, выражения выполняются не в порядке следования, а с учётом приоритета. У операций умножения и деления более высокий приоритет, чем у операций сложения и вычитания.
То есть, результат выражения

будет равен не 1, как в случае последовательного выполнения, а 6.2 .

Если же мы хотим получить именно последовательное выполнение, то необходимо применять скобки (), обособляющие те операции, которые необходимо выполнить первыми. Скобки могут быть вложены друг в друга неограниченное число раз:

Вот теперь X будет равен 1.

Помимо четырёх математических действий в Delphi доступно множество математических функций, таких, например, как тигонометрические, логарифмические, и т.д. Они становятся доступны в программе после добавления в секцию Interface uses модуля Math. Их описание также можно найти в модуле Math.pas (можно найти воспользовавшись поиском Windows). Многие из них можно реализовать и самому, но встроенные функции наверняка будут работать быстрее и лучше, т.к. написаны на языке ассемблера.

Логические выражения

Операторы Delphi

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

  • оператора присваивания
  • условного оператора
  • оператора цикла

С оператором присваивания «:=» мы уже знакомились в уроке Delphi 2. Он работает следующим образом. Переменная, стоящая в левой части оператора, становится равной той величине, которая находится справа. Типы этих величин должны совпадать. В выражении, стоящем справа, также может использоваться переменная, стоящая слева. С математической точки зрения это неправильно, но в программировании это означает, что из ячейки памяти берётся исходное значение, производятся вычисления, и результат записывается в эту же ячейку памяти, затирая прежнее значение. Пример:

В начале фрагмента переменная A равна 3, а в конце -25.

Условный оператор позволяет изменить порядок выполнения операторов в зависимости от выполнения некоторого условия. Вот как он записывается:

if условие then действие else альтернатива ;

Слова if (если), then (тогда), else (иначе) — зарезервированные. Действие и else альтернатива — это любые операторы Delphi, или несколько операторов, заключённых в логические скобки begin/end, или вызов подпрограммы. Если условие истинно, то выполняется действие , если ложно, то выполняется альтернатива .
Условие представляет собой логическое выражение. В нём сравниваются значения выражений (в том числе также и логических), вызов функций, возвращающих значения типа Boolean, и комбинирование этих значений с помощью логических операций:

Знак
операции
Название операции Логические операции могут комбинироваться с помощью связок:
and (логическое И)
or (логическое ИЛИ)
xor (исключающее ИЛИ)
Для некоторых типов данных есть дополнительные операции. Например, для множеств — оператор in, которая проверяет, входит ли некоторое значение в множество. Например:
X := [2, 4, 5, 7, 8, 10] ;
Выражение 2 in X истинно (имеет значение true);
Выражение 6 in X ложно (имеет значение false);
= Равно
<> Не равно
> Больше
= Больше или равно
действие ;
Счётчик — это переменная, которая должна быть объявлена перед логическим блоком, в котором оператор цикла расположен, и её тип должен относиться к одному из перечислимых типов, обычно Integer.
Выражение-1 и выражение-2 могут быть как константой или идентификатором, так и вызовом функции.
Действие — один или несколько операторов Delphi. Если это группа операторов, то они должны быть заключены в логические скобки begin/end.
В начале работы оператора переменная-счётчик получает значение выражения-1 . Если при этом значение счётчика окажется меньше или равно значению выражения-2 , то выполняются операторы, входящие в действие . Это и есть один цикл. Затем переменная-счётчик принимает значение, следующее за текущим, и начинается новый цикл, то есть сравнение счётчика и выражения-2 , выполнение действия , и так далее, до тех пор, пока значение переменной-счётчика не превысит значение выражения-2 .
Возможна работа оператора цикла, при котором переменная-счётчик будет не увеличиваться, а уменьшаться. В этом случае ключевое слово to заменяется на downto:
for счётчик := выражение-1 downto выражение-2 do действие ;
Соответственно, выражение-1 должно быть больше или равно выражению-2 .

Условный оператор цикла удобно использовать в том случае, когда количество повторений заранее не известно:
while условие do
тело цикла ;
Этот цикл будет выполняться до тех пор, пока истинно условие (логическое выражение, возвращающее значение типа Boolean). При этом если это выражение сразу равно false, тело цикла не будет выполнено ни разу.
Нужно очень внимательно следить за написанием условия и контролем завершения цикла, так как в результате ошибки цикл while будет повторяться бесконечное количество раз, что приведёт к «зацикливанию» и «зависанию» программы.

Условный оператор повторения сначала выполняет тело цикла , а затем уже проверяет выполнение условия :
repeat
тело цикла
until условие ;
Таким образом, этот вариант цикла гарантирует, что тело цикла будет выполнен по крайней мере один раз. И будет выполняться до тех пор, пока условие не станет истинным (т.е. true). Стоит отметить, что это единственный оператор Delphi, в котором тело цикла не требуется заключать в логические скобки begin/end. Начало и конец тела цикла определяются по ключевым словам repeat и until.

Вместе с операторами цикла используются специальные команды:

  • команда прерывания цикла
  • команда продолжения цикла

Команда прерывания цикла применяется, если в процессе выполнения операторов тела цикла выясняется необходимость его завершения. Вот эта команда:
Break ;
При её выполнении управление передаётся на первый оператор, следующий за оператором цикла.
Команда продолжения цикла позволяет немедленно продолжить выполнение цикла, пропустив все оставшиеся операторы в теле цикла, то есть начать следующую итерацию . Вот эта команда:
Continue ;

Справедливости ради стоит рассказать об ещё одном операторе, позволяющем изменить последовательность выполнения программы. Это оператор перехода:
goto метка ;
В качестве метки может использоваться любой допустимый идентификатор или число в диапазоне от 0 до 9999. Метку предварительно необходимо объявить в разделе описания переменных, но с помощью не ключевого слова var, а ключевого слова label:
label меткa ;
или
label список меток ;

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

Из этого примера видно, что оператор end ; завершающий программу, никогда не будет выполнен, то есть программа зациклится. Именно поэтому, вообще, использование оператора перехода является плохим стилем программирования, и без его использования вполне можно обойтись использованием условных операторов и операторов цикла. Единственный случай, когда использование оператора goto может быть оправдано — это выход из нескольких вложенных циклов, что иначе требует применения нескольких операторов Break.

Пример. Сортировка одномерного массива

Рассматриваются процедуры программы, приводятся подробные комментарии. Также можно скачать проект в виде архива. Цикл while и операторы goto использованы только для демонстрации работы с ними. Здесь — более правильный вариант с применением цикла repeat и оператора break.
Параллельно замечу, что сортировка массива «методом пузырька» — неэффективный метод. Количество итераций (проходов цикла) растёт гораздо быстрее роста количества элементов, . Сортировка 50 000 элементов выполняется на моём компьютере секунд за пять. Но сортировка 100 000 — не за 10 секунд, а около 35 секунд! Можете поэкспериментировать, для этого достаточно во 2 варианте установить в описании массива нужное количество элементов.

For — Ключевое слово Delphi

Цикл — это многократно повторяющаяся последовательность действий. Первый цикл, с которым мы познакомимся в этом уроке называется While. Do (делай пока верно условие).

Синтаксис: Сейчас нам нужно открыть Delphi и создать новый проект. Кидаем на форму компоненты Button и Label:

Создаем на кнопке процедуру OnClick и первое, что нам надо сделать — это ввести переменную A типа Integer: Теперь между ключевыми словами begin и end установим значение переменной A равное 1: И сейчас мы напишем сам цикл, с условием A<>100, то есть пока A не равно 100 будет выполняться цикл.
Если же А = 100 — цикл остановится: Далее, нам нужно что-то сделать в теле цикла. Давайте будем увеличивать значение переменной A на единицу и выводить значение переменной в Label. Вместо комментария (//Тело цикла) мы напишем: Общий вид кода: Компилируем программу, нажимаем на кнопку и видим, что лабел показывает нам сотню. Но почему сразу сотню? Почему не 1,2,3,4 и так до ста. Дело в том, что цикл выполняется на столько быстро, что мы не замечаем как лабел выводит нам сначала 1 потом 2 и потом 3. По этому мы видим только сотню — конечный результат. Кто-то может подумать, что так не интересно :). Хорошо, сейчас сделаем так, чтобы видеть как Delphi выполняет цикл.

Дописываем после строки Вот эти две строчки Они делают следующие:

  • Application.HandleMessage — это метод, позволяющий выводить значения переменных во время работы цикла. Не смотря на то, что мы и так выводим переменную в лабел, этот метод необходим.
  • sleep(100); — функция Sleep() говорит программе, что нужно поспать, как бы заморозиться на какое-то количество миллисекунд. Миллисекунды указываются в скобках. В секунде 1000 миллисекунд.

Общий вид кода: Компилируйте и проверяйте.

С циклом While мы закончили, теперь разберем цикл со счетчиком или другое его название For. To. Do. Данный цикл удобно применять, когда нам точно известно кол-во повторений.

Синтаксис: Этот цикл называется со счетчиком, потому что он сам увеличивает переменную счетчик на единицу.

Первым делом нам нужно добавить переменную S типа Integer. Далее, пишем программу, которая будет считать сумму чисел от 1 до 100.
То есть имеется ряд чисел 1 2 3 4 5 6 7 . 100.
Программа будет складывать эти числа между собой, то есть 1+2+3+4+5+6+7+. +100.

Стираем цикл While и пишем цикл For, но перед ним присвойте переменной S ноль: Этот цикл повторит действия в теле 100 раз.

В тело цикла мы запишем: Программа будет считать сумму чисел от 1 до 100, прибавляя к переменной S переменную счетчик A.

И после цикла выводим результат в лабел.

Общий вид: У цикла For есть цикл двойник, он может считать в обратном порядке. Для этого нужно изменить ключевое слово To на DownTo

Пример той же самой программы, но с обратным счетчиком: Далее. Знакомимся с циклом Repeat.

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

Стираем цикл For в нашей программе и пишем цикл Repeat: Эта программа выполнит тоже самое что и предыдущая.

Ну вот мы и закончили обучение циклам! Сейчас выучим 2 команды для управления ими.

Сразу приведу пример программы, а потом прокомментирую что и как в ней работает: В теле цикла присутствует условие, которое проверяет переменную S. Если S больше 100, то мы экстренно выходим из цикла при помощи команды break, иначе продолжаем цикл командой continue. Пример программы не очень удачный, так как цикл будет работать даже если мы стерем команду continue, но я надеюсь, что суть вы уловили.
Экспериментируйте и всё получится. Жду комментов ;)

Задание на закрепление: напишите программу, которая вычислит сумму двухзначных чисел и выведет ее в Label.

Ну вот и всё! Удачи!
Встретимся в следующем уроке!

Источник: www.thedelphi.ru
Автор: Савельев Александр
Опубликовано: 12 Июля 2012
Просмотров:

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

Цикл For в Delphi

Цикл For в Delphi — осуществляет выполнение операций, строго заданное количество раз.

Зарезервированные слова для реализации цикла: For, to, downto, do.

Чтобы понять как работает цикл, рассмотрим простенький пример заполнения массива состоящего из пяти элементов, числами от 1 до 5.

1) Помещаем на форму, компоненты: 1- Button, и 1-Memo;

2) Создаем обработчик событий на кнопке и записываем следующий код:

3) Запускаем проект и наблюдаем в компоненте Memo, заполненный нами масссив;

Теперь давайте разбираться, что к чему. Предлагаю перевести рассматриваемую конструкцию «For c:=1 to 5 do» на русский язык:

  • For — означает — от, для, в направлении;
  • to — означает к, на, до;
  • do — означает — выполнять, делать,

Запись c:=1 — переменная счетчик с присвоенным начальным значением 1. А цифра 5 после слова to — конечное значение.

В случае с нашим примером, получаем буквально следующее:

Далее, переменная с увеличивается еще на единицу, определяет номер второго элемента массива и присваивается ему в качестве значения (уже 2).

Затем записывается в первую строку Memo. Потом, переменная с увеличивается еще на единицу, определяет уже номер третьего элемента массива, присваивается ему в качестве значения (теперь 3). Затем записывается во вторую строку компонента Memo.

Снова, переменная с увеличивается на единицу, определяет номер четвертого элемента массива и присваивается ему, в качестве значения (уже 4). Затем записывается в третью строку компонента Memo.

И наконец, переменная с снова увеличивается на единицу, определяет номер пятого элемента массива, присваивается ему в качестве значения (уже 5), записывается в четвертую строку компонента Memo и цикл прекращается.

Теперь подробнее.

  • В начале вычисляются и запоминаются начальное и конечное значения c:=1 и 5 .
  • Циклу присваивается начальное значение c:=1, после чего это значение сравнивается с конечным — 5.
  • Если начальное значение меньше или равно 5, выполняются итерации цикла, где происходит увеличение начального параметра цикла (переменной с) на единицу. Затем выполняются команды прописанные после слова do, а именно:

Изменение параметра цикла происходит автоматом, после каждой итерации.

4) Как только параметр цикла с превышает конечное значение 5, цикл прекращает свою работу.

Цикл For может оперировать данными не только в порядке возрастания, но и в порядке убывания. Для этого мы вместо слова to, должны воспользоваться словом downto.

И если в нашем первом примере начальное значение, не должно было превышать конечное, то в случае с обратным порядком, должно быть все наоборот. Попробуем модернизировать наш код из первого примера, и сделаем теперь так, чтобы массив заполнялся с 5 до 1.

1) Помещаем на форму, компоненты: 1- Button, и 1-Memo;

2) Создаем обработчик событий на кнопке и записываем следующий код:

For — Ключевое слово Delphi

Алексей Вуколов, Елена Филиппова, Игорь Шевченко, «Королевство Delphi»

Содержание

Первая страница

После загрузки среды перед нами возникает приветственная страница «Welcome Page». Это новый аналог того самого окошка новостей, которое выглядело довольно неказисто, если ваш компьютер не был подключен к интернету во время работы. Однако не стоит так же сбрасывать со счетов и новый вариант. Кроме ленты новостей (RSS), «Welcome Page» содержит немало полезных ссылок. Во-первых, в самом верху страницы перечислен список проектов, которые вы уже открывали некоторое время назад, с указанием даты последней модификации. Каждая ссылка, естественно, открывает выбранный проект.

В левой части страницы подобраны ссылки на справочную информацию, документацию, которая устанавливается на ваш компьютер при инсталяции Delphi2005. Далее идут ссылки в интернет, на страницы компаний-разработчиков, чьи продукты встроены в среду. Например, на страницу Rave Reports, IntraWeb и так далее. И, наконец, ссылки на новостные группы в интернете, BDN и другие страницы Borland-ресурсов. То есть, «Welcome Page», действительно содержит полезную информацию. Может быть, не часто придется ею пользоваться, но и забывать о ней не стоит, может пригодиться.

Среда предоставляет возможнсть работать как в классическом стиле предыдущих версий Delphi (с отдельными окнами для дизайнера форм, инспектора объектов и т.д.), так и в стиле, максимально приближенном к MS Visual Studio, когда все окна пристыковываются к центральному, в котором можно заниматься дизайном формы или редактированием кода.

Для того, чтобы привести окна редактирования и палитры компонентов к привычному виду, поэкспериментируйте с настройками Tools | Environment Options | Delphi Options | VCL Designer | Embedded designer и Tools | Environment Options | Tool Pallete.

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

На мой взгляд, пользоваться справкой стало намного удобнее.

Появилась возможность настраивать цвета для Object Inspector, смотрите .

Редактор кода

С редактором кода стало работать намного удобнее.

Комментирование блока текста

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

В новой IDE это делается легким движением руки. Выделяем текст, нажимаем клавиши [Ctrl+/] и весь выделенный код оказался закомментирован. Обратная операция делается точно так же. На всякий случай напомню, почему это лучше, чем обычные скобки <> в начале и конце куска кода. В случае использования в начале каждой строки двойного слеша нет никакой нужды заботиться о вложенных комментариях, которые могут уже быть в выделенном тексте. Этот способ «устранения» части кода бывает удобен при отладке.

Очень удобна новая возможность редактора показывать соответствующие пары скобок (см. рисунок).

Сворачивание части кода

Как и в Delphi8, в редакторе Delphi2005 реализовано частичное скрытие (сворачивание кода). Это позволяет работать с большими текстами, не прокручивая многостраничный экран. Достаточно оставить развернутым сейчас только тот код, который используется. Для того чтобы свернуть или развернуть нужный блок, специально предусмотрены значки [-] и [+] в левой части редактора. Если нажать на значок [-], например, возле определения метода, код этого метода будет свернут, то есть, убран из видимости. Но, кроме этого, есть возможность применить эту операцию ко всему коду, а не только к текущему месту.

В меню по правой кнопке мыши есть два пункта Fold и UnFold. Это, соответственно, операции «свернуть» и «развернуть». Для каждой из них нужно указать место действия. Например, свернуть все методы в коде или все определения типов. Хочется заметить, что «свернутая» часть кода никуда не девается, а лишь уходит из видимой части редактора. Так что, если при компиляции или во время работы «Error Insight», ошибка окажется в свернутом коде, он прекрасным образом будет развернут автоматически в нужном месте. Так что никакой путаницы не возникнет.

Кроме этих возможностей, введены две директивы, которые по синтаксису аналогичны директивам компилятора, но оказывают влияние на поведение редактора, а не на генерируемый код. Это директивы $REGION и $ENDREGION. Они задают начало и конец сворачиваемого региона кода. Можно задать имя региона, в этом случае, когда регион свернут, вместо многоточия отображается имя региона (см. рис).

Help Insight

Если в привычном «Code Insight» показывался тип идентификатора (переменной, функции и т.д.) и модуль, в котором он определен, то «Help Insight» представляет собой всплывающее окно-подсказку, с кратким описанием этого идентификатора и дополнительными ссылками (см. рис). Достаточно подвести мышку к нужному идентификатору, чтобы получить такой «маленький help». Использовать «Help Insight» можно в комбинации с «Code Completion». Если в окне «Code Completion» выбрать определенное свойство или метод, то справа появится окно с подсказкой.

Эта возможность реализована не только для стандартных, но и для собственных классов и переменных. Использование «Help Insight» включено по умолчанию. Местонахождение в настройках: Tools->Options->Editor Options->Code Insight

Error Insight

В левой части экрана есть окно «Structure». Оно используется для показа визуальных компонент, лежащих на форме, переменных и констант, списка модулей, которые подключены и так далее. Но, кроме этого окно «Structure» может показывать список синтаксических ошибок, которые определяются до момента компиляции с помощью «Error Insight».

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

Sync Edit

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

Суть режима «Sync Edit» в том, что он позволяет показать в выделенном тексте все повторяющиеся идентификаторы, их может оказаться несколько групп. Самая первая считается текущей.

Для текущей группы все дубли помечены рамочкой, для остальных групп просто подчеркнуты. Переход между группами повторяющихся идентификаторов осуществляется клавишей TAB. Если начать изменять текущий идентификатор, то вслед за ним будут синхронно изменены все его дубли в этом выделенном блоке. Это похоже на «Рефакторинг: переименование идентификатора».

В отличие от полноценного рефакторинга, в режиме «Sync Edit» не производится никакого синтаксического анализа, а просто ищется повторяющееся имя. Его можно применять, как «быстрый рефакторинг» или использовать для поиска всех мест, где используется искомый идентификатор.

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

Повторное нажатие на иконку на левой полосе редактора кода, выключает «Sync Edit» и возвращает обычный режим редактирования.

История изменений

По мере редактирования и сохранения кода в проекте, средой автоматически ведется история этих изменений. Для каждого модуля, включенного в проект, можно просмотреть историю изменений, сравнить разные версии файлов и, если необходимо, возвратиться к любому из промежуточных изменений кода проекта. Смотрите закладку History в редакторе кода и тему «History Manager» в документации.

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

Но, есть и неприятные моменты.

Русские буквы в комментариях к коду

Поначалу неприятно удивило открытие файлов кода с комментариями в заголовке, написанными русскими буквами в кодировке Win1251. Часть таких файлов открываются, как двоичные. После небольшого исследования оказалось, что портит все маленькая буква «я» в тексте комментариев в начале модуля. Если в новой среде написать такой комментарий в начале модуля, то он редактируется нормально. Но, если его закрыть, то вновь откроется он в двоичном виде. По-видимому, проблема связана с тем, что редактор кода по первой порции фиксированного объема определяет формат файла. Встречая в этой порции букву «я» (ее код $FF), редактор некорректно определяет формат файла. При переносе текста с буквой «я» в конец файла или в середину файла большого размера, его формат определяется корректно.

Сходная ситуация обсуждалась в Подводных камнях.

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

Русские буквы в названиях каталогов проекта

Проекты VCL.NET и WinForms не запускаются из-под среды, если в полном имени каталога проекта есть русские буквы. Среда сообщает «Unable to create process».

К сожалению, ссылки в окне «Help Insight» не будут работать, если у вас в названии каталогов используются русские буквы.

Рефакторинг

Рефакторинг «переименование символа» — при позиционировании курсора на нужном идентификаторе и выборе пункта меню Refactoring | Rename Field, среда показывает все строки, где встречается выбранный идентификатор, и предлагает выбрать новое имя. Очень удобная возможность, как тут не вспомнить Мартина Фаулера:

«Важной частью пропагандируемого мною стиля программирования является разложение сложных процедур на небольшие методы. Если делать это неправильно, то придется изрядно помучиться, выясняя, что же делают эти маленькие методы. Избежать таких мучений помогает назначение методам хороших имен. Методам следует давать имена, раскрывающие их назначение. Хороший способ для этого — представить себе, каким должен быть комментарий к методу, и преобразовать этот комментарий в имя метода. Жизнь такова, что удачное имя может не сразу придти в голову. В подобной ситуации может возникнуть соблазн бросить это занятие — в конце концов, не в имени счастье. Это вас соблазняет бес, не слушайте его. Если вы видите, что у метода плохое имя, обязательно измените его. Помните, что ваш код в первую очередь предназначен человеку, а только потом — компьютеру. Человеку нужны хорошие имена. Вспомните, сколько времени вы потратили, пытаясь что-то сделать, и насколько проще было бы, окажись у пары методов более удачные имена. Создание хороших имен — это мастерство, требующее практики; совершенствование этого мастерства — ключ к превращению в действительно искусного программиста. То же справедливо и в отношении других элементов сигнатуры метода. Если переупорядочивание параметров проясняет суть — выполните его.»

Раньше для подобных действий использовался метод переименования идентификатора в месте, где он объявлен, и инкрементная компиляция до выяснения всех мест, в которых этот идентификатор использовался.

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

Рефакторинг: процесс выделения метода

После выделения метода

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

Unit-тестирование

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

Delphi 2005 располагает встроенными средствами для организации тестирования работы отдельных модулей программы, основанными на известных open-source проектах DUnit и NUnit (.NET). Среда позволяет создать проект-оболочку для тестов и шаблоны тестирующих модулей. Рассмотрим возможности Delphi 2005 на примере тестирования простого класса, осуществляющего перевод чисел из двоичной формы в символьную по заданному основанию системы счисления и, наоборот, из символьной в двоичную.

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

Реализация метода ToString будет содержать ошибки, которые мы будем обнаруживать тестированием. Первая реализация выглядит так:

Создадим проект-оболочку для тестов командой File|New|Other выбрав в категории Unit Tests элемент Test Project (см. рис. 1 и 1-1).

Показать скриншоты в отдельном окне: рисунок 1 и рисунок 1-1

После этого группа проектов принимает вид:

Добавим в эту оболочку первый тестирующий модуль командой File|New|Other выбрав в категории Unit Tests элемент Test Case.

Показать скриншоты в отдельном окне:

В результате этих действий в IDE открывается окно с кодом сгенерированного класса для тестирования методов выбранного класса.

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

В методе Setup пишем код для вызова корректного конструктора

Метод TestToString принимает вид:

И последний метод — TestToNumber

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

После запуска тестов видно, что один из методов исходного класса работает некорректно, так как полученный результат не соответствует ожидаемому (Ожидается ’10’ получен ‘AB’)

Анализируя исходный код метода, видно, что при переводе очередного знака числа, условия then и else необходимо поменять местами:

Перекомпилировав проект после исправления, снова запускаем тесты.

Видно, что ошибка исправлена, но метод все работает не так, как ожидается (Ожидается ’10’, получено ’01’).

Дальнейший анализ кода метода показывает, что при переводе числа в строку старшие цифры записываются после младших, исправляем эту ошибку, часть кода метода ToString теперь выглядит так:

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

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

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

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

В заключение хочется добавить, что использовать unit-тесты можно было и раньше. Например, полтора года назад, одним из авторов обзора была разработана среда подобного рода для того, чтобы полностью осознать, что же такое unit-тесты. Среда включала в себя главную программу и эксперт для генерации тестирующих модулей. Разумеется, не с таким красивым и удобным интерфейсом, гораздо больше кода приходилось писать вручную, но главный итог такой разработки и использования — осознание необходимости тестирования, в особенности, использования unit-тестов как значительного подспорья для разработки программ.

Спасибо фирме Borland, что такие нужны и удобные средства уже встроены в их новый продукт — Delphi 2005.

Компилятор

Предопределенный символ для идентификации компилятора — VER170 (выяснено опытным путем, в Help информация отсутствует).

Многие из перечисленных ниже возможностей являются нововведениями только для компилятора Win32.

for..in..do

В язык Delphi добавлена конструкция for..in..do для перебора всех членов массива, строки, множества или коллекции.

  • for Element in ArrayExpr do Stmt;
  • for Element in StringExpr do Stmt;
  • for Element in SetExpr do Stmt;
  • for Element in CollectionExpr do Stmt;

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

Полная и весьма понятная информация находится в справке, смотрите раздел «Declarations and Statements»

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

  • содержать public метод экземпляра с именем GetEnumerator, который должен возвращать экземпляр класса, ссылку на интерфейс или запись (record).
  • экземпляр класса, ссылка на интерфейс или запись, возвращенные методом GetEnumerator, должны содержать public метод экземпляра с именем MoveNext, возвращающий значение типа boolean.
  • экземпляр класса, ссылка на интерфейс или запись, возвращенные методом GetEnumerator должны содержать public свойство экземпляра с именем Current, тип которого должен соответствовать типу элементов контейнера.

Экземпляр, возвращенный методом GetEnumerator, автоматически разрушается после окончания цикла for..in.

Следующий пример показывает реализацию паттерна коллекции

Поддержка синтаксиса for. in уже встроена в ряд классов VCL, например, TList, TComponent, TCollection, и т.д. — в общей сложности около 15 классов. Так, например, перечисление имен компонентов формы может выглядеть следующим образом (хотя и непривычно):

Модификаторы области видимости

Для большей совместимости исходного кода с Delphi for .NET введены два новых модификатора области видимости членов класса.

strict private

Члены класса с видимостью strict private доступны только самому классу.

strict protected

Члены класса с видимостью strict protected доступны только самому классу и его непосредственным наследникам.

Отличие новых модификаторов от традиционных private и protected заключается в том, что члены с новыми модификаторами не доступны постороннему коду, находящемуся в том же модуле.

Class property

Раньше, хотя компилятор и позволял использовать методы класса в качестве аксессоров свойств, обращение к таким свойствам в форме TSomeClass.PropName было невозможно. Теперь, с введением свойств класса такое обращение разрешено. Однако, в отличие от Delphi for .NET, свойства класса могут работать только через методы, т.к. понятие полей класса для компилятора Delphi for Win32 отсутствует.

Вложенные типы данных и константы

Эта возможность также является новшеством только для компилятора Delphi for Win32. Теперь, как и в случае с Delphi for .NET, можно объявлять типы данных и константы внутри других классов.

Обращение ко вложенным типам и константам производится через имя типа, в который они вложены, например, TOuterClass.TInnerClass или TOuterClass.x. Для вложенных типов и констант действуют те же модификаторы видимости, что и для остальных членов классов.

Существует одна интересная особенность. Хотя компилятор для Win32 не поддерживает полей класса, их в какой-то мере можно заменить вложенными типизированными константами при условии, что включена опция компилятора $J (она же $WRITEABLECONST).

Ненаследуемые классы

Если по каким-то причинам разработчик хочет запретить создание наследников класса, это можно сделать используя модификатор sealed.

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

Например, компиляция кода

приведет к ошибке — E2352 Cannot override a final method.

XML Documentation

Для компилятора Delphi for .NET эта возможность существует с версии Delphi 8. Теперь эта возможность доступна и в компиляторе для Win32. Компилятор умеет различать в исходном тексте специальным образом оформленные комментарии и генерировать на их основе XML файлы. Формат комментариев во многом похож на XML. Каждый комментарий, который будет анализироваться на наличие тегов XML документации предшествовует документируемому объекту и должен начинаться с комбинации из трёх символов «/». Существует набор тегов, которые рекомендуется применять при оформлении комментариев. Он описан в справке .NET SDK. К сожалению для тех, кто не любит писать всякие теги руками, IDE никак не облегчает оформление таких комментариев.

Примитивный пример оформления документации:

Примерный вид XML документации, генерируемой компилятором:

Inline

В новой версии компилятора Delphi появилась возможность использования inline кода. Для этого наполнена новым смыслом директива inline. Теперь, если процедура или функция имеют директиву inline, это заставит компилятор попытаться вставить в место, где эта процедура используется, не вызов, а код тела процедуры. Само наличие директивы inline ещё не гарантирует того, что попытка будет удачной. Существуют определенные ограничения. Согласно справочной системе, эти ограничения таковы:

  • inline не работает для любых видов методов позднего связывания (virtual, dynamic, message)
  • inline не работает для процедур содержащих код на языке ассемблера,
  • inline не работает для конструкторов и деструкторов
  • inline не работает для главного блока программы и секций инициализации и финализации модулей
  • inline код может быть использован внутри пакетов, но inline не работает через границы пакетов
  • inline не работает в модулях, связанных кольцевой зависимостью. Это ограничение включает и неявные кольцевые ссылки между модулями. Например, если модуль A использует модуль B, модуль B использует C, а C, в свою очередь, использует A, то при компиляции модуля A не будет производиться inline-подстановка кода из модулей B и C.
  • inline-подстановка в модулях, входящих в кольцевые зависимости, может быть произведена, если подстановка производится из модуля, не входящего в кольцо зависимостей. Например, если в предыдущем примере модуль A использует также модуль D, то в модуле A возможна inline-подстановка кода из модуля D.
  • inline не работает, если процедура объявлена в секции interface модуля и обращается к символам, объявленным в секции implementation.
  • inline не работает для методов в классах, если они обращаются к членам классов, имеющим более низкую видимость, чем сам метод. Например, если public метод обращается к private методу, то для такого метода inline-подстановка осуществляться не будет.
  • если процедура, помеченная как inline использует процедуры или переменные из внешних модулей, то все эти модули должны быть перечислены в списке uses того модуля, где inline процедура будет использована, иначе inline-подстановка не производится.
  • inline-подстановка не осуществляется для процедур и функций, которые используются в выражениях проверки условия циклов while и repeat.

При использовании inline процедур следует помнить о том, что изменение кода такой процедуры приведет к перекомпиляции всех модулей, где она используется.

Также для контроля использования inline-подстановок введена директива компилятора <$INLINE>. Она может принимать следующие значения:

  • - Процедуры, с директивой inline будут помечены, как процедуры, для которых возможна inline-подстановка. При вызове таких процедур будет сделана попытка inline подстановки кода. Действует по умолчанию.
  • - Процедуры, с директивой inline будут помечены, как процедуры, для которых возможна inline-подстановка только в том случае, если код процедуры будет размером меньше 32 байт.
  • - Процедуры, не смотря на наличие директивы inline, никогда не будут помечены, как процедуры, для которых возможна inline-подстановка. При вызове процедур попытка inline подстановки кода не будет сделана.
Unsafe Code

Для компилятора Delphi for .NET добавлена возможность включения небезопасного кода в приложения .NET. Для этого введена локальная директива компилятора <$UNSAFECODE>, которая может принимать значения ON и OFF а также добавлено ключевое слово unsafe, которое применяется к процедурам и функциям. Приложения, использующие небезопасный код не проходит проверку при помощи утилиты PEVerify. Подробнее о небезопасном коде смотрите в документации .NET SDK.

Unicode-идентификаторы

Появилась возможность использовать в именах типов и переменных символы Unicode.

выглядит понятнее, чем

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

Пример компилирующегося и работающего кода:

Расширенный синтаксис объявления и инициализации массивов

Delphi для Win32

Теперь можно делать задание размеров массива и инициализацию одной строкой

Delphi for .NET

Новый расширенный синтаксис позволяет объявлять массивы в форме

Также возможна инициализация массивов при помощи стандартной процедуры new.

Отладка

Понравилось поведение системы при возникновении Exception — появляется окно с уведомлением об Exception и с возможностью поставить галочку "Игнорировать этот тип Exception", вместо того, чтобы открывать окно Tools | Debugger..

Изменилась работа с точками останова. Появилась очень удобная возможность, не удаляя точку останова, отключить ее, пометив как "disable". Это можно сделать в редакторе кода по правой кнопке на точке останова, и прямо в списке "Breakpoint list". В этом списке можно включать/выключать все точки или определенные группы (меню по правой кнопке). Так же, теперь прямо в окне "Breakpoint list" можно изменять значение Condition и принадлежность к определенной группе для каждой точки.

Встроенный Data Explorer

В IDE интегрирован Data Explorer, который содержит как средства просмотра базы данных, так и ряд инструментов для редактирования. Окно Data Explorer можно найти на одной из закладок окна Project Manager справа от редактора кода (при умолчанных настройках среды) или в меню View | Data Explorer

Выбираете провайдера для вашей БД, настраиваете коннекцию к базе и получаете список ее объектов:

Таблицы

Для таблиц определены следующие операции:

Просмотр данных

Это операция по умолчанию — двойной клик по имени таблицы в списке. Открывается отдельное окно с содержимым таблицы. Возможно редактировать все поля, даже identity и computed column. Диагностика производится в момент сохранения изменений (правая кнопка мыши | Update/Rollback), так что испортить таблицу затруднительно.

Изменение структуры

Визуальный аналог команды "Alter table".

В этом окне по правой кнопке мыши доступны команды Save changes/Show DDL/ Exeсute DDL

DDL (Data definition language) — текст SQL-скрипта, который отражает сделанные визуально изменения в структуре таблицы.

Удаление таблицы

Выполнение команды "Drop table"

Копирование таблицы

Копирование существующей таблицы в новую. Происходит, как создание новой таблицы с такой же структурой (имя новой таблицы запрашивается при выполнении paste) и заполнении ее данным из копируемой таблицы.

Хранимые процедуры

Доступные операции Refresh/View Parameters. Окно просмотра параметров открывается при двойном клике на имени процедуры. В этом окне можно указать значения всех входных параметров и, выполнив процедуру, получить заполненные значениями выходные параметры (см. рис). Для выполнения процедуры можно воспользоваться иконкой в верхнем левом углу окна или по правой кнопке мыши (команда Execute).

Если хранимая процедура в качестве результата возвращает еще и (или только) набор данных, необходимо поставить галочку "Stored procedure has one or more cursors" и выполнить процедуру снова.

Просмотр скриншотов в отдельном окне:

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

В качестве недостатка можно отметить отсутствие возможности прервать выполнение хранимой процедуры, если время выполнения оказывается довольно продолжительным.

SQL Window

Это привычное окно для выполнения SQL-запросов. Так как тестирование проходило только для MS SQL Server, то возможно, некоторые странности связаны с конкретным драйвером.

Сами SQL-запросы любой сложности (UNION, вложенные подзапросы и т.п.) выполняются без проблем. Странности начались после попытки исполнить в этом окне процедуру ("execute имя_процедуры"), которая в качестве результата возвращает набор данных. В качестве результата было получено сообщение "-1 row(s) affected". И этот результат был одинаков для всех процедур одного сервера. Тест на другом сервере дал иной результат, возможно этот эффект зависит от настроек на сервере (или от настроек конкретной базы), но такого иследования не проводилось. Итак, на другом сервере после выполнения процедуры было получено окошко с сообщением, например, таким: "192 row(s) affected", что само по себе верно, но никакого результата, то есть набора данных, все равно не было выведено. Если в тексте процедуры был оператор "Insert Into имя_таблицы exec имя_процедуры", то в качестве nколичества обработанных строк в результирующем сообщении выдавалось количество строк этого insert'а, а вовсе не nпоследнего select'а процедуры.

Можно предположить, что проблема кроется в ADO.NET, на котором реализован Data Explorer.

И, все же, несмотря на это, Data Explorer добавляет в среду разработки функционал, который реально может облегчить жизнь разработчику клиентских приложений для баз данных.

Данный обзор составлен по результатам первого знакомства с новой средой разработки. Изучить все нововведения в Delphi2005 за короткий срок невозможно, но такой задачи мы и не ставили перед собой. Разделив работу на параллельные части, мы постарались охватить как можно больше интересных, с нашей точки зрения, нововведений и "вкусностей" нашей любимой среды разработки.

Спасибо компании Borland за возможность ознакомиться с новой версией, которая несомненно, позволит вывести разработку приложений на качественно новый этап.

For - Ключевое слово Delphi

Школа программирования Delphi

Портал DelphiSchool является бесплатным проектом, обеспечивающим пользователям быстрый и легкий доступ к урокам программирования на Delphi. Сайт позволяет научиться программировать на Делфи любому, кто хочеть писать свои программы, игры, Android приложения, программы для MAC OC или IOS. Кроме уроков Delphi и статей Delphi, на сайте доступны также и видеоуроки. Практически к каждому уроку, пользователю доступен исходник, изучив который, он сможет наглядно посмотреть как работает та или иная программа, написанная на Делфи. Кроме того мы постараемся прилагать к каждому материалу (статье, уроку, видеоуроку) файлы Delphi, которые будут помогать изучить предоставленный материал.

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

В этом примере объявляются две переменные index и sum типа "целое число". Сначала переменной sum присваивается значение 0. После этого запускается цикл, в котором переменная index будет изменяться от 0 до 5.

Давайте рассмотрим поэтапно, что происходит в этом примере.
1. На первом этапе переменная index равна 0, sum также равна нулю, значит, будет выполнена операция sum:=0+0. Результат sum = 0;
2. На втором этапе index увеличена на 1, а значит, будет выполнено действие sum:=0+1. И мы получим результат sum = 1.
3. На третьем этапе index увеличена на 1 и уже равна 2, a sum = l. Значит, выполнится действие Sum: =1+2. Результат Sum = 3.
4. На четвертом этапе index увеличена на 1 и уже равна 3, a sum = з. Значит, выполнится действие sum: =3+3. Результат sum = 6.
5. Здесь index увеличена на 1 и уже равна 4, a sum = б. Значит, выполнится действие Sum: =4 + 6. Результат Sum = 10.
6. Здесь index увеличена на 1 и уже равна 5, a sum = 10. Значит, выполнится действие Sum: =5+10. Результат sum = 15.

Заметьте, что мы не увеличиваем значение переменной index, используя для этого определенные команды. Значение увеличивается автоматически, потому что эта переменная объявлена счетчиком в цикле for.

Давайте перенесем рассмотренный выше программный код непосредственно в программу, чтобы можно было убедиться в этом на реальном примере. Создаем новое приложение. На форме помещаем два компонента TLabel, два компонента TEdit и одну кнопку. Форма будущей программы показана на рисунке.

Компонент Edit1 переименовываем в EndEdit, a Edit2 переименовываем в ResuitEdit. Заголовки надписей (свойство Caption компонентов TLabel) меняем на «Конечное значение» и «Результат». Заголовок кнопки меняем на «Подсчитать». Теперь, по нажатии на кнопку (обработчик события OnClick для кнопки, который генерируется, когда пользователь нажал на кнопке) пишем следующий код:
procedure TForml.CalculateButtonClick(Sender: TObj ect);

К уроку (статье) Циклы for… to… do… в Delphi прилагается исходник, посмотрев который, вы можете ознакомиться с полным исходным кодом программы и посмотреть как работает созданная программа. Исходный код сопровождается комментариями, благодаря чему вы сможете легко в нем разобраться. Но я настоятельно рекомендую делать все самостоятельно. Так вы лучше и быстрее усвоите то, о чем говорилось в этом уроке

Для того чтобы получить возможность скачать исходник Delphi к этому уроку, необходимо посетить сайт рекламодателя. После этого, появится ссылка на исходник Delphi к уроку Циклы for… to… do… в Delphi
Нажмите на эту ссылку Ссылка

Добавить Циклы for… to… do… в Delphi в закладки:

Delphi for dotNet – первый взгляд

Автор: Михаил Полюдов
The RSDN Group
Источник: RSDN Magazine #2

Опубликовано: 20.02.2003
Исправлено: 13.03.2005
Версия текста: 1.0.1

Введение.

Такое событие, как выпуск новой, седьмой, версии Delphi, не прошло незамеченным для большинства разработчиков. Примечательно, что в поставку этого программного продукта включен дистрибутив Delphi .NET Developer Preview. Вот об этом новом продукте (вернее – его «примерочной» версии) и пойдет речь в данной статье.

Прежде всего стоит остановиться на комплекте поставки нового программного продукта.

Комплект поставки.

В поставку входят:

  • два компилятора командной строки dccil.exe и dccasp.exe. Реально это один и тотже исполняемый файл переименованный и скопированный в другую директорию.
  • модули импорта стандартных сборок CLR.
  • небольшое количество документации в формате HTML.
  • лицензия и рекомендации по распространению. В рекомендациях по распространению написано только то, что оно запрещено :).

К счастью, на Borland Developer Network (http://bdn.borland.com) имеется открытое дополнение, которое позволяет использовать компилятор Delphi .NET из IDE Delphi 7 . Это дает возможность работать с привычным интерфейсом и подсветкой синтаксиса (Правда, не весь синтаксис подсветится правильно, а уж о работе Code Completion и речи быть не может. Почему - будет понятно позже).

Основные цели Borland при разработке данного продукта.

Можно предположить, что при разработке прототипа Borland стремился:

  • Создать CLR-совместимый компилятор языка Object Pascal.
  • Обеспечить возможность использования собственных библиотек в новом окружении с минимально необходимыми изменениями со стороны конечного разработчика :).
  • Добиться (хотя бы ограниченной) совместимости нового компилятора с unmanaged-версиями Delphi на уровне исходных текстов. Некоторые ограничения неизбежны в силу наличия таковых ограничений в самой платформе .NET.

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

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

Некоторую проблему для Borland представляет наличие встроенной в платформу .Net библиотеки Windows.Forms. Эта библиотека содержит функциональность, аналогичную достаточно большому сегменту библиотеки VCL, но не является ее полным аналогом. Borland должен обеспечить возможность компиляции старого кода с использованием Windows.Forms. Сейчас еще трудно оценить, насколько выполнимы обещания Borland. Но пока что все выглядит довольно оптимистично.

Добиться совместимости с VCL и при этом не сдублировать код Windows.Forms – крайне сложная задача. Однако именно ее и пытается решить Borland. В качестве решения проблемы Borland планирует использовать новую (для него) возможность – helper-классы, речь о которых пойдет ниже.

Другая проблема возникает там, где используется так называемый небезопасный код. Такие участки кода придется переписывать при переходе под новую версию компилятора. В принципе, MSIL может выдержать всё, что угодно, так как по сути является платформно-независимым ассемблером. Но Microsoft ввел такое понятие, как "безопасный" код. Во многих случаях применение небезопасного кода не допускается средой исполнения. В основном это связано с защитой. Так, при скачивании кода из Интернет происходит его верификация, и, если код содержит небезопасные фрагменты, или использует небезопасные с точки зрения системы защиты вызовы методов, он просто не допускается к исполнению. Borland, по крайней мере пока, декларирует, что Delphi.Net будет компилировать исключительно безопасный код. В компилятор Delphi 7 уже встроено предупреждение о небезопасных (unsafe) участках кода.

Еще одна проблема в том, что компилятор Delphi (претендующий на компиляцию исключительно безопасного кода) не имеет права оперировать размерами данных и их физическим расположением в памяти. Дело в том, что CLR полностью берет на себя управление памятью и предоставляет программисту высокоуровневый API, основанный на информации о типах. Манипуляции с памятью, в том числе с размерами блоков памяти, допускаются только в небезопасном коде, а стало быть, Delphi не поддерживаются.

Вот так писать в Delphi будет нельзя:

Для работы с теми же массивами в .Net Framework предназначены специальные методы, позволяющие сериализовать содержимое массива как единый объект. Необходимость в unsafe-коде практически исчезает, хотя иногда это приводит к снижению эффективности кода.

Что нового в Delphi .NET


Что такое .NET

О платформе .NET, а точнее - о CLR (Common Language Runtime) есть очень хорошая статья Владислава Чистякова, опубликованная на компакт-диске к предыдущему номеру нашего журнала. В других статьях на www.rsdn.ru можно найти материалы по другим аспектам .Net.

В этой статье я не буду подробно рассматривать платформу .NET. Здесь будет рассмотрено несколько вопросов, интересующих Delphi -программистов, рассматривающих вопрос о переходе на новую платформу.

Изменения языка в Delphi.NET

Как уже говорилось, главная задача Borland – это поддержка платформы .Net, и, одновременно, сохранение совместимости с уже существующим кодом, написанным в Delphi.

Unsafe code (небезопасный код).

Borland добавил в Delphi 7 три новых предупреждения о небезопасных типах, небезопасном коде и небезопасных преобразованиях типов.

Типы данных, не поддерживаемые в Delphi.Net:


  • PChar;
  • нетипизированные указатели;
  • нетипизированные var и out-параметры;
  • file of ;
  • real48;
  • вариантные записи (записи, содержащие перекрывающиеся поля).

Небезопасный код:


  • переменные по абсолютным адресам;
  • процедуры Addr(), Ptr(), Hi(), Lo(), Swap();
  • процедуры BlockRead(), и BlockWrite();
  • функция Fail();
  • процедуры GetMem(), FreeMem(), ReallocMem().

Небезопасные преобразования типов:


  • преобразование объекта в тип, не являющийся потомком от изначального класса объекта;
  • преобразование записей.

При нарушении этих ограничений компилятор Delphi 7 с настройками по умолчанию выдаст предупреждение, а компилятор Delphi.NET – ошибку.

Кроме вышеперечисленных небезопасных конструкций, Delphi запрещает использовать встроенный ассемблер (оператор asm), конструкцию ExitProc и некоторые из конструкций для поддержки COM/OLE/ActiveX технологий:

Расширенные идентификаторы

В CLR имеются идентификаторы (типы, классы), которые совпадают по написанию с ключевыми словами Delphi, например: type, object. Для работы с такими идентификаторами нужно использовать полное именование, т.е. System.object, System.type и т.д. Borland декларирует в своей документации, что вместо полного именования можно использовать имя с префиксом & (амперсанд). Есть только одно "но": данная версия компилятора ругается на неправильный символ в исходных текстах :( .

Расширения и элементы, находящиеся в разработке.

Следующий список перечисляет конструкции языка, разработка некоторых из них еще не закончена по тем или иным причинам:

  • "запечатаные" (sealed) классы. Определено новое ключевое слово Delphi, "sealed". Атрибут "sealed" применяется к классу для указания того, что класс не может быть расширен где-либо в CLR (ни на Delphi, ни на любом другом языке программирования);
  • завершенные (final) методы. Еще одно новое ключевое слово "final". Данный атрибут применяется к методам для указания того, что они не могут быть перекрыты в потомках;
  • UTF-8 Unicode символы в исходном коде;
  • вложенные типы (т.е. описание типа внутри другого);
  • невиртуальные методы в записях;
  • статические (class, static) данные класса;
  • статические (class, static) свойства класса;
  • статические (class, static) методы;
  • виртуальные методы в helper-классах;
  • широковещательные (multicast) события (event). На текущий момент планируется использовать оператор ' := ' для замены последнего присвоенного события, не влияя на обработчики событий, назначенные из управляемого кода других средств разработки. Присвоение значения nil будет вызывать удаление последнего присвоенного обработчика событий;
  • Variant будет поддерживаться как TObject, а не как TVarData (реализация внутренних механизмов работы с Variant возлагается на CLR);
  • Автоматическое упаковка (boxing) value-типов (простых типов, таких, как Integer, и записей) в CLR объекты.

Пространства имен (Namespaces).

В Delphi .NET юнит остается основным контейнером для типов. CLR предоставляет еще один слой организации – пространство имен (namespace). В .Net Framework пространство имен – это концептуально контейнер типов. В Delphi for .Net пространство имен - это контейнер юнитов Delphi. Появление пространств имен дает Delphi возможность использовать и расширять классы .Net.

В отличие от традиционных юнитов Delphi пространства имен могут быть вложенными и формировать иерархические структуры. Вложенные пространства имен предоставляют способ организации типов и идентификаторов, и используются для однозначного определения типов с одинаковыми именами. Будучи контейнерами для юнитов, пространства имен могут применяться, чтобы различать юниты с одинаковыми именами, но лежащие в разных package'ах.

Например, класс MyClass из пространства имен MyNameSpace отличается от класса MyClass из YourNamespace. Во время исполнения CLR всегда обращается к классам и типам по их полным именам: имя сборки, за которым следует название пространства имен, содержащего тип.

В Delphi.NET файл проекта (программы, библиотеки или package'а) неявно вводит собственное пространство имен, называемое пространством имен проекта по умолчанию. Юнит может как входить в это пространство имен, так и явно объявить себя членом другого пространства имен. В любом случае юнит объявляет свою принадлежность к тому или иному пространству имен в выражении Unit. Например, вот так явно объявляется пространство имен:

Прежде всего, обратите внимание на то, что пространства имен разделяются точками.

Во-вторых, заметьте, что точки выражают концепцию вкладывания одних пространств имен в другие. Вышеприведенный пример говорит, что юнит MyUnit – это член пространства имен MyWidgets, которое, в свою очередь, содержится в пространстве имен MyCompany.

Компилятор раскрывает пространства имен в следующей последовательности:

  1. Пространство имен данного юнита (если таковое существует).
  2. Пространство имен проекта по умолчанию.
  3. Пространство имен, указанное в выражении проекта Namespaces.
  4. Пространства имен, указанные в настройках компилятора

Приложение Delphi.NET

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

Программа №1. “Hello .NET!”.

Данная программа – традиционный пример, используемый со времен Кернигана и Ричи. Эта программа будет всего лишь выводить на консоль строку "Hello, Delphi.NET!".

Итак, приступаем к созданию первого проекта на Delphi .NET.

ПРИМЕЧАНИЕ

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

Итак, создаем новый проект консольного приложения (File-New-Other-Console Application), сохраняем его как HelloDelphiNet.dpr.

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

либо выбрав пункт меню Delphi с установленным .NET расширением Delphi for .NET->Compile (или Build).

После компиляции запускаем готовый EXE-файл из командной строки (иначе мы просто не увидим результатов его работы) и видим следующее:

Что дальше

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

ПРИМЕЧАНИЕ

Не стоит удивляться тому, что в следующих примерах все элементы управления и формы создаются в коде, а не через модификацию/загрузку ресурсов. Это является обычным поведением для .NET-ориентированных языков. Дело в том, что одной из новинок, появившихся в .NET Framework, стала возможность сериализации в код. Тот же дизайнер форм Visual Studio сохраняет состояние формы и элементов управления в код программы. Это позволяет ускорить загрузку формы, а также вручную модифицировать код, сгенерированный дизайнером форм. Delphi поддерживает другую концепцию – сериализацию в собственный формат. Пока не ясно, как будут сериализоваться формы в Delphi.NET. Ясно одно – создать CodeDOM-провайдер, позволяющий использовать Delphi внутри VS.NET, будет несложно.

Программа №2. Нам нужны окна.

Borland пока не включил в Delphi.NET свою библиотеку VCL (но планирует сделать это, что явственно следует из документации). Основных причин, пожалуй, две:

  • сжатые сроки выпуска компилятора .NET, при продолжении развития основной линейки Delphi;
  • сложность реализации совместимости между VCL и Windows Forms.

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

Проблема №1. Множественные (multicast) обработчики событий.

В .Net все события компонентов множественные. Что это значит?

Проиллюстрирую примером на псевдокоде (псевдокод потому, что сама концепция есть не только в C# или там VB, а в CLR вообще):

Есть объект кнопка .

Прописываем в ее событие Нажато первый обработчик:

Так же прописываем еще один, прямо следующим оператором:

В обычной Delphi вторая строка кода заменит первый обработчик вторым, а в CLR должна добавить второй обработчик в очередь за первым (правда, в Borland еще не до конца решили, так это будет реализовано или не так, но об этом уже писалось выше).

в C# данная концепция реализована так:

Этот код, требует некоторых пояснений. Итак: EventHandler – это так называемый делегат – специальный класс из сборки System, позволяющий ссылаться на метод некоторого класса. У данного класса есть (если верить MSDN) следующие конструкторы:

Второй формат недоступен из C#, а первый – из Delphi. Самое странное, что в Delphi можно и нужно передавать не метод, а обычную процедуру, причем в качестве объекта может передаваться значение nil .

Проблема №2. Совместимость CLR и VCL.

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

Для того, чтобы создавать эффективные и небольшие приложения для CLR, нужно, чтобы VCL максимально использовала CLR. Если не реализовать VCL-обертку для CLR, код, который уже существует для VCL, под CLR придется переделывать очень долго. Borland придумал очень интересный выход: для каждого класса компонента CLR создается так называемый helper-класс, который расширяет функциональность класса CLR.

Детали этой технологии в Borland до конца еще не разработали, а вся информация почерпнута все из той же документации к Delphi.NET.

Итак, helper-класс – это класс, содержащий дополнительные методы, расширяющие функциональность основного класса. Использование helper-класса – это не форма наследования, а способ обеспечения расширения функциональности базового класса. Синтаксис объявления helper-класса таков:

Обычно перед helper-классом идет объявление типа:

А за ним уже собственно объявление класса

Теперь существующий Delphi-код, ожидающий наличия у типа TMyClass функции ExistingDelphiFunc, будет работать как ни в чем не бывало.

Хорошим примером может служить класс System.Object, являющийся предком для всех .NET классов. В Delphi ему соответствует класс TObject. В Delphi for .Net TObject не наследуется от System.Object. Вместо этого он объявлен helper-классом для System.Object. Это позволяет использовать такие отсутствующие в System.Object методы, как ClassName и ClassType. Компилятор, не найдя реализаций Class-Name и ClassType в классе System.Object, обратится к helper-классу и возьмет их оттуда. Таким образом, helper-классы позволяют использовать в .Net возможности, уже реализованные в VCL.

Итак, проблемы обрисованы - попробуем написать код

Первый пример - просто окно с надписью.

Создаем новый проект Delphi .NET, TestForm1.dpr. Вот его начальный код:

Теперь заявим наше намерение использовать сборку System.Windows.Forms (В данной сборке содержатся стандартные элементы управления):

Теперь объявим глобальную переменную – форму:

В коде создадим форму.

Компилируем и запускаем.

На экране мы видим простую формочку без заголовка.

Попробуем добавить заголовок и переместить форму на центр экрана:

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

Полный исходный текст TestForm1.dpr:

Программа №3. Добавляем на форму кнопку.

Новый проект назовем TestForm2.dpr, за основу берем TestForm1.dpr.

Для начала описываем новый класс:

Изменяем объявление переменной и конструирование формы:

Теперь создадим конструктор:

ПРЕДУПРЕЖДЕНИЕ

Внимание! ОБЯЗАТЕЛЬНО нужно выполнять вызов inherited конструктора.

Компилируем и запускаем - все осталось как и было, то есть все работает, но форма уже нашего класса.

Пишем тело конструктора:

Запускаем – все в порядке. Но пустая форма нам неинтересна – попробуем создать на ней кнопку:

Итак, у нас есть кнопка с надписью "закрыть" в левом верхнем углу формы, но сделать с ее помощью ничего пока нельзя. Пора начинать решать первую проблему Borland – обработчики событий. Пока что подключение и использование обработчиков событий в Delphi.NET до конца не реализовано. Поэтому приходится прибегать к некоторым ухищрениям, а именно – использовать в качестве обработчика событий процедуру, не являющуюся членом класса формы.

Из MSDN узнаем, что спецификация обработчика должна быть такой:

На Delphi это будет выглядеть так:

а в конструкторе вставляем следующую конструкцию:

Компилируем, запускаем – работает. Единственное НО - использование глобальной переменной. Но эту ошибку, похоже, получится исправить только в следующей (нормальной?) версии компилятора.

Резюме

  • компилятор есть, поддерживает как минимум часть стандартных сборок .NET Framework;
  • имеется, в принципе, среда написания кода, компиляции (с позиционированием ошибок) и запуска отладчика (с перекомпиляцией в DEBUG);
  • существует возможность писать как консольные, так и оконные приложения;
  • нет пока что портированной библиотеки VCL;
  • есть некоторые несоответствия между прилагаемой документацией и компилятором.

Таким образом, вполне нормально для Developer Preview, но не достаточно для качественной среды разработки от Borland. Ждем следующих версий.

Строковый список Delphi, содержащий отрицательное ключевое слово в списке

У меня есть два строковых списка, с которыми я работаю. Тот, у которого есть список ключевых слов, а затем другой, который имеет список минус-слов. Я хочу, чтобы иметь возможность выполнять поиск по списку и выбирать элементы списка, которые не содержат отрицательное ключевое слово и выводятся в третий список ключевых слов. Я использовал функцию AnsiPos, но обнаружил минус-слова, если они были частью слова, и полное слово.

Любые предложения относительно относительно простого способа сделать это? Скорость не так важна, но будет хорошо.

Пример того, что я ищу:

Список ключевых слов:

Отрицательный список ключевых слов:

Это то, что у меня до сих пор.. что не работает. Я использовал информацию из: Есть ли эффективная функция поиска целого слова в Delphi?

For - Ключевое слово Delphi

В первую очередь пошел искать в хелпе, не нашел (хотя узнал много интересного ^^), в яндексе тоже глухо. В книжках по делфи, которые мне попадались о сабже тоже нет упоминаний. Итак, что же делает ключевое слово "object"? Ссылки на документацию приветствуются, но и ответом "своими словами" не побрезгую.

ЗЫ В общем-то, какой-то конкретной цели не преследую, просто для повышения образованности.

Это устаревший способ работы с самодельными объектами. Теперь гораздо целесообразнее использовать class

> Это устаревший способ работы с самодельными объектами

Моё любопытсво все еще не удовлетворено :). Чем object отличается от class, что именно устарело. Попадался мне как то код с этим волшебным словом, так что хотелось бы понять что это из себя представляет.

Идеальное слово для описания всего.

Даже для искуственного интелекта.

> Desdechado © (03.03.07 17:06) [1]
> Это устаревший способ работы с самодельными объектами. Теперь гораздо целесообразнее использовать class

В Делфях классом считается все, что прождено от TObject. Но проблема в том, что нужно было объявить сам TObject в юните "system.pas", для чего и использовали ключевое слово языка Паскаль object. Ключевое слово class не является зарезервированным словом языка Паскаль, хотя поддерживается и зарезервировано сейчас почти всеми компиляторами (Delpi, FPC, Lazarus, Kylix, TNT).


> Чем object отличается от class, что именно устарело

object в общем-то позволяет создать статический объект. Подробнее о нем ты лучше прочитай в любом руководстве по Турбо-Паскалю 5.5-7.0, с тех пор ничего не изменилось. В Delphi object только для совместимости и поддерживается

Руководство щас погуглю.
А под статическим объектом понимается объект, все методы которого статические? А конструктор с деструктором присутствуют? (=

Servelat © (03.03.07 17:19) [6]
нет просто память под такой объект выделяется статически, то есть при загрузке программы в память, а не когда программист соизволит

> PEAKTOP © (03.03.07 17:14) [4]
TObject = class;
T >
купи "твикс". жуй. молчи. заодно почитай материалы по Object Pascal (тому, из которого упёрли концепцию обёектов в Turbo Pascal 5.5).

Собственно, вопрос закрыт; нашел у себя на винте UserGuide по BP70 (что прям удивительно, на русском), где тема полностью раскрыта, просвещаюсь. Всем спасибо за ответы.

Удобен тем, что содержит в себе идеи ООП (наследование) и не требует лишней работы и памяти. Посмотри, сколько всего делается и создается в конструкторе TObject! Если мне нужно будет использовать сотню-другую тысяч объектов, то выбор будет за object"ами, а не за классами, наверное.

> Если мне нужно будет использовать сотню-другую тысяч объектов,
> то выбор будет за object"ами, а не за классами, наверное.

Так и до record"a дойти не долго :))

> Ketmar © (03.03.07 17:34) [8]

> Loginov Dmitry © (03.03.07 18:58) [11]

Структурное программирование рулит. Я серьезно.


> Посмотри, сколько всего делается и создается в конструкторе
> TObject! Если мне нужно будет использовать сотню-другую
> тысяч объектов, то выбор будет за object"ами, а не за классами,
> наверное.

Гм. Наверное наооборот :-) class как раз под такие случаи и заточен :-)

> tesseract © (03.03.07 20:52) [14]

На пустых объектах/классах поэкспериментировал, 100000000 TObject"ов создано за 19 секунд и использовано 720 метров памяти, столько просто обджектов - за ноль секунд и использовано памяти метр с копейками. Если объекты буду содержать какие-то данные и выполнять какие-то действия, то и на сотне разницу почуствуем.

> использовано памяти метр с копейками

Сами-то в это верите?

> Если объекты буду содержать какие-то данные и выполнять
> какие-то действия, то и на сотне разницу почуствуем.

Или эта разница просто-напросто исчезнет.

> Сами-то в это верите?

Четырехзначная цифирь, начинается на один .

to PEAKTOP © (03.03.07 17:14) [4]:
Что за трава? Или это были грибы? :)))

to TUser © (03.03.07 21:04) [15]:
>На пустых объектах/классах поэкспериментировал
Угу, а производительность будем на "Hello, World!" мерять. :)
Пустой object занимает 0 байт, в отличие от наследника TObject, который занимает 4 минимум байта.

>Если объекты буду содержать какие-то данные и выполнять какие-то
>действия, то и на сотне разницу почуствуем.
Фиг. Если в object будет поле, допустим integer, вес уравняется. Преимуществ не будет почти никаких. При одинаковом количестве полей будут те самые 400 байт на сотне.

И вообще, что-то цифры подозрительные. Что там в коде-то?

TUser © (03.03.07 21:04) [15]

Тут такой момент - пустые объекты, как и пустые классы никому не нужны. Давай ты полные насоздаешь ?

33 секунды для объектов vs минута думанья и Out of memory в случае классов :) Объекты и классы содержали по два поля типа integer + то, что от TObject. Говорю же - объекты (те, которые экземпляры классов) память любят кушать. Больше, чем объекты, которые просто, т.е. типа record с наследованием.

> Говорю же - объекты (те, которые экземпляры классов) память
> любят кушать. Больше, чем объекты, которые просто, т.е.
> типа record с наследованием.

Ай-ай! Какая беда! 100000000 объектов всю память скушали!
Только нюансик один: что вообще в принципе можно делать с таким количеством объектов? Их же надо где-то индексировать (в массиве там, или в списке), это еще 400 метров памяти надо. Нужен метод доступа, поиска и т.п., что при таком количестве объектов (будь то object или class) будет выполняться катастрофически долго.
То есть пример со 100000000 объектов выглядет очень уж надуманным.

to TUser © (04.03.07 04:27) [21]:
>Говорю же - объекты (те, которые экземпляры классов) память любят
>кушать. Больше, чем объекты, которые просто, т.е. типа record с
>наследованием.
А вот мои подсчеты говорят, что памяти в результате понадобится одинаковое количество. Догадываетесь, почему? А времени, тут да, создание экземпляра класса требует чуть больше, т.к. экземпляру класса требуется инициализация, а у object её по-умолчанию нет, но это опять же, до тех пор пока там данных в нормальном количестве нет.

Поэтому еще раз говорю, что-то там не то с методикой. Код в студию.

Чтобы вопросов не возникало:

uses
SysUtils,
Windows;

type
Cls = class
a,b: integer;
end;

PObj = ^Obj;
Obj = object
private
a,b: integer;
end;

procedure AllocCls(count: integer);
var
i: integer;
begin
for i := 0 to Count - 1 do
Cls.Create;
end;

procedure AllocObj(count: integer);
var
i: integer;
o: PObj;
begin
for i := 0 to Count - 1 do
new(o);
end;

var
T1, T2, T3: Cardinal;
S1, S2, S3: Cardinal;
begin
T1 := GetTickCount;
S1 := GetHeapStatus.TotalAllocated;
AllocCls(10000000);
S2 := GetHeapStatus.TotalAllocated;
T2 := GetTickCount;
AllocObj(10000000);
S3 := GetHeapStatus.TotalAllocated;
T3 := GetTickCount;
writeln(Format("%d %d", [T2-T1, S2-S1]));
writeln(Format("%d %d", [T3-T2, S3-S2]));
readln;
end.

Результат (CoreDuo 6600 2.4 ГГц, RAM 2ГБ):
500 120000000
109 120000000

Памяти требуют оба варианта, что естественно для данного случая, одинаково, несмотря на разницу в размерах экземпляров. А чем разница во времени обусловлена - см. выше.

Но проблема в том, что нужно было объявить сам TObject в юните "system.pas", для чего и использовали ключевое слово языка Паскаль object

О как. Оказывается, object использовали для создания class. Вот так и возникают религии. Хвала всевышнему, объект придумавшему, ибо класс и экземпляр класса - суть порождение его. Во имя object, class и instance его! Аминь.

Я, наверное, еретик. бо у меня возник вопрос, откуда же в таком случае взялся сам object :0)

и если от record"а, то откуда взялся record? и так далее. )

to Virgo_Style © (04.03.07 12:29) [26]:
>откуда взялся record?
record был всегда :)

record придумал Вирт, а Вирта придумали мама с папой. выводы очевидны :)

хех
неужто настолько делать нефига людям что ещё не влом думать о такой архаике как object:)

> PEAKTOP © (03.03.07 19:03) [12]
расслабься. приведённый мной код -- цитата из system.pas. советую перед тем, как вещать, таки читать генофонд. ну и -- да, язык, о котором вещаешь, тоже выучить бы не помешало.

>>неужто настолько делать нефига людям что ещё не влом думать о такой архаике как object:)
что за наезды на обжект? фундаментальная штука. это класс придумка борланда, насколько помню в стандарте паскаля нет такого словечка:)

object - это отнюдь не архаика.

Во-первых, без слова object затруднительно определить callback типа

type
TForProgressBar = procedure(Current, Total: Integer) of object;

Это, ясное дело, очень мощное и "современное" средство, не реализованное, к примеру, в С++. Там аналог убогий.

Во-вторых, object позволяет создавать "интеллектуальные записи" (с методами), которые к тому же обладают свойством наследования. В некоторых диалектах С я встречал это свойство "наследования" с применением анонимных структур.

> просто так (04.03.07 14:07) [32]
я-таки скажу откровение: в том стандарте и object ни разу нет.


> я-таки скажу откровение: в том стандарте и object ни разу
> нет

да, точно ))), но класс развитие обжекта, причем не всегда удобное, и объявлять обжект устаревшим неправильно, для небольших структур данных он подходит гораздо больше чем класс

_uw_ (04.03.07 14:08) [33]
ну я не про все применения ключевого слова object, а именно про то применение которое оставлено для совместимости

в .NET структуры наделённые свойствами ООП юзаются порой в качестве "легковесных" объектов ибо для них в стеке память выделяется(то есть быстро) и освобождается быстро(а не когда GC соизволит)
в каком-то таком же смысле использования object-объектов возможно и может быть оправдано

Зарезервированные слова Delphi

var A, B : Integer; begin A:=3; B:=4; A:=A*A+B*B; end;

if (условие) then (действие) else (альтернатива) ;

Слова if (если), then (тогда), else (иначе) - зарезервированные. Действие и else альтернатива - это любые операторы Delphi, или несколько операторов, заключённых в логические скобки begin/end, или вызов подпрограммы. Если условие истинно, то выполняется действие, если ложно, то выполняется альтернатива.

(применяется, когда известно количество повторений цикла)

for счётчик := выражение-1 to выражение-2 do действие ;

Возможна работа оператора цикла, при котором переменная-счётчик будет не увеличиваться, а уменьшаться. В этом случае ключевое слово to заменяется на downto:

for счётчик := выражение-1 downto выражение-2 do действие ;

Цикл с предусловием (применяется, когда неизвестно количество повторений цикла)

while условие do тело цикла ;

Этот цикл будет выполняться до тех пор, пока истинно условие (логическое выражение, возвращающее значение типа Boolean). При этом если это выражение сразу равно false, тело цикла не будет выполнено ни разу. Нужно очень внимательно следить за написанием условия и контролем завершения цикла, так как в результате ошибки цикл while будет повторяться бесконечное количество раз, что приведёт к "зацикливанию" и "зависанию" программы.

Цикл с постусловием

(применяется, когда неизвестно количество повторений цикла)

repeat тело цикла until условие ;

Повторения сначала выполняет тело цикла, а затем уже проверяет выполнение условия: Таким образом, этот вариант цикла гарантирует, что тело цикла будет выполнен по крайней мере один раз. И будет выполняться до тех пор, пока условие не станет истинным (т.е. true). Стоит отметить, что это единственный оператор Delphi, в котором тело цикла не требуется заключать в логические скобки begin/end. Начало и конец тела цикла определяются по ключевым словам repeat и until.

Позволяет изменить последовательность выполнения программы. В качестве метки может использоваться любой допустимый идентификатор или число в диапазоне от 0 до 9999. Метку предварительно необходимо объявить в разделе описания переменных, но с помощью не ключевого слова var, а ключевого слова label:

Илон Маск рекомендует:  Работа с информацией на предприятиях
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL