Функции в Delphi


Содержание

Функции в Delphi

В этом уроке я расскажу вам об устройстве и применении процедур и функций в языке программирования Pascal/Delphi.

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

[cc lang=’delphi’]procedure shownumbers(n:integer);
var i:integer;
begin
for i:=1 to n do
showmessage(inttostr(i));
end;

procedure showsimplemessages;
begin
showmessage(‘This is a simple message 1!’);
showmessage(‘This is a simple message 2!’);
end;

procedure TForm1.OnCreate(Sender:TObject);
begin
shownumbers(5);
showsimplemessages;
end;[/cc]

Пока не будем изучать синтаксис, сначала разберемся с принципом работы процедур. Как вы уже наверное заметили, все события (например тот же OnCreate) представлены процедурами. Сначала изучим содержимое обработчика события создания формы Form1 (или точнее уже можно говорить — содержимое процедуры «procedure TForm1.OnCreate(Sender:TObject)»). Внутри этой процедуры мы видим «shownumbers(5);» и «showsimplemessages;» — это и есть вызов процедур, находящихся выше чем «procedure TForm1.OnCreate(Sender:TObject)». Как вы уже наверняка поняли, для того чтобы вызвать существующую процедуру, необходимо сначала указать ее название, а затем в скобках перечислить ее параметры. Если параметр один, то достаточно просто указать его значение. Также, процедуры могут не иметь параметров. В таком случае скобки можно опустить. Указывать сами параметры нужно в соответствующем им типе. Например строковые переменные «string» нужно указывать в кавычках ‘ ‘.

Теперь разберем синтаксис самой процедуры. В самом начале процедуры идет ключевое слово «procedure». Затем указывается имя процедуры, а после имени указываются параметры в скобках. Указываются они перечислением через «точку с запятой». Несколько однотипных переменных подряд можно указывать через запятую. На словах это понять достаточно трудно, поэтому приведу пример:

[cc lang=»delphi»]procedure example(a,b,c:integer; d:string; e:real; x1,y1:string);[/cc]

Затем, после объявления параметров процедуры, указывается программный код процедуры между ключевыми словами «begin» и «end» также, как это показано на первом примере. Перед «begin» можно также указать локальные переменные, создав новый раздел var. Эти переменные могут использоваться и обрабатываться только внутри самой процедурой, внутри которой они объявлены. Также внутри программного кода процедуры можно использовать параметры процедуры как обычные переменные указанного в процедуре типа. Только во время вызова процедуры, всем параметрам процедуры будет уже переданы соответствующие значения, указанные в вызове процедуры.

[warning]Очень важно при написании кода учитывать то, что сама процедура должна находиться выше в коде, чем то место где происходит ее вызов! Иначе может произойти ошибка, связанная с тем, что процедура попросту не будет найдена. [/warning]

[note]Любая процедура может вызвать любую другую процедуру, но только если вызываемая процедура стоит выше вызывающей ее процедуры.[/note]

[note]Внутри процедур можно обращаться к глобальным переменным и изменять их значения.[/note]

Надеюсь, что принцип работы процедур я достаточно вам объяснил. Теперь рассмотрим функции. Функции — это по сути те же процедуры, но только функции могут возвращать результат, т.е. какое-либо значение. Принцип устройства процедур можно очень легко понять на простом примере:

[cc lang=’delphi’]function calc(a,b,c:integer; d:string): integer;
begin
result:=length(d);
inc(a,5);
dec(b,2);
inc(result, a+b-c);
end;

procedure TForm1.OnCreate(Sender:TObject);
var a:integer;
begin
a:=calc(1,2,3,’testing’);
showmessage(‘Результат функции равен ‘+inttostr(a));
end;[/cc]

Кстати, в этом примере мы также разберем две новые процедуры и одну новую для вас функцию, уже предусмотренные в Pascal/Delphi. Эти процедуры — «inc(a;integer;b:integer)» и «dec(a:integer;b:integer)». Первая называется инкрементом, и увеличивает целочисленное число «a» на «б» единиц. Вторая процедура называется декрементом, и делает совершенно обратную операцию инкременту, а именно уменьшает целочисленное число «a» на «b» единиц. Если переменной «b» не указать значение, то вместо числа «b» автоматически будет использоваться единица. Таким образом «inc(a);» — тоже самое что и «inc(a,1);». В качестве «b» могут выступать и отрицательные числа, что приведет к инверсии операции, т.е. «inc(a,-3);» — тоже самое что и «dec(a,3);». Процедуры инкремента и декремента использовать несколько удобнее и работают они относительно быстрее чем присвоение «a:=a+1;».

