mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-25 14:29:13 +02:00
122 lines
3.3 KiB
ObjectPascal
122 lines
3.3 KiB
ObjectPascal
{ A demo of a moving chart }
|
|
program chartstrip;
|
|
|
|
uses xforms,xlib;
|
|
|
|
var
|
|
func : longint;
|
|
xx : double;
|
|
step : double;
|
|
|
|
form : PFL_FORM;
|
|
|
|
chartobj,sinobj,exitbut,stepobj : PFL_OBJECT;
|
|
|
|
procedure set_function(obj : PFL_OBJECT; arg : longint);cdecl;
|
|
begin
|
|
func := arg;
|
|
fl_clear_chart(chartobj);
|
|
xx := 0.0;
|
|
end;
|
|
|
|
procedure set_step(obj : PFL_OBJECT; arg : longint);cdecl;
|
|
|
|
begin
|
|
step := fl_get_slider_value(stepobj);
|
|
end;
|
|
|
|
{***********************************************}
|
|
|
|
procedure create_form_form;
|
|
|
|
var obj : PFL_OBJECT;
|
|
|
|
begin
|
|
form := fl_bgn_form(FL_NO_BOX,490,320);
|
|
obj := fl_add_box(FL_BORDER_BOX,0,0,490,320,'');
|
|
obj := fl_add_chart(FL_LINE_CHART,20,160,390,140,'');
|
|
chartobj := obj;
|
|
fl_set_object_dblbuffer(obj,1);
|
|
|
|
fl_bgn_group();
|
|
obj := fl_add_lightbutton(FL_RADIO_BUTTON,30,120,170,30,'sin(x)');
|
|
sinobj := obj ;
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
fl_set_object_callback(obj,PFL_CALLBACKPTR(@set_function),1);
|
|
obj := fl_add_lightbutton(FL_RADIO_BUTTON,30,90,170,30,'sin(2x)*cos(x)');
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
fl_set_object_callback(obj,PFL_CALLBACKPTR(@set_function),2);
|
|
obj := fl_add_lightbutton(FL_RADIO_BUTTON,30,60,170,30,'sin(2x)+cos(x)');
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
fl_set_object_callback(obj,PFL_CALLBACKPTR(@set_function),3);
|
|
obj := fl_add_lightbutton(FL_RADIO_BUTTON,240,120,160,30,'sin(3x)+cos(x)');
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
fl_set_object_callback(obj,PFL_CALLBACKPTR(@set_function),4);
|
|
obj := fl_add_lightbutton(FL_RADIO_BUTTON,240,90,160,30,'sin(x)^2 + cos(x)');
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
fl_set_object_callback(obj,PFL_CALLBACKPTR(@set_function),5);
|
|
obj := fl_add_lightbutton(FL_RADIO_BUTTON,240,60,160,30,'sin(x)^3');
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
fl_set_object_callback(obj,PFL_CALLBACKPTR(@set_function),6);
|
|
fl_end_group();
|
|
|
|
obj := fl_add_button(FL_NORMAL_BUTTON,150,20,140,30,'Exit');
|
|
exitbut := obj;
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
obj:= fl_add_valslider(FL_VERT_SLIDER,430,20,40,280,'');
|
|
stepobj := obj ;
|
|
fl_set_object_boxtype(obj,FL_BORDER_BOX);
|
|
fl_set_object_callback(obj,PFL_CALLBACKPTR(@set_step),0);
|
|
fl_end_form;
|
|
end;
|
|
|
|
{**********************************}
|
|
|
|
function next_step : double;
|
|
|
|
var res : double;
|
|
|
|
begin
|
|
res := 0.0;
|
|
case func of
|
|
1: res := sin(xx);
|
|
2: res := sin(2*xx)*cos(xx);
|
|
3: res := sin(2*xx)+cos(xx);
|
|
4: res := sin(3*xx)+cos(xx);
|
|
5: res := sin(xx)*sin(xx) + cos(xx);
|
|
6: res := sin(xx)*sin(xx)*sin(xx);
|
|
end;
|
|
xx := xx+step;
|
|
next_step:=res;
|
|
end;
|
|
|
|
function idle_cb (ex : PXEvent; d : pointer) : longint;
|
|
begin
|
|
fl_insert_chart_value(chartobj,1,next_step(),'',1);
|
|
end;
|
|
|
|
var obj : PFL_OBJECT;
|
|
|
|
begin
|
|
func:= 1;
|
|
xx:= 0.0;
|
|
step:= 0.15;
|
|
fl_flip_yorigin();
|
|
fl_initialize(@argc, argv, 'FormDemo', nil, 0);
|
|
create_form_form();
|
|
fl_set_chart_bounds(chartobj,-1.5,1.5);
|
|
fl_set_chart_maxnumb(chartobj,80);
|
|
fl_set_chart_autosize(chartobj,0);
|
|
fl_set_button(sinobj,1);
|
|
fl_set_slider_value(stepobj,0.15);
|
|
fl_set_slider_bounds(stepobj,0.0,0.4);
|
|
{$ifdef nevertrue}
|
|
fl_set_idle_delta(15);
|
|
{$endif }
|
|
fl_show_form(form,FL_PLACE_CENTER,FL_NOBORDER,'StripChart');
|
|
repeat
|
|
fl_insert_chart_value(chartobj,1,next_step(),'',1);
|
|
obj := fl_check_forms();
|
|
until obj = exitbut;
|
|
end.
|