Создание собственных функций с несколькими результатами делфи. Функции Delphi

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

Скобки

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

Form1.Show;
Form1.Show();

Возможность перегрузки

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

Procedure Test (I: integer); overload;
procedure Test (S: string); overload;
procedure Test (D: double); overload;

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

Передача параметров

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

Procedure Test(s: string);

При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.

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

Передача параметров по ссылке
Pascal позволяет также передавать параметры в функции или процедуры по ссылке - такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции.

Procedure ChangeMe(var x: longint);
begin
x:= 2; // Параметр х изменен вызванной процедурой
end;

Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение.

Передача параметров констант
Если нет необходимости изменять передаваемые функции или процедуре данные, можно описать параметр как константу. Ключевое слово const не только защищает параметр от изменения, но и позволяет компилятору сгенерировать более оптимальный код передачи строк и записей. Вот пример объявления параметра-константы:

Procedure Test(const s: string);

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

Function AddEmUp(A: array of integer): integer;

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

Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf.

Object Pascal также поддерживает тип array of const, который позволяет передавать в одном массиве данные различных типов. Синтаксис объявления функций или процедур, использующих такой массив для получения параметров, следующий:

Вызвать объявленную выше функцию можно, например, с помощью такого оператора:

Procedure WhatHaveIGot(["Text", 10, 5.5, @WhatHaveIGot, 3.14, true, "c"]);

При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:

PVarRec = ^TVarRec;
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;

Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно приведенных значений.

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

Procedure WhatHaveIGot(A: array of const);
var
i: integer;
TypeStr: string;
begin
for i:= Low(A) to High(A) do
begin
case A[i].VType of
vtInteger: TypeStr:= "Integer";
vtBoolean: TypeStr:= "Boolean";
vtChar: TypeStr:= "Char";
vtExtended: TypeStr:= "Extended";
vtString: TypeStr:= "String";
vtPointer: TypeStr:= "Pointer";
vtPChar: TypeStr:= "PChar";
vtObject: TypeStr:= "Object";
vtClass: TypeStr:= "Class";
vtWideChar: TypeStr:= "WideChar";
vtPWideChar: TypeStr:= "PWideChar";
vtAnsiString: TypeStr:= "AnsiString";
vtCurrency: TypeStr:= "Currency";
vtVariant: TypeStr:= "Variant";
vtInterface: TypeStr:= "Interface";
vtWideString: TypeStr:= "WideString";
vtInt64: TypeStr:= "Int64";
end;
ShowMessage(Format("Array item %d is a %s", ));
end;
end;

Значения параметров по умолчанию

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

Procedure HasDefVal(s: string; i: integer = 0);

Подобное объявление означает, что процедура HasDefVal может быть вызвана двумя путями. В первом случае - как обычно, с указанием обоих параметров:

Procedure HasDefVal("Hello", 26);

Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию:

Procedure HasDefVal("Hello");

При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах:

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

Function Add(I1, I2: integer): integer;
begin
Result:= I1 + I2;
end;

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

Function Add(I1, I2: integer; I3: integer = 0): integer;
begin
Result:= I1 + I2 + I3;
end;

Директива {$X-}

Директива {$X-} запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен ({$X+}). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора {$X-}.

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

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

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

200?"200px":""+(this.scrollHeight+5)+"px");">function MyFirstFunction1: Integer;
var
i:Integer; //Объявление локальной переменной
begin
i:=10; //Присваиваем переменной значение
Result:=i; //Возвращаем значение
end;


Здесь объявляется функция function MyFirstFunction1: Integer, которая будет возвращать значение типа integer(целое число). Тип возвращаемого функцией значения указывается после имени и двоеточия. Для возврата значения, его нужно присвоить переменной Result, так как это делается в приведенном примере.
Вызов функции осуществляется следующим образом:

200?"200px":""+(this.scrollHeight+5)+"px");">ProcedureTForm1.MyFirstFunction2;
var
x:Integer;
begin
x:= MyFirstFunction1; //Вызываем функцию MyFirstFunction1, написанную ранее
end;


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

200?"200px":""+(this.scrollHeight+5)+"px");">functionMyFirstFunction1(index:Integer):Integer;
begin
Result:=index*2; // Возвращаем переданное значение index умноженное на 2
end;