[note]Функция «length(s:string):integer» подсчитывает количество символов в строке s и возвращает результат в виде целочисленной переменной.[/note]

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

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

[cc lang=’delphi’]function example: string;
begin
result:=’simple function’;
end;[/cc]

Вызов функции осуществляется через присвоение, так как это показано в примере. Параметры функции указываются точно так же как и у процедуры.

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

[note]Функции и процедуры могут вызывать сами себя. Такой прием программирования называется рекурсией и используются чаще всего в реализации каких-либо алгоритмов.[/note]

[note]Название процедур и функций может содержать только латинские буквы, цифры и знаки подчеркивания.[/note]

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

На этом наш урок подошел к концу. Если у вас возникли какие-либо вопросы, то смело задавайте их в комментариях.

Как написать функцию?

Задали задачу: Дано натуральное число P. Выбросите из записи числа P цифры 0, оставив прежним порядок прежних цифр.
Задачу необходимо решить через процедуру и через функцию. С процедурой вроде справился, а вот с функцией проблемы.
Подскажите, как написать функцию.

27.11.2020, 21:04

Как правильно написать эту Sx функцию ?
это при разложении ряда, не могу ее правильно написать

Как написать подобную функцию на Delphi
// из клиентских в игровые float GameX(float px) float GameY(float.

Как написать такую программу через процедуру/функцию
Вот готовый вариант без процедуры/функции Программа считает количество способов разложения числа.

Написать Функцию
Задание:Поток студентов сдавал один и тот же зачет в течении 5 дней. Не сумевшие сдать приходили на.

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

Математические функции в Дельфи

Математические функции описаны в модуле Math. Этот модуль должен быть подключен к приложению оператором uses.

Таблица математических функций в Delphi:

Функция

Описание

Аргумент

Abs (X)

абсолютное значение

целое и действительное

выражение

Ceil (X)

округление донаименьшего целого

Compare

Value (A, B) сравнение двух значений

целые и действительные

выражения

DivMod (Divided,

Divisor, Result,

Remainer) целочисленное деление:Result – результат,

Remainder – остаток

EnsureRange

(AValue,

Amin,Amax) возвращает ближайшеек Avalue в диапазоне

Amin — Amax

целые и действительные

выражения

Exp(X)

экспонента

выражение

Floor (X)

округление до наиб целого,меньшего или равного

аргумента

Frac (X)

дробная часть X-Unt(X)

Frexp(X, Mantissa,

Exponent) выделяет мантиссуи показатель степени 2

Int(X)

целая часть аргумента

выражение

IntPower(X,E)

возведение Xв целую степень E: X в степени Е

Integer

IsInfinite(X)

определяет, не равенли аргумент бесконеч

выражение

IsNan (X)

определяет, не равен лиаргумент Nan – нечисловой

величине


выражение

IsZero(X, Epsilon)

определяет, не явлли аргумент от нуля

менее чем на Epsilon

целые или действ

числа

Ldepx(X,P)

умножение X на 2 в степени Р

Integer

Ln(X)

натуральный логарифм (X)

выражение

LnXP1(X)

натуральный логарифм(X+1)

Log10(X)

десятичный логарифм от X

Log2(X)

логарифм от Xпо основанию 2

LogN (N,X)

логарифм от Xпо основанию N

Max(A,B)

максимум двух чисел

int64, Single, Double

Extended

Min(A,B)

минимум двух чисел

Pi

Poly(X,C)

вычисляет полином Xс массивом коэфф С

массив Double

Power (X, E)

Delphi 7, Вычисление заданной функции. (Урок 3)

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

Итак, задача: Создать программку, для вычисления функции. Используемкомпоненты Edit, Label, LabeledEdit, Button, BitBtn . Создать иконку, организовать изменение прозрачности формы (AlphaBlend). Задать изменение курсора над разными элементами формы(Cursor). Использовать подсказки (Hint). В случае ошибки вызываем соответствующее окошко (ShowMessage).

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

Илон Маск рекомендует:  Ссылки разъяснения

А вот и сама функция:

Глядя на форму, видно что использованы компоненты Edit , Label , LabeledEdit , Button , BitBtn и TrackBar.

Поле ввода Х и надпись сверху это 2 компонента Edit и Label , а Поле ввода К и надпись над ним это LabeledEdit . На мой взгляд, в подобных случаях LabeledEdit использовать разумнее.

Кнопка решить пример это компонент Button . Далее опять Edit и Label .

