Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 00:02   #1
crazyopex
 
Регистрация: 20.06.2011
Сообщений: 4
По умолчанию Делфи построение графика, Tchart

уважаемые делфисты помогите кто нить. Как избавиться от этого "@" спец знака или на чё его заменить. Чтобы не с помощью него указывалась ссылка, а с помощью процедурного типа в самой процедуре.
Говорю сразу я не сильно шарю в этом деле
вот исходник


Код:
unit Unit1;

interface                                                               

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Math,oleserver,Comobj;

type
  TForm1 = class(TForm)
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Chart1: TChart;
    Button1: TButton;
    Button2: TButton;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    GroupBox1: TGroupBox;
    Label5: TLabel;
    Edit5: TEdit;
    SaveDialog1: TSaveDialog;
    Series1: TLineSeries;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

    procedure RadioButton1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);



  private
    { Private declarations }
  public

    { Public declarations }
  end;

function fu1(const x:real):real;
function fu2(const x:real):real;
function fu3(const x:real):real;
type tfunction = function(const x:real):real;
type tprocedure = procedure(const tx,fx:real);
function doit1:pointer;
var
  Form1: TForm1;
  x0,x1,dx,dx0,a,b,x:real;

implementation



{$R *.dfm}
function doit1:pointer;
begin
try
  x0:=strtofloat(form1.Edit3.Text);
  x1:=strtofloat(form1.Edit4.Text);
  a:=strtofloat(form1.edit1.text);
  b:=strtofloat(form1.edit2.text);
  dx0:=strtoint(form1.edit5.Text);
except
x0:=1;
a:=1;
end;

if(form1.radiobutton1.Checked=true)then begin
 result:=@fu1;
end else
if(form1.radiobutton2.Checked=true)then begin
 result:=@fu2;
end else
if(form1.radiobutton3.Checked=true)then begin
 result:=@fu3;
end;

if(dx0=0)then exit;

if(x1=x0)then begin
x0:=x1-0.001;
x1:=x1+0.001;
dx0:=1;
end;

dx:=(x1-x0)/dx0;
x:=x0;
end;



function fu1(const x:real):real;
begin
 fu1:=a*sqr(x)+b;
end;

function fu2(const x:real):real;
begin
 fu2:=a*sin(x+b);
end;

function fu3(const x:real):real;
begin
 fu3:=a*exp(x+b);
end;

procedure TForm1.Button1Click(Sender: TObject);
var func:tfunction;
begin
form1.Chart1.Series[0].Clear;
@func:=doit1;
while ((x<=x0)and(x1<=x0))or((x<=x1)and(x1>=x0)) do begin
  form1.Chart1.Series[0].AddXY(x,func(x));
  x:=x+dx;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var func:tfunction; file1:textfile;
begin
savedialog1.Execute;
if(savedialog1.FileName='')then exit;
assignfile(file1,savedialog1.filename);
rewrite(file1);

@func:=doit1;
while ((x<=x0)and(x1<=x0))or((x<=x1)and(x1>=x0)) do begin
  writeln(file1,floattostr(x)+' '+floattostr(func(x)));
  x:=x+dx;
end;
closefile(file1);
end;


procedure TForm1.RadioButton1Click(Sender: TObject);
begin
button1.Click;

end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
button1.Click;

end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
button1.Click;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
button1.Click;

end;

end.

Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось dr.Chas; 23.06.2011 в 01:08.
crazyopex вне форума Ответить с цитированием
Старый 23.06.2011, 11:24   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Переделал так, вроде не накосячил, прога работает так же. (функи выкинул из интерфейсной части, они всё равно внутренние ) Маленький прикол при смене возвращаемого типа с pointer на tfunction был в том, что функция непараметрическая, вот и было несоответствие типов... я добавил неиспользуемый параметр
Код:
...
procedure FormCreate(Sender: TObject);
  end;

type tfunction = function(const x:real):real;
var Form1: TForm1;
  x0,x1,dx,dx0,a,b,x:real;

implementation

{$R *.dfm}

function fu1(const x:real):real;
begin
 result:=a*sqr(x)+b;
end;

function fu2(const x:real):real;
begin
 result:=a*sin(x+b);
end;

function fu3(const x:real):real;
begin
 result:=a*exp(x+b);
end;

function doit1(dummy : byte): tfunction ;
begin
try
  x0:=strtofloat(form1.Edit3.Text);
  x1:=strtofloat(form1.Edit4.Text);
  a:=strtofloat(form1.edit1.text);
  b:=strtofloat(form1.edit2.text);
  dx0:=strtoint(form1.edit5.Text);