Как показано в примере, после имени функции в скобках указывается тип переменной, который можно передать внутрь ее или процедуры. В данном случае это переменная index типа integer. После скобок указывается двоеточие и тип возвращаемого значения. Здесь возвращается значение также типа integer.
Что же будет возвращать наша функция? Результат ее выполнения можно записывать в Result или присваивать самому имени функции. В приведенном примере переменной Result присваивается результат вычисления выражения index*2. Эта переменная нигде не описана, но она зарезервирована как переменная, возвращающая значения из функции, и она всегда имеет тип возвращаемого значения функции. Результат можно присваивать и имени функции. Как все это будет выглядеть, показано в нижеприведенном листинге.

200?"200px":""+(this.scrollHeight+5)+"px");">function MyFirstFunction1(index:Integer):Integer;
begin
MyFirstFunction1:=index*2; // Возвращаю переданное значение index умноженное на 2
end;


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

200?"200px":""+(this.scrollHeight+5)+"px");">procedure TForml.MyFirstFunction2;
var
x:Integer;
begin
x:=MyFirstFunction1(20); //Вызываем процедуру MyFirstFunction1, написанную ранее
end;


Здесь в функцию MyFirstFunction1 передается значение 20, а она в свою очередь вернет 20 умноженное на 2, и таким образом мы получим 40.
Все рассмотренные примеры оперировали функциями. Однако точно так же можно поступать и с процедурами, передавая им значения.
Процедуры и функции - это практически одно и то же. Разница только в том, что функции умеют возвращать значения. С этим мы уже знакомы из теории, но теперь увидели и на реальных примерах.

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

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

Фактически, подпрограмма - это такая же полноценная программа, просто работает она не отдельно, не сама по себе, а включена в другую программу.
У подпрограммы всегда есть имя. Имя строится по тем же правилам, что и идентифмкатор. Как правило, имена даются вполне логичные. Например, если функция находит максимальное из нескольких чисел, то её логично назвать 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 :

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

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

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

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

var f,x,y: Real;

f:= Exp(Abs(x-y))+Ln(1+Exp(1))*Tan(Pi-7);

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

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

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

:= Exp(y * Ln(x));

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

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

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

Когда то выполнял лабораторные работы 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 поставить на форму, какой либо компонент, надо кликнуть по нему на панели компонентов, затем кликнуть по месту на форме где хотите его установить. Визуальные компоненты можно растягивать в произвольные размеры.

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

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

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

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

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

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

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

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

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

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

begin

end;

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

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

procedure TForm1.Button1Click(Sender: TObject);

X,k,w,y:real ;

Label q;

begin

If (edit1.text="") or (labelededit1.text="") then

messagedlg("Введены не все данные!",mterror,,0) ;

goto q;

End;

X:=strtofloat(edit1.text);

K:=strtofloat(labelededit1.text);

If(x<>0) then

Begin

Y:=(((x+2.7e-3*k)/x)-4.5)*sqr(((x+2.7e-3*k)/x)-4.5);

W:=(x*y+cos(k*sqr(k)))*sqr(sin(x))*sqr(sin(x));

Edit2.Text:=floattostr(w);

Else showmessage(" Данное выражение не имеет смысла!") ;

Теперь займемся ползунком для изменения прозрачности формы. За прозрачность отвечает атрибут AlphaBlend, устанавливаем у него значение True , затем если есть желание задаем начальную прозрачность формы от 0 до 255, при 0 прозрачность 100%, т.е. форму вы не увидите вообще.

В редакторе кода к компоненту TrackBar пишем вот такую вещь:

form1.AlphaBlendValue:=255-10*form1.trackbar1.Position;

Учитывая, что стандартный TrackBar имеет 10 делений, если вы ничего не меняли, то прозрачность мы можем менять только на 100 единиц.

Опишу немного TrackBar. На картинке LineSize – шаг при нажатии клавиш вверх/вниз, Max – значение последнего деления, Min – значение первого деления, Orientation – расположение (горизонтальное или вертикальное), PageSize – шаг при однократном щелчке по полю ползунка, Position – Начальная позиция ползунка.

В общем-то, все, есть один недочет, при наборе букв вместо чисел, вылетает ошибка. Ну, это вполне нормально, проверку ввода чисел и букв рассмотрим в следующий раз.

Bluetooth