Кнопка Close закрывает программу, это BitBtn . Для этого компонента имеются несколько стандартных картинок, об этом позже.

В самом низу расположен Edit и TrackBar, с передвижением ползунка, прозрачность формы будет меняться.

Элементы Edit , Label , Button вы найдете на вкладке Standard :

Компоненты LabeledEdit и BitBtn на вкладке Additional :

Компонент TrackBar на вкладке Win 32:

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

Как ставить иконку и изменять название формы мы уже рассматривали в предыдущем уроке(начало работы в Delphi 7).

Меняем цвет формы. Выбираем форму, смотрим в Инспектор объектов. Находим там Color , жмем на выпадающий список и выбираем понравившийся цвет. Вот так все просто.

Что бы написать в Edit и LabelEdit свой произвольный текст выбираем нужный компонент, опять заглядываем в Инспектор объектов. В случае если вы выбрали Edit , просто ищите Caption и пишете нужный текст. Если же выбран LabelEdit , сначала необходимо найти EditLabel , кликнуть на плюсик, и в выпавших строчках найти Caption .

В общем говоря, что бы изменить текст на каком либо визуальном компоненте изменять следует атрибут Caption . К Button и BitBtn это тоже относится.

Ранее я говорил про некоторые встроенные возможности BitBtn . Вот сейчас пришло время показать, как ими пользоваться. Выделяем поставленный нами на форму BitBtn , в Инспекторе объектов ищем атрибут Kind , и там уже выбираем желаемую кнопочку.

Компонент получил большее распространение, так как в нем можно установить свою картинку.

Сделаем изменение курсора при наведении на разные компоненты. Комментарии наверно уже будут лишними:

Там же ищем атрибут Hint , пишем соответствующую элементу подсказку. А затем ищем ShowHint и устанавливаем значение True , если это не сделать подсказка не будет появляться при наведении курсора на компонент.

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

Сразу генерируются подобные строчки :

procedure TForm1.Button1Click(Sender: TObject);

Если вы изучали Turbo Pascal , а я на это очень надеюсь, тогда вас ничего не напугает.

Вставляем рабочий код, и все это будет выглядеть следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

if (edit1.text=») or (labelededit1.text=») then

messagedlg(‘Введены не все данные!’,mterror,[mbOK],0) ;

Программирование Delphi

Все о программировании.

Главное меню

Функции и процедуры

Краткий обзор как использовать различные типы процедур и функций Delphi, указателей на функции и процедуры, методы и указатели методов, анонимные методы.

Автономные процедуры

Более или менее все RTL процедуры — так называемые «автономные» процедуры. Они объявлены на уровне модулей и чтобы вызвать такую процедуру, Вы должны знать, где она объявлена (имя модуля и список параметров для передачи).

Пример — процедура ShowMessage, объявленная в модуле dialogs.pas, вот ее объявление:

Чтобы вызвать такую процедуру, Вы просто должны включить имя модуля, где объявлена эта процедура в раздел uses вызывающего модуля. Большинство общих модулей уже перечислено в пункте uses модуля формы, таким образом, Вы не должны вручную добавлять dialogs.pas, чтобы использовать ShowMessage.

Вложенные процедуры

Функции и процедуры иногда содержат другие функции и процедуры в пределах своих блоков:

Вышеупомянутые два типа объявления процедур не связаны с классом или объектом.

Методы

Процедуры, которые связаны с классом, называют методами. Большинство методов используют экземпляры класса — объекты. Некоторые методы, называемые методами класса, работают в классах.

Функция Add — метод класса TStringList. Например, метод Add объявляется как:

Процедурные типы и указатели процедур

Delphi позволяет обрабатывать подпрограммы (функции и процедуры) как значения, которые могут быть назначены переменным.

Рассмотрим отрывок кода:

В этом коде TDisplayerProc и TIntegerDisplayerFuncпроцедурные типы

Переменные dp и idp — указатели процедур. Обратите внимание, что функция DisplayDoubleInteger получает процедурный тип, как второй параметр (TDisplayerProc).

Указатели методов


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

Анонимные методы

Начиная с Delphi 2006, язык Delphi знает также анонимные методы.

Анонимный метод — процедура или функция, которая не связана с ассоциированным именем.

Пример анонимных методов: сортировка объекта TList.

Обучающий курс. 12. Функции и процедуры в Delphi. Математические вычисления. Случайные числа