except
x0:=1;
a:=1;
end;
if(form1.radiobutton1.Checked=true)then begin
 result:=fu1;
end else
if(form1.radiobutton2.Checked=true)then begin
 result:=fu2;
end else
if(form1.radiobutton3.Checked=true)then begin
 result:=fu3;
end;
if(dx0=0)then exit;
if(x1=x0)then begin
x0:=x1-0.001;
x1:=x1+0.001;
dx0:=1;
end;
dx:=(x1-x0)/dx0;
x:=x0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var func:tfunction;
begin
form1.Chart1.Series[0].Clear;
func:=doit1(0);
while ((x<=x0)and(x1<=x0))or((x<=x1)and(x1>=x0)) do begin
  form1.Chart1.Series[0].AddXY(x,func(x));
  x:=x+dx;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var func:tfunction; file1:textfile;
begin
savedialog1.Execute;
if(savedialog1.FileName='')then exit;
assignfile(file1,savedialog1.filename);
rewrite(file1);
func:=doit1(0);
while ((x<=x0)and(x1<=x0))or((x<=x1)and(x1>=x0)) do begin
  writeln(file1,floattostr(x)+' '+floattostr(func(x)));
  x:=x+dx;
end;
closefile(file1);
end;
...

Последний раз редактировалось phomm; 23.06.2011 в 11:27.
phomm вне форума Ответить с цитированием
Старый 23.06.2011, 14:38   #3
crazyopex
 
Регистрация: 20.06.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Переделал так, вроде не накосячил, прога работает так же. (функи выкинул из интерфейсной части, они всё равно внутренние ) Маленький прикол при смене возвращаемого типа с pointer на tfunction был в том, что функция непараметрическая, вот и было несоответствие типов... я добавил неиспользуемый параметр
Код:
...
procedure FormCreate(Sender: TObject);
  end;

type tfunction = function(const x:real):real;
var Form1: TForm1;
  x0,x1,dx,dx0,a,b,x:real;

implementation

{$R *.dfm}

function fu1(const x:real):real;
begin
 result:=a*sqr(x)+b;
end;

function fu2(const x:real):real;
begin
 result:=a*sin(x+b);
end;

function fu3(const x:real):real;
begin
 result:=a*exp(x+b);
end;

function doit1(dummy : byte): tfunction ;
begin
try
  x0:=strtofloat(form1.Edit3.Text);
  x1:=strtofloat(form1.Edit4.Text);
  a:=strtofloat(form1.edit1.text);
  b:=strtofloat(form1.edit2.text);
  dx0:=strtoint(form1.edit5.Text);
except
x0:=1;
a:=1;
end;
if(form1.radiobutton1.Checked=true)then begin
 result:=fu1;
end else
if(form1.radiobutton2.Checked=true)then begin
 result:=fu2;
end else
if(form1.radiobutton3.Checked=true)then begin
 result:=fu3;
end;
if(dx0=0)then exit;
if(x1=x0)then begin
x0:=x1-0.001;
x1:=x1+0.001;
dx0:=1;
end;
dx:=(x1-x0)/dx0;
x:=x0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var func:tfunction;
begin
form1.Chart1.Series[0].Clear;
func:=doit1(0);
while ((x<=x0)and(x1<=x0))or((x<=x1)and(x1>=x0)) do begin
  form1.Chart1.Series[0].AddXY(x,func(x));
  x:=x+dx;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var func:tfunction; file1:textfile;
begin
savedialog1.Execute;
if(savedialog1.FileName='')then exit;
assignfile(file1,savedialog1.filename);
rewrite(file1);
func:=doit1(0);
while ((x<=x0)and(x1<=x0))or((x<=x1)and(x1>=x0)) do begin
  writeln(file1,floattostr(x)+' '+floattostr(func(x)));
  x:=x+dx;
end;
closefile(file1);
end;
...
Спасибо всё идеально работает без @
crazyopex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
построение графика зависимости с использованием TChart по значениям из dbgrid redneckoder Помощь студентам 2 04.06.2011 15:09
tchart построение графика с неподвижными осями p1r2o3 Компоненты Delphi 3 29.04.2011 10:49
Построение графика в TChart по данным из DBgrid Dogmat-iGwt Помощь студентам 1 27.03.2011 21:00
Построение графика в Tchart данными из StringGrid nickRUS Помощь студентам 2 27.03.2011 14:14
Чтение файла в массив и построение графика TChart, floating point overflow А здесь смотрели? vitalyisaev2 C++ Builder 1 09.11.2010 21:36