Ваше определение типа процедурного типа TFx несовместимо с методами объекта, включая TForm .
type
TFx = function(a: extended): extended;
TMx = function(a: extended): extended of object;
TFx совместимо с функциями первого класса, то есть функциями, объявленными на уровне модуля, а не как члены / методы класса.
TMx совместим с методами-членами (то есть, что означает " объекта " в объявлении.
A TFx и TMx не являются совместимыми типами, поскольку в то время как TFx является указателем на функцию, TMx является на самом деле TWO указатели: указатель на метод класса AND указатель на конкретный экземпляр этого класса.
С этой информацией, я думаю, вы сможете увидеть, что то, что вам может понадобиться, выглядит примерно так (для краткости только существенные отличия от вашего кода показаны):
type
TFx = function(x: extended): extended of object;
procedure TForm1.ObliczClick(Sender: TObject);
var
Wynik, h, xi: real;
i,n: word;
fn: TFx;
begin
n:=StrToInt(edPrzedzialy.Text);
h:=(StrToFloat(edDo.Text)-StrToFloat(edOd.Text))/n;
Wynik:=0;
if rb1.Checked then fn := f1
else if rb2.Checked then fn := f2
else if rb3.Checked then fn := f3;
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + fn(xi)*h;
end;
pnWynik.Caption:= FloatToStr(Wynik);
..
end;
В качестве альтернативы, поскольку ваши f1 , f2 и f3 на самом деле не обязательно должны быть методами-членами TForm (они делают не использовать никакие данные экземпляра) вы можете оставить объявление TFx как есть и просто переместить f1 , f2 и f3 за пределы класса и просто объявите их как функции первого класса в разделе реализации модуля:
Также обратите внимание, что в любом случае сам тип TFx также не требуется вне раздела реализации (в зависимости от опубликованного кода, хотя в более широком контексте это может быть не так) :
осуществление
type
TFx = function(x: extended): extended of object;
function f1(x: Extended): Extended;
begin
result:=sqr(x)+ 2;
end;
function f2(X: Extended): Extended;
begin
result:=3*x - 8;
end;
function f3(X: Extended): Extended;
begin
result:=sin(x) + Pi;
end;
procedure TForm1.ObliczClick(Sender: TObject);
var
Wynik, h, xi: real;
i,n: word;
fn: TFx;
begin
n:=StrToInt(edPrzedzialy.Text);
h:=(StrToFloat(edDo.Text)-StrToFloat(edOd.Text))/n;
Wynik:=0;
if rb1.Checked then fn := f1
else if rb2.Checked then fn := f2
else if rb3.Checked then fn := f3;
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + fn(xi)*h;
end;
pnWynik.Caption:= FloatToStr(Wynik);
..
end;