Сегодня мы поговорим о процедурах и функциях в Delphi . Что такое процедура? Это маленькая программа, выполняющая операции с указанными данными. Различают собственно процедуры и функции. Их основное отличие — процедура просто совершает какие-либо операции, а функция обязательно выдаёт какой-либо результат в результате своей работы. Существует огромное количество стандартных процедур и функций. Подпрограммы (так называют процедуры и функции) можно писать и самостоятельно, но об этом речь пойдёт позже. Сейчас нам нужно научиться работать с готовыми функциями.

Общие сведения о подпрограммах

Фактически, подпрограмма — это такая же полноценная программа, просто работает она не отдельно, не сама по себе, а включена в другую программу.
У подпрограммы всегда есть имя. Имя строится по тем же правилам, что и идентифмкатор. Как правило, имена даются вполне логичные. Например, если функция находит максимальное из нескольких чисел, то её логично назвать Max .
Подпрограммы могут иметь входные параметры. Входные параметры — это данные, которые сообщаются подпрограмме до начала её работы, а в процессе выполнения эти данные могут использоваться. Тем не менее, подпрограммы могут и не иметь входных параметров. Входные параметры также называют аргументами. Например, функции, которая узнаёт текущее время, никакие дополнительные параметры не нужны, а вот если функция считает факториал, то обязательно должно быть число, для которого он считается.
Как было сказано выше, функция выдаёт какое-то значение в результате своей работы. Процедура в общем случае значения не выдаёт.

Вызов подпрограмм

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

Обратите внимание: работа с функциями происходит как с обычными переменными, просто их значения вычисляются «на лету».

Функции математических вычислений

Эти функции работают с числовыми данными. Как правило, входным параметром является какое-то число, а выходным — результат вычисления. Практически везде аргумент является либо целым числом ( Integer ), либо вещественным ( Real ). Возвращаемое значение — тоже число. Рассмотрим некоторые из этих функций:

Abs(x) — модуль (абсолютное значение) указанного числа x . Пример: Abs(-5) = 5 .

Sin(x) — синус числа x . Здесь x — угол в радианах (не в градусах!). Пример: Sin(Pi/2) = 1 .

Cos(x) — косинус числа x . Аналогично, x — радианы. Пример: Cos(Pi) = -1 .

Exp(x) — экспонента, e x ( e в степени x ).

Ln(x) — натуральный логарифм числа x . Пример: Ln(Exp(2)) = 2 .

Sqr(x) — квадрат числа x ( x 2 ). Пример: Sqr(5) = 25 .

Sqrt(x) — квадратный корень числа x . Пример: Sqrt(64) = 8 .

Int(x) — целая часть числа x . Пример: Int(1.234) = 1 .

Frac(x) — дробная часть числа x . Пример: Frac(1.234) = 0.234 .

Round(x) — округление аргумента до ближайшего целого числа. Пример: Round(1.234) = 1 .

Trunc(x) — целая часть вещественного числа x. Пример: Trunc(1.234) = 1 .

Pred(x) — предыдущее значение x (например, для x = 2 это 1 ).

Succ(x) — следующее значение x (для x = 2 это 3 ).

Odd(x) — проверка аргумента на нечётность. Функция возвращает значение True , если аргумент является нечётным числом и False — если чётным. Пример: Odd(5) = True .

Предсказываю вопрос: в чём отличие Int() от Trunc() ? А отличие в том, что Int() возвращает число вещественного типа, а Trunc() — целочисленного .

Это лишь часть всех доступных функций. На самом деле их гораздо больше. Но помимо функций есть ещё процедуры.

Процедуры работы с числами

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

Inc(x) — увеличение аргумента на единицу. Фактически, это то же самое, что x:=x+1 . Тем не менее, рекомендуется использовать именно эту функцию, так как работает она быстрее.
Примечание: под понятием «быстрее» подразумевается, конечно, быстрота «компьютерная». Компьютер выполняет миллионы операций в секунду и для человека такие вещи незаметны.

Inc(x,n) — увеличение аргумента на число n . Эквивалентно записи x:=x+n .

На самом деле, это не две разные процедуры — просто параметр n является необязательным. Да, бывают необязательные параметры, которые можно указать, а можно и не указывать. Если они отсутствуют, то просто берётся какое-то значение по умолчанию. В данном случае n по умолчанию имеет значение 1 .

Dec(x,n) — уменьшение аргумента на n единиц. Точно также, как и в Inc , параметр n является необязательным. Эквивалентно записи x:=x-n .

В документации необязательные параметры обычно заключают в квадратные скобки, т.е. обычно пишут Inc(x , [n]) . Обратите внимание: это лишь условное обозначение, которое создано с целью узнавания, что параметр необязательный. В программном коде никаких скобок нет и быть не может.

Не хватает стандартных математических функций?

Существует дополнительный модуль с именем Math , в котором содержится большое число математических функций. Например, если нужно посчитать гиперболический арксеканс числа, то мучаться и описывать способ его вычисления вручную не придётся — есть готовая функция ArcSecH() .
Чтобы подключить модуль Math , откройте исходный код модуля. Для этого, когда открыта форма, следует нажать F12 , либо выбрать пункт меню View » Toggle Form/Unit . Далее нужно переместиться в самое начала модуля в раздел uses . В этом разделе через запятую описываются имена подключённых модулей. Как можно заметить, даже при наличии пустой формы несколько модулей уже подключены. В этот список и следует добавить Math :

Илон Маск рекомендует:  Что такое код cgi

Всё, теперь в Вашем распоряжении большое количество математических функций.

Пример комбинирования функций

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

Нам нужно создать программу, которая бы вычисляла значение этой функции по заданным числам x и y . Рассмотрим поэтапно элементы функции:
1) Возведение числа e в степень, модуль — функции Exp() и Abs() соответственно.
2) Натуральный логарифм — функция Ln() .
3) Число e . Часто спрашивают — как получить число e ? Ведь это, по сути, такая же константа, как и число пи . Но она не объявлена. А ответ прост: e = e 1 , поэтому e — это exp(1) .
4) Тангенс — функция Tan() .
Всё необходимое у нас есть, поэтому можно приступить к записи. Главное — не забывать заключать в скобки отдельные элементы формулы, чтобы порядок действий сохранился (в нашем примере это не потребуется).

Как возвести число в степень?

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

Способ 1. X y можно преобразовать к виду e ln(x)⋅y . Тогда возведение в степень можно записать так:

Способ 2. В модуле Math есть функция для возведения в степень — Power . У функции 2 аргумента — основание и показатель степени. Запись, соответственно, следующая :=Power(x,y);

Случайные числа

Зачем нужны случайные числа? Как правило, чтобы проверить результаты какого-то эксперимента при различных условиях. На основе случайных чисел можно вычислять различные вероятности. Во всех языках программирования есть возможность использовать случайные числа.

В Pascal (и Delphi соответственно) случайные числа генерируются функцией Random . Функция принимает один параметр, да и тот необязательный. Этот параметр позволяет указать границу диапазона, из которого будет выбрано случайное число. Итак: Random([Range: Integer]) . Если Range указан, то число выбирается из диапазона 0 ( X — само случайное число, которое будет получено). Обратите внимание, что сама граница в диапазон не включается, т.е. Random(10) никогда не выдаст число 10 , хотя 0 — запросто. Если диапазон не указан, то он считается равным единице, т.е. 0 .

Пример. Создадим форму с кнопкой, но пусть кнопка каждую секунду изменяет своё положение. Воспользуемся таймером ( TTimer , вкладка System палитры компонент). Interval оставим без изменения ( 1 сек. ), а вот в обработчике запрограммируем произвольное изменение положения кнопки на форме. Разберёмся, что нам нужно:
1) Позиция кнопки на форме. Как Вы уже знаете, за положение отвечают свойства Left и Top , которые указывают положение левого верхнего угла кнопки относительно левого верхнего угла формы. Именно этим свойствам мы будем присваивать произвольные значения.
2) Каков будет диапазон для генерации случайных чисел? Очевидно, что кнопка не должна уйти за границы формы. Значит нам нужно подключить размеры самой формы, т.е. её высоту и ширину. В данном случае будем использовать не Width и Height , а ClientWidth и ClientHeight , так как в первые свойства входят заголовок и границы формы, а это лишние пиксели, за которые кнопка может вылезти. Однако и это ещё не всё — из этих размеров мы должны вычесть соответственно ширину и высоту самой кнопки, иначе она может частично скрыться за границами.
Пишем обработчик:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button1.Left := Random(ClientWidth-Button1.Width);
Button1.Top := Random(ClientHeight-Button1.Height)
end ;

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

Отчего это происходит? Дело в том, что числа, выдаваемые функцией Random() на самом деле не являются случайными — они псевдослучайны , т.е. наблюдается повторение. К счастью, решение есть — специальная процедура Randomize() инициализирует генератор случайных чисел, который выдаёт действительно случайные числа. Вызвать эту процедуру нужно всего один раз за время работы программы — обычно это делается при запуске (например, в событии OnCreate формы). Процедура не принимает никаких параметров. Вернёмся к нашему примеру:

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize
end ;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button1.Left := Random(ClientWidth-Button1.Width);
Button1.Top := Random(ClientHeight-Button1.Height)
end ;

Теперь кнопка будет прыгать совершенно по разным точкам при каждом запуске программы.

Кстати, можно дописать скобки к названию процедуры — от этого работа не изменится: Randomize; = Randomize(); А запись немного красивее (на мой взгляд).

Дополнительные возможности редактора кода

В редакторе кода есть одна очень хорошая вещь — после того, как написано имя процедуры или функции и открыта скобка, появляется подсказка со всеми параметрами, которые подпрограмма принимает. Более того, там же указаны и типы данных всех параметров. Попробуйте, к примеру, набрать Inc( и подождать секунду — появится подсказка:

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

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

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

Если после набора имени и скобки подсказка не появилась, то и при компиляции программы скорее всего возникнет ошибка. Причиной, по которой компилятор не смог найти указанную функцию или процедуру, может быть ошибка при наборе имени, либо модуль, в котором описана подпрограмма, не подключен.
Ошибки при компиляции появляются внизу окна редактора кода с указанием номера строки, где обнаружена ошибка и описанием самой ошибки.
Попробуем запросить процедуру Randomiz (например, мы случайно недописали букву » e » на конце):

Строка с ошибкой выделилась, а внизу появился её номер ( 28 ) и описание — Undeclared identifier (неописанный идентификатор).

Заключение

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

Функции в Delphi

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

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

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

Функции сообщений в Delphi

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

1. Функция MessageBox (Windows API)

Функция – отображает диалоговое окно с сообщением.

Синтаксис функции (Windows API):

function MessageBox (Wnd: HWND; lpText, lpCaption : PChar; uType : Cardinal) : integer;

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

Параметр hWnd – маркер (дескриптор) окна владельца, идентифицирует окно владельца окна сообщений. Если этот параметр НУЛЕВОЙ (ПУСТОЙ), окно сообщений не имеет никакого владельца.

Параметр ipText – указатель на строку, содержащую сообщение, с нулевым символом в конце. Текст сообщения может быть длинным, более чем 255 символов в случае необходимости.

Параметр ipCaption — заголовок, который появляется в области заголовка диалогового окна. Заголовки могут быть более длинными, чем 255 символов, из-за чего создается широкое окно сообщений.

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


Группа флажков, определяющая, какие кнопки появятся на окне сообщений

№ п.п. Описание
1 Окно сообщений содержит три кнопки: Abort, Retry, and Ignore.
2 Окно сообщений содержит одну кнопку: OK. Это значение по умолчанию.
3 Окно сообщений содержит две кнопки: OK и Cancel.
4 Окно сообщений содержит две кнопки: Retry and Cancel.
5 Окно сообщений содержит две кнопки: Yes и No.
6 Окно сообщений содержит три кнопки: Yes, No, и Cancel.

Функция MessageBox возвращает 0, если нет достаточного количества памяти, чтобы создать окно сообщений. Иначе она возвращает одно из следующих значений:

Возвращаемое значение функции Возвращаемое числовое значение функции Описание
1 IDOK 1 Пользователь выбрал кнопку OK.
2 IDCANCEL 2 Пользователь выбрал кнопку Cancel.
3 IDABORT 3 Пользователь выбрал кнопку Abort.
4 IDRETRY 4 Пользователь выбрал кнопку Retry.
5 IDIGNORE 5 Пользователь выбрал кнопку Ignore.
6 IDYES 6 Пользователь выбрал кнопку Yes.
7 IDNO 7 Пользователь выбрал кнопку No.

Группа флажков, определяющая, какие иконки отобразятся в окне сообщений

Илон Маск рекомендует:  Что такое код hw_api_error >count
Значения параметра Описание
1 MB_ICONEXCLAMATIONMB_ICONWARNING В окне сообщений появляется значок восклицательного знака
2 MB_ICONINFORMATIONMB_ICONASTERISK В окне сообщений появляется значок, состоящий из символа I нижнего регистра в круге.
3 MB_ICONQUESTION В окне сообщений появляется вопросительный знак в круге.
4 MB_ICONSTOPMB_ICONERRORMB_ICONHAND В окне сообщений появляется знак Stop

Группа флажков, указывающая на основную кнопку

Значения параметра 1 Первая кнопка — основная кнопка.
MB_DEFBUTTON2 3 Третья кнопка — основная кнопка.
MB_DEFBUTTON4
Значения параметра Описание
MB_APPLMODAL
MB_SYSTEMMODAL
MB_TASKMODAL

Кроме того, можно определить следующие флажки:

Значения параметра Описание
3 MB_RIGHT
5 MB_SETFOREGROUND
7 MB_SERVICE_NOTIFICATION

Пример (фрагмент программы по созданию диалогового окна сообщений):

2. Функция MessageBoxEx (Windows API)

Функция – отображает диалоговое окно с сообщением.

Синтаксис функции (Windows API):

function MessageBox (Wnd: HWND; lpText, lpCaption : PChar; uType : Cardinal; wLanguageId: Word) : integer;

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

$0409 English (United States);

$0407 German (Standard);

3. Функция MessageBox (класса TApplication, модуля Forms)

Синтаксис функции:

function MessageBox(const Text, Caption: PChar; Flags: Longint = MB_OK): Integer;

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

Результат выполнения программного кода

4. Функция MessageDlg (модуля Dialogs)

function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word;

Описание

Функция MessageDlg используется для создания окна сообщений и получения на него реакции пользователя.

Параметр Msg – текст сообщения.

Параметр DlgType – определяет тип окна сообщений. Предлагаются следующие их типы:

Значение Описание
3 mtInformation
5 mtCustom

Параметр Buttons определяет следующие типы кнопок:

TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp);

TMsgDlgButtons = set of TMsgDlgBtn;

Возвращаемое значение
mrOK
mrCancel
mrYes
mrNo
mrAbort
mrRetry
mrIgnore
mrAll
mrNoToAll
mrYesToAll
mrClose

Наборы кнопок также определены, как константы:

mbYesNoCancel = [mbYes, mbNo, mbCancel];

mbYesAllNoAllCancel = [mbYes, mbYesToAll, mbNo, mbNoToAll, mbCancel];

mbOKCancel = [mbOK, mbCancel];

mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];

mbAbortIgnore = [mbAbort, mbIgnore];

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

2. Если указывается набор кнопок, как константа, то писать нужно без скобок. Например, mbYesNoCancel.

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

Фрагмент программы по использованию функции MessageDlg

5. Функция MessageDlgPos (модуля Dialogs)

function MessageDlgPos(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Word;

Отображает диалоговое окно сообщения в указанных аппаратных координатах устройства. Другие параметры функции аналогичны параметрам функции MessageDlg.

6. Функция MessageDlgPosHelp (модуля Dialogs)

function MessageDlgPosHelp(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; const HelpFileName: string): Word;

Отображает диалоговое окно сообщения, справка которого предоставлена в именованном файле справки (HelpFileName) с номером раздела HelpCtx. Выводится на экран с координатами X,Y левого верхнего угла окна относительно левого верхнего угла экрана.

Функции в Delphi

Изучая доступную литературу по программированию, которую я нашел в Интернете, а также некоторые программы, я пришел к выводу, что программисты то ли не осознают, то ли не хотят напрягаться на эту тему, и всё делают, как в школе учили. Строят графики, как на бумаге. Тем самым умаляя возможности компьютера. Оставляя те же недостатки метода построения, и даже усугубляя их.
Во первых вывод на экран — это вывод на дискретный носитель. Этот факт почти никак не учитывается. В тексте будет пояснено.

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

unit Graf;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;
var
Form1: TForm1;

<$R *.dfm>
Function f(x:real):real;
begin
f:=2*Sin(x)*exp(x/5);
end;
// строит график функции
procedure GrOfFunc;
var
x1,x2:real; // границы изменения аргумента функции
y1,y2:real; // границы изменения значения функции
x:real; // аргумент функции
y:real; // значение функции в точке х
dx:real; // приращение аргумента

l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y
x0,y0:integer; // точка — начало координат
begin // область вывода графика
l:=10; // X — координата левого верхнего угла
b:=Form1.ClientHeight-20; //У — координата левого верхнего угла
h:=Form1.ClientHeight-40; // высота
w:=Form1.Width-40; // ширина
x1:=0; // нижняя граница диапазона аргумента
x2:=25; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента

// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]

y1:=f(x1); // минимум
y2:=f(x1); //максимум
x:=x1;
repeat
y := f (x);
if y y2 then y2:=y;
x:=x+dx; until (x >= x2);
// вычислим масштаб
my:=h/abs(y2-y1); // масштаб по оси Y
mx:=w/abs(x2-x1); // масштаб по оси X
x0:=1;
y0:=b-Abs(Round(y1*my)) ;
with form1.Canvas do
begin // оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
// построение графика
x:=x1; repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until (x >= x2);
end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
GrOfFunc; end;
// изменился размер окна программы

procedure TForm1.FormResize(Sender: TObject);
begin
// очистить форму
form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
end;
end.
Программа хорошо выводит графики, когда функция имеет как положительные, так и отрицательные значения. Причем весь график помещается в указанном прямоугольнике.

Теперь посмотрим, а сколько вычислений значений функции делает программа? В данном случае (25-0)/0.01=2500. Для любого прямоугольника вывода. Чем был обусловлен выбор шага dx? Скорее всего, непрерывностью линии графика. Который, кстати, так и остался прерывистым на некоторых участках, там, где функция меняется быстро. Борются с этим, уменьшая dx, причем чаще радикально — сразу в 10, и даже в 100 раз, доводя до 0.0001; меньше мне не приходилось встречать. А это 250000 вычислений функции. И графики все равно прерывистые. Благо компьютеры быстрые. Но вот если вычислять функцию, заданную неявно, то график будет строится помедленнее. Выберем прямоугольник вывода 600*400. Таким образом по горизонтали мы можем иметь только 600 значений. По оси У, соответственно, тоже. Вопрос: куда идут остальные 249400 результата вычислений? Часть идет на построение вертикальных отрезков прямых, соединяющих соседние ординаты, а львиную долю других поедает Round . Вот тебе и дискретный вывод. Отсюда вытекает, что функцию нужно считать в 600 точках, а отрезки вертикальных прямых можно нарисовать карандашом. И dx нужно выбирать в нашем случае (25-0)/600= 0,0416666. График получится самый качественный, какой только возможно получить. Затем, нет необходимости вычислять ее значение дважды .Можно раз, запомнив результат в массиве(Массив имеет размер не более разрешения монитора). В таких условиях скорость вывода не меняется.

Во-вторых, сам метод построения (вычисление значений функции с шагом dx) работает как фильтр, отсекая высокочастотные гармоники, т.е я хочу сказать, что если к функции f(x) добавить что-то вроде g(x)*sin(2*pi/dx*x), то результат вывода будет плачевным. Этот элемент никак не изменит предыдущий график. Хотя он может являться основным носителем информации о функции. И уж конечно очень непросто вывести на экран график дискретной функции (имеется в ввиду универсальными программами общего пользования, подобными приведенной). Если взять f(x)=2*Sin(x)*exp(x/5)+ exp(x*x)*sin(2*pi/dx*x), то данная программа второе слагаемое не заметит, хотя будет тратить время на расчет f(x)=2*Sin(x)*exp(x/5)* exp(x*x)*sin(2*pi/dx*x). А в этом случае график константы. Приведенная программа, как я упоминал, некорректно отобразит и его, но это же учебная программа. Поэтому претензий не предъявляем.

А вот если взять TAB MathGrapher 1.0 (распространена в Интернете) и просто ввести 5* Sin(200*pi*x), то мы получим чистый ноль. Вместо 5, понятно, можно написать любую функцию, да и вместо Sin(200*pi*x) любую периодическую с кратной частотой, и программа выдаст неверный график.

Это, как я уже писал, издержки метода построения. Как с этим бороться? Неэффективный и не исправляющий программу брать dx=0.0037 или что-то наподобие, тогда сложно будет подобрать период и натыкать автора(шутка). Очевидно, нужно, чтобы программа давала возможность рассматривать функцию на небольшом отрезке, с dx=(х2-х1)/w (ширина вывода в пикселях). Т.е. программа должна автоматически менять шаг с уменьшением отрезка. Что-то подобное я написал, в результате можно графическим методом решать умопомрачительные трансцендентные уравнения с точностью 10E-7 и выше за считанные минуты (х2, х1 нужно вводить вручную). Тем, кто над подобным не задумывался, код в руки, а пользователям хотелось бы порекомендовать: не берите программы, которые не меняют шаг. А то в ответственных случаях можно получить неверный график и попасть в затруднительное положение.

Построение графиков функций в Delphi

Компонент TChart может строить самые различные графики и диаграммы.

Рассмотрим задачу построения графика на примере синусоиды (y=sin(x)).

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

Местоположение промежуточных точек рассчитывается как положение предыдущей точки плюс некоторый интервал (шаг). Для первой промежуточной точки предыдущей точкой является граница диапазона.

Построим график синусоиды для диапазона от 0 до 2π.

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

